首页 > 解决方案 > 我的井字游戏理论上是个大问题,但对我来说一切似乎都很好

问题描述

所以我进入了学习c++的下一步,那是一个矩阵。我尝试做一个简单的井字游戏,但我的游戏无法正确检查游戏是否结束。如果您在第一轮中输入 height = 2 和 width = 2,则表示您赢了...我不知道我在哪里搞砸了,在我看来一切都很好...

   int map[3][3];
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        map[i][j] = 0;
    }
}

bool finished = false;
int player = 1;
while (!finished) {
    //attack
    cout << "player " << player << " it is your turn"<< endl;

    cout << "The map looks like this:" << endl;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << map[i][j] << " ";
        }
        cout << endl;
    }
    bool correctMove;
    int height, width;
    do
    {
        correctMove = true;
        cout << "Where do you want to attack?" << endl;
        cout << "height = "; cin >> height;
        cout << "width = "; cin >> width;
        if (map[height][width] != 0 || width > 2 || height > 2) {
            correctMove = false;
        }
    } while (!correctMove);
    map[height][width] = player;
    //check finish game
    bool foundSequenceLine = true;
    for (int i = 0; i < 3; i++) {
        if (map[height][i] != player) {
            foundSequenceLine = false;
        }
    }
    bool foundSequenceColumn = true;
    for (int i = 0; i < 3; i++) {
        if (map[i][width] != player) {
            foundSequenceColumn = false;
        }
    }
    bool foundSequenceDiag1 = true;
    if (height == width) {
        for (int i = 0; i < 3; i++) {
            if (map[i][i] != player) {
                foundSequenceDiag1 = false;
            }
        }
    }
    bool foundSequenceDiag2 = true;
    if (height + width == 2) {
        for (int i = 0; i < 3; i++) {
            if (map[2-i][i] != player) {
                foundSequenceDiag2 = false;
            }
        }
    }
    if (foundSequenceColumn || foundSequenceLine || foundSequenceDiag1 || foundSequenceDiag2) {
        finished = true;
        cout << "Congrats player " << player << " you won!!!";
    }

    //change turn
    if (player == 1) {
        player++;
    }
    else {
        player--;
    }
}

}

标签: c++matrixvisual-c++tic-tac-toe

解决方案


代码做出假设,然后避免检查它。

您的代码假定玩家赢了,除非您可以详尽地证明他们没有。
问题是,您随后将两个测试短路,证明一个动作不是一个获胜的动作。

看看这段代码在做什么:

   bool foundSequenceDiag1 = true;
    if (height == width) {
        for (int i = 0; i < 3; i++) {
            if (map[i][i] != player) {
                foundSequenceDiag1 = false;
            }
        }
    }

首先,你说“玩家赢了” foundSequenceDiag1=true;。然后你说,“是在对角线上移动吗?”,然后你才运行可以设置foundSequenceDiag1为假的代码。

如果玩家的移动不在对角线上,则检查不会运行。

修理:

    bool foundSequenceDiag1 = (height==width);  // true if the player played on diagonal
    if (foundSequenceDiag1) {  // loop code now only executes if player played on diagonal
        for (int i = 0; i < 3; i++) {
            if (map[i][i] != player) {
                foundSequenceDiag1 = false;
            }
        }
    }

当你找到东西时,停止寻找。

如果我正在写你的支票,一旦我找到答案,我会使用break关键字停止查找。

    for (int i = 0; i < 3; i++) {
        if (map[i][i] != player) {
            foundSequenceDiag1 = false;
            break; // can't be true now, so stop checking.
        }
    }

推荐阅读