2017-01-22 3 views
2

Я занимаюсь разработкой «Udemy - Learn to Code на C++ путем разработки вашей первой игры», нереального базового курса C++, и в этом курсе вы разрабатываете небольшую игру, в которой пользователь пытается угадать слово.Очистка нескольких операторов if C++

Код отлично работает. Но я хотел добавить к этому. Я создал код ниже, и он отлично работает. Но это UGGGGLLLY. И поскольку я все еще нахожусь на ранней стадии обучения, я хотел начать развивать правильные привычки.

Итак, вопрос в том, как сделать все это. Если утверждения уходят или конденсируются. Если я хочу добавить еще 50 слов, я не хочу создавать еще 50 операторов if.

Я попытался изменить ISecret на FString и использовать это число, чтобы получить номер из HIDDEN_WORD [1], но он не работал так, как планировалось.

Вот что я имею в виду:

ISecret[1-100] = MyHiddenWord[1-100] = HIDDEN_WORD[1-100] 

Я знаю, что это не будет работать, и я знаю, что я должен перечислить «слова» в банке, но я могу создать текстовый банк и только список все слова в банке?

int32 ISecret;    //This section generates a 
    srand(time(NULL));  // random number between 1 and 10. 
    ISecret = rand() % 10, 1;/// 

    const FString HIDDEN_WORD01 = "planet"; 
    const FString HIDDEN_WORD02 = "bait"; 
    const FString HIDDEN_WORD03 = "dog"; 
    const FString HIDDEN_WORD04 = "cat"; 
    const FString HIDDEN_WORD05 = "stream";/// These are the Hidden words 
    const FString HIDDEN_WORD06 = "taco"; 
    const FString HIDDEN_WORD07 = "ship"; 
    const FString HIDDEN_WORD08 = "balcony"; 
    const FString HIDDEN_WORD09 = "tail"; 
    const FString HIDDEN_WORD10 = "barf"; 

     if (ISecret == 1){MyHiddenWord = HIDDEN_WORD01;} 
    else if (ISecret == 2){MyHiddenWord = HIDDEN_WORD02;} 
    else if (ISecret == 3){MyHiddenWord = HIDDEN_WORD03;}// These make is so 
    else if (ISecret == 4){MyHiddenWord = HIDDEN_WORD04;}//what ever number 
    else if (ISecret == 5){MyHiddenWord = HIDDEN_WORD05;}//is randomly 
    else if (ISecret == 6){MyHiddenWord = HIDDEN_WORD06;}//generated that 
    else if (ISecret == 7){MyHiddenWord = HIDDEN_WORD07;}//the correct 
    else if (ISecret == 8){MyHiddenWord = HIDDEN_WORD08;}//HIDDEN_WORD 
    else if (ISecret == 9){MyHiddenWord = HIDDEN_WORD09;}//is chosen. 
    else if (ISecret == 10){MyHiddenWord = HIDDEN_WORD10;} 
+1

*** ISecret = рандов()% 10, 1; *** Что вы имеете в виду делать здесь с запятой? – drescherjm

+3

Почему бы вам просто не использовать массив 'FString'? Тогда это просто 'MyHiddenWord = HidenWordArray [ISecret - 1];' – PaulMcKenzie

+0

Есть и другие вещи, которые вы должны рассмотреть. Каждый раз, когда добавляется новое слово, вы должны изменить свой код - это неудобно, так как вам нужно перестроить свое приложение.Вместо этого подумайте о том, чтобы прочитать слова из внешнего файла в 'std :: vector' или аналогичный контейнер, тогда не будет никаких изменений кода, если количество слов будет увеличено (или уменьшено). – PaulMcKenzie

ответ

5

Во-первых,

ISecret = rand() % 10, 1; 

неправильно. Этот оператор эквивалентен ISecret = rand() % 10;, и 1 не имеет эффекта (это должно вызывать предупреждение компилятора).

Если вы хотите случайное число в диапазоне [1, 10] (включительно), то вы должны сделать:

ISecret = rand() % 10 + 1; 

Чтобы выбрать слово для заданного числа, самый простой способ, вероятно, массив:

const FString hidden_word[] = { 
    "planet", 
    "bait", 
    "dog", 
    "cat", 
    "stream", 
    "taco", 
    "ship", 
    "balcony", 
    "tail", 
    "barf" 
}; 
ISecret = rand() % 10; // a number between 0 and 9 
MyHiddenWord = hidden_word[ISecret]; 
+0

Это работало так, как будто я хотел его !!! +1 – Melsy

+0

Обратите внимание, что '' std :: array' также можно использовать вместо необработанного массива. –

+0

Стоит отметить, что массивы C++ основаны на 0, поэтому генерация случайных ранмеров между «1-10», а не «0-9» может привести к ошибкам в решении на основе массива, если дополнительное внимание не уделяется, чтобы вычитать каждый время, в которое индексируется массив. –

7

Вы можете хранить их в std::array:

#include<array> 

const std::array<FString, 10> hidden_words = 
{ 
    "planet", 
    "bait", 
    "dog", 
    "cat", 
    "stream", 
    "taco", 
    "ship", 
    "balcony", 
    "tail", 
    "barf" 
}; 

int main() 
{ 
    int ISecret = 0; 
    std::cout<<hidden_words[ISecret]<<std::endl; 
} 

Или в std::vector<Fstring>

В общем, если вы планируете провести различие между каждым элементом, используя целое число может быть полезно для хранения элементов в массиве.

+0

Согласно намерениям OP, 'hidden_words [ISecret-1]' будет в порядке. – songyuanyao

+0

Даже проще (и, вероятно, быстрее), что-то вроде: 'FString hidden_words [] = {" planet "," bait ", ...};' –

+0

@AndrewHenle В общем случае 'std :: array' должен быть предпочтительнее сырых массивов , [std :: array vs array performance] (http://stackoverflow.com/a/30263398/3309790) – songyuanyao