C ++中的while循环结束,但不会继续执行其余的语句

时间:2018-08-04 16:37:00

标签: c++ arrays class while-loop tic-tac-toe

这是我正在尝试制作的TicTacToe游戏的while循环,

while (result == 0)
{
    game.player_move();
    result = game.check_draw();
    game.computer_move();
} 

if (result == 1)
    cout << "Tie.";

这是game.check_draw()的条件。

int TicTacToe::check_draw()
{
    if (move_count == 9)
        return 1;
    else
        return 0;
}

此外,此代码确实按照我希望的方式工作。 X的值设置为88,而0的值设置为79。用户和计算机移动功能都将move_count值增加如下:

void TicTacToe::player_move()
{
    int position;

    draw_table();
    cout << endl << "Pick position[1-9]: ";
    cin >> position;

    while (pos[position - 1] == 79 || pos[position - 1] == 88)
    {
        system("CLS");
        draw_table();
        cout << endl << "Position taken.";
        Sleep(500);
        system("CLS");
        draw_table();
        cout << endl << "Pick position[1-9]: ";
        cin >> position;
        system("CLS");
    }

    position[pos - 1] = 88;
    move_count++; // <-------------
    system("CLS");
}

void TicTacToe::computer_move()
{
    int position;

    srand((unsigned int)time(0));
    position = (rand() % 9) + 1;

    while (pos[position - 1] == 79 || pos[position - 1] == 88)
        position = (rand() % 9) + 1;

    position[pos - 1] = 79;
    move_count++; // <-------------

}

由于玩家先行,在第9回合后将move_count设置为9。然后程序继续执行下一条语句。

if (result == 1)
    cout << "Tie.";

此代码可以完美运行,但(如果删除了game.computer_move()中的以下代码,

while (pos[position - 1] == 79 || pos[position - 1] == 88)
     position = (rand() % 9) + 1;

删除此代码后,while循环结束,并继续到下一个if语句。但是,当我添加此代码时,它确实结束了while循环,但没有继续到if语句上并显示闪烁的光标内容。所有这些代码所做的就是检查一个数组,以查看X a.k.a(88)或O a.k.a(79)是否已经放置在要放置0的位置。

我感到非常困惑,因为这根本不影响move_count,而且在第9位玩家移动move_count后将其设置为9,这意味着循环应该正确终止而不是终止移到game.computer_move()上?

我的理解是,一旦不满足while条件,while循环中的其余代码将被忽略,循环应结束。

我做了

cout << game.move_count;
在循环中,在game.check_draw()之前的

,以检查其值是否为9,并且确实如此。

此外,还有一个补充说明。我的代码可读吗?有什么明显的问题吗?

如果需要,我可以发布完整的代码,并感谢您的任何答复。

1 个答案:

答案 0 :(得分:4)

  

我的理解是,一旦不满足while条件,则while循环中的其余代码将被忽略,循环应结束。

这是不正确的。 while循环仅检查在循环的下一次迭代(最后)之前是否满足条件。如果在循环的中间不满足该条件,它将持续到循环的当前迭代结束,然后退出循环。如果希望在满足条件后立即结束循环,可以使用break语句退出循环。

来自cppreference

  

该表达式在每次迭代之前进行求值,如果结果为false,则退出循环。