do ... while循环没有显示我想要的内容

时间:2017-11-27 06:05:20

标签: c++

所以基本上我今天已经在这个循环中工作了大约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保持显示两次(老实说我不知道​​为什么会这样做),在收到有效条目后退出循环,并保存一天?

1 个答案:

答案 0 :(得分:1)

我可能过度简化它,如果我错了请注释,但我认为错误只是在你的if语句中。

似乎永远不会调用if (failShot == true),因为failShot初始化为false,只有在您检查if (cin.fail())时才会再次更新为false。如果我理解正确,如果if (failShot == true)没有失败,您希望cin被调用。在这种情况下,将failShot初始化为True将修复您的错误。

尝试更改:

    failShot = false;

要:

    failShot = true;