我正在编写一个简单的rpg控制台游戏,我将使用图形等开发加班。但是现在我遇到了我的问题... while循环问题。我不经常使用它们,但我认为这对于这种必要性是好的。基本上,我有一个开场故事,然后我给用户四个选项,他们可以通过按“1”,“2”,“3”或“4”输入。如果用户键入其他内容,则应显示消息,并允许用户键入正确的输入。我的代码如下:
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,它会进入交换机并继续输出打印出来的号码。它永远不会结束。我在MS Visual Studio 2013 Express中使用c ++。
我也使用了调试器,它表示动作等于2(或者我按下的任何数字)并继续运行循环。我不确定为什么会这样。
答案 0 :(得分:3)
变化
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)
=&GT;
while (true)
(2)将评估为
while(false && true && true && true)
=&GT;
while (false)
答案 1 :(得分:1)
这非常笨拙,因为您基本上必须两次测试条件。 (您的具体问题是布尔测试不正确:您需要&&
而不是||
。)
考虑使用函数而不是内置验证:
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";
}
}
答案 2 :(得分:0)
代替“或”条件尝试“和”条件 它会解决你的问题
答案 3 :(得分:0)
它只是在默认情况下暂停,因为您要求输入和分配操作。
你应该在循环之前初始化动作。一旦分配了动作1,2,3,4,它将永远循环,因为这就是代码所要做的。你永远不会再改变它的值,所以while语句一直在旋转。
在你的case语句中,你需要做任何需要的操作,如果你想退出循环,在while上添加一个退出标志。 Break只是标记case语句的结尾,以阻止它运行到下一个语句。