【问题标题】:While loop in C++ ends, but doesn't continue onto the remaining statementsC++ 中的 While 循环结束,但不会继续执行其余语句
【发布时间】:2019-01-12 05:32:17
【问题描述】:

这是我正在尝试制作的井字游戏的 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,这意味着循环应该正确终止,甚至不会移动到 @987654334 @?

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

我做了一个

cout << game.move_count;

在循环中,就在game.check_draw() 之前,检查它的值是否为9,并且确实如此。

另外,附注。我的代码可读吗?有什么明显的问题吗?

如果需要,我可以发布整个代码,并提前感谢您的任何回复。

【问题讨论】:

  • 我的“优化”方法:int TicTacToe::check_draw() { return move_count == 9; } 的行为与您的原始版本完全相同
  • 为了让你的代码更具可读性(我想知道7988 但没有深入挖掘):为什么不使用'X''O' 来代替? Character constants 可用于(几乎)任何地方,如整数常量。
  • @Scheff 你能详细说明一下吗?基本上我所做的是创建一个数组: int pos[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };这样我就可以轻松地在每个框中显示带有数字的井字游戏表,以便用户可以轻松选择要玩的框。然后,如果该框等于 79 或 88,则该数组单元格将显示为 (char)。例如: if (pos[0] == 1) cout
  • 您没有公开您的数组声明,但无论如何 - char pos[]int pos[] 都是如此:如果您想比较一个元素是否存储 'X',您可以这样做只需pos[i] == 'X'。这与pos[i] == 88 等效,因为'X' 是ASCII 88 的字符常量,因此表示相同的值。 (如果您不使用 ASCII 而是使用其他东西(例如 EBCDIC)(我真的不相信),那么 pos[i] == 88 可能会损坏,但 pos[i] == 'X' 甚至可以使用 EBCDIC。)
  • 我刚刚在TicTacToe::computer_move() 中找到了position[pos - 1] = 79;,这可能是“交换错误”。你可能打算写pos[position - 1] = 79; 有趣的事实是两者的工作原理相同:position[pos - 1]*(position + pos - 1) 相同。 pos[position - 1]*(pos + position - 1) 相同。所以,最后它解决了相同的元素。 (但它让我的眼睛结结巴巴):-)

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


【解决方案1】:

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

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

来自cppreference

这个表达式在每次迭代之前被计算,如果结果为假,则退出循环。

【讨论】:

  • 对于初学者来说,以流程图形式查看他们的代码可能很有用,例如code2flow.com/5yl5gD.code.png(这不是我应该如何布置流程图,但 Code2Flow 是免费且快速的)
  • @GBlodgett 非常感谢,代码现在完美运行。我知道有一个 break 语句,但正如我的大学教授所教的那样,它只适用于 switch 语句......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2021-03-23
  • 2017-06-14
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多