C++ 循环意外结束

C++ While loop ending unexpectedly

本文关键字:结束 意外 循环 C++      更新时间:2023-10-16

我有一个 while 循环,它在我的 c++ 程序中的第二个线程中独立运行,但是循环在没有满足我设置的条件的情况下结束。

我尝试设置一个计数器来跟踪循环运行的次数,每次都不同,从八到数百次不等。

有谁知道为什么会发生这种情况?

while (ghostPosition.X != playerPosition.X && ghostPosition.Y != playerPosition.Y)
{
    randomDirection = getRandomNumber(1, 5);
    x = ghostPosition.X;
    y = ghostPosition.Y;
    if (randomDirection == 1)
    {
        if (ghostPosition.X > 1)
        {
            COORD oldPosition = { x, y };
            COORD moveTo = { --x, y };
            updateGraphics(oldPosition, moveTo, ghost);
            ghostPosition.X = ghostPosition.X--;
        }
    }
    else if (randomDirection == 2)
    {
        if (ghostPosition.Y < 84)
        {
            COORD oldPosition = { x, y };
            COORD moveTo = { x, ++y };
            updateGraphics(oldPosition, moveTo, ghost);
            ghostPosition.Y = ghostPosition.Y++;
        }
    }
    else if (randomDirection == 3)
    {
        if (ghostPosition.X < 24)
        {
            COORD oldPosition = { x, y };
            COORD moveTo = { ++x, y };
            updateGraphics(oldPosition, moveTo, ghost);
            ghostPosition.X = ghostPosition.X++;
        }
    }
    else if (randomDirection == 4)
    {
        if (ghostPosition.Y > 1)
        {
            COORD oldPosition = { x, y };
            COORD moveTo = { x, --y };
            updateGraphics(oldPosition, moveTo, ghost);
            ghostPosition.Y = ghostPosition.Y--;
        }
    }
}

在循环内调用的函数:

int Maze::getRandomNumber(int minimum, int maximum)
{
    int output;
    std::random_device randomDevice;
    std::mt19937 mersenneTwister(randomDevice());
    std::uniform_real_distribution<double> distribution(minimum, maximum);
    return distribution(mersenneTwister);
}

唯一称为 (updateGraphics) 的另一个函数只是根据传递的参数修改控制台的输出。(我不认为这个功能是问题所在)

我认为您希望在玩家和幽灵位置不同时执行此循环。但这不是您定义的条件。当玩家和幽灵 X 位置不同且玩家和幽灵 Y 位置不同时,您的循环会执行。如果两者相同,则循环将停止。我想你想要OR。

如果没有一些调试信息,很难分辨。你为什么不在 while 循环结束之前打印出 ghostPosition 和 playerPosition 的内容并将它们发回去。

此外,冒着听起来迂腐的风险,您可以通过使用 swtich 语句而不是大量 if/else 语句来简化循环逻辑。