2015-02-09 2 views
-5

Я пишу простую консольную игру rpg, что я буду развивать сверхурочную работу с графикой и т. Д. Но сейчас у меня проблема с моими делами. ..while цикл. Я часто их не использую, но я думал, что это хорошо для этой необходимости. В принципе, у меня открытая история, затем я даю пользователю четыре варианта, которые они могут ввести, нажав либо «1», «2», «3», либо «4». Если пользователь вводит что-либо еще, должно отображаться сообщение и разрешать пользователю вводить правильный ввод. Мой код выглядит следующим образом:Do ... while цикл продолжает цикл, даже когда условие не выполняется

int action; // Used to determine what the user wants to do. 
cout << "Story goes here\n\n"; 
cout << "What would you like to do? (1/2/3/4)\n\n"; 
cout << "1. Do this\n"; 
cout << "2. Do that\n"; 
cout << "3. Do this that\n"; 
cout << "4. Party\n\n"; 

cin >> action; 

do 
{ 
    switch (action) 
    { 
    case 1: 
     cout << "1\n"; 
     break; 
    case 2: 
     cout << "2\n"; 
     break; 
    case 3: 
     cout << "3\n"; 
     break; 
    case 4: 
     cout << "4\n"; 
     break; 
    default: 
     cout << "I'm sorry, but I'm not sure what you want to do. Please tell me again using the corresponding number. (1/2/3/4)\n\n"; 
     cin >> action; 
     break; 
    } 
} while ((action != 1) || (action != 2) || (action != 3) || (action != 4)); 
system("pause"); 

Теперь я проверил, что произойдет, если я типа 5 или 6, он отображает сообщение по умолчанию и позволяет мне попробовать еще раз, однако, если я типа 1, 2, 3, или 4 он переходит в коммутатор и продолжает выводить номер, который у меня распечатывается. И это никогда не заканчивается. Я использую C++ с MS Visual Studio 2013 Express.

Я также использовал отладчик, и он говорит, что действие равно 2 (или любой другой номер, который я нажимаю), и он продолжает запускать цикл. Я не знаю, почему это происходит.

+0

Ошибка вашего логического условия - измените все '||' на '&&'. –

+1

Подумайте о том, какое условие будет оценивать, если 'action', скажем,' 2'. – juanchopanza

ответ

0

вместо "или" состояние Try "и" состояние будет решить проблему

2

изменения

while ((action != 1) || (action != 2) || (action != 3) || (action != 4)); // (1) 

в

while ((action != 1) && (action != 2) && (action != 3) && (action != 4)); // (2) 

Анализ:

если action == 1

(1) будет оценивать с

while(false || true || true || true) 

=>

while (true) 

(2) будет оценивать с

while(false && true && true && true) 

=>

while (false) 
+0

Также проверьте успех на 'cin >> action', иначе он будет постоянно использовать последнее успешно введенное значение. Простым способом сделать это будет 'while (cin && (action! = 1) &&' ... –

0

Это довольно неуклюжий, так как вам нужно проверить условия дважды. (Ваша конкретная проблема в логическом тесте неверна: вам нужно &&, а не ||).

Рассмотрим, используя функцию вместо того, чтобы с проверкой построен в:

int getAction(void) 
{ 
    for (;;)/*infinite loop idiom*/{ 
     int action; /*scope as local as possible*/ 
     cin >> action; 
     if (action >=1 || action <= 4){ 
      return action; /*this is ok, so return*/ 
     } 
     cout << "I'm sorry, but I'm not sure what you want to do. Please tell me again using the corresponding number. (1/2/3/4)\n\n"; 
    } 
} 
0

Он только остановился в умолчанию, потому что вы задаёте и назначение действий.

Вы должны действительно инициализировать действие перед циклом. После того, как действие было назначено 1, 2, 3, 4, он будет работать навсегда, поскольку это то, что говорит код. Вы никогда больше не меняете его значение, поэтому оператор while продолжает вращаться.

В ваших заявлениях о состоянии вам необходимо выполнить любое действие, и если вы хотите выйти из цикла, добавьте флаг для выхода в то время. Break просто отмечает конец оператора case, чтобы остановить его выполнение в следующем.

Смежные вопросы