所以基本上我今天已经在这个循环中工作了大约7个小时。它的行为并不像我认为的那样。当我使用cin进入失败状态时(行是一个char,列是一个int,所以如果我输入aa1而不是a1),它会在请求新的coord之前两次cout invalidCoord。
do
{
confirmShot = false;
validShot = false;
failShot = false;
cout << enterCoord;
cin >> row >> column;
if (cin.fail())
{
cin.clear();
cout << invalidCoord << endl;
failShot = false;
continue;
}
if (failShot == true)
{
row = toupper(row);
xCoord = column - 1;
yCoord = static_cast<int>(row - 'A');
if(xCoord > 9 || xCoord < 0 || yCoord > 9 || yCoord < 0)
{
cout << invalidCoord << endl;
validShot = false;
}
else
{
validShot = true;
}
}
else
{
continue;
}
currentTile = tileToSymbol(computerBoard[xCoord][yCoord]);
if (validShot == true)
{
switch(currentTile)
{
case '~':
case 'a':
case 'b':
case 's':
case 'd':
case 'p':
cout << "You have already shot at " << row << column << "." << '\n'
<< "Please pick a new coordinate!" << endl;
validShot = false;
confirmShot = false;
break;
default:
confirmShot = true;
}
}
else
{
continue;
}
}
while(!confirmShot);
输出:
Your shot: Enter the coordinates for a shot (e.g. B2) cc2
Invalid coordinates!
Pick a row value between A and J
and a column value between 1 and 10.
Enter the coordinates for a shot (e.g. B2) Enter the coordinates for a shot (e.g. B2) cc2
Invalid coordinates!
Pick a row value between A and J
and a column value between 1 and 10.
Enter the coordinates for a shot (e.g. B2) Enter the coordinates for a shot (e.g. B2) c2
Enter the coordinates for a shot (e.g. B2) c2
此外,我无法弄清楚如何让do ... while循环退出。在我意识到如果有人输入非整数作为第二个字符时我必须处理failstate之前,它常常退出。
我添加了&#34;继续&#34;代码,因为我正在谈论的人说我需要它跳到下一部分,如果我删除它,程序锁定,虽然在我尝试处理failstate之前我没有继续代码,并且它工作很好。
我真的需要让这个循环正常工作,但我已经耗尽了我的能力。如何处理failstate,将invalidCoord保持显示两次(老实说我不知道为什么会这样做),在收到有效条目后退出循环,并保存一天?
答案 0 :(得分:1)
我可能过度简化它,如果我错了请注释,但我认为错误只是在你的if语句中。
似乎永远不会调用if (failShot == true)
,因为failShot
初始化为false,只有在您检查if (cin.fail())
时才会再次更新为false。如果我理解正确,如果if (failShot == true)
没有失败,您希望cin
被调用。在这种情况下,将failShot初始化为True将修复您的错误。
尝试更改:
failShot = false;
要:
failShot = true;