我试图在C中创建一个完美的Tic Tac Toe游戏。我使用一个二维数组来跟踪棋盘。
我已经将问题缩小到我的minimax函数对每个潜在移动进行评分的方式,但是我在调试它时遇到了问题,因为错误通常发生在第二个移动附近,并且我无法从这一点跟踪所有潜在的游戏状态。
电脑是第一位的,而且总是“X”minimax是从computerMove函数中调用的,该函数尝试每个可用的移动,然后最小化它们。它将从minimax返回的潜在游戏状态值作为临时分数,并将其与当前最高分数进行比较。我相信这个计划的一部分是可行的问题在于minimax函数本身
以下是我的代码的重要部分:

int minimax(char board[][3], char maxPlayer) // +10 -> X wins
{                                            // -10 -> O wins
    char minPlayer;                          //   0 -> draw
    int scores[3][3];
    if (maxPlayer == 'X') minPlayer = 'O';
    else minPlayer = 'X';
    int topScore = 0;

    // initializing scores to ensure a move is selected
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            scores[i][j] = -11;
        }
    }

    // check for terminal state
    if (isWinning(board,'X') || isWinning(board,'O') ||
    !moveAvailable(board)) {
        if (isWinning(board,'X')) return 10;
        else if (isWinning(board,'O')) return -10;
        else return 0;
    }

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[i][j] == 'U') {
                board[i][j] = maxPlayer;                // try the move
                scores[i][j] = minimax(board,minPlayer);// minimax it
                board[i][j] = 'U';                      // undo the move
            }
        }
    }

    // if calling minimax for computer, maximize the score
    if (maxPlayer == 'X') {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (scores[i][j] > topScore && scores[i][j] != -11)
                    topScore = scores[i][j];
            }
        }
    }

    // if calling minimax for human, minimize the score
    else if (maxPlayer == 'O') {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (scores[i][j] < topScore && scores[i][j] != -11)
                    topScore = scores[i][j];
            }
        }
    }
    return topScore;
}

最佳答案

问题在于topScore初始化:
你应该在11或-11处初始化topScore,这取决于谁打球,而不是0,否则两个球员都会认为他们至少可以达到平局(事实并非如此),从深度2开始。
就良好实践(imho)而言,我认为在更新if (maxPlayer == 'X')之前,最后两个循环应该组合成一个,其中包含topScore条件此外,你应该跳过所有board[i][j]!='U'的位置,这比在分数中查找-11更容易理解(尽管这很好)。

关于c - Minimax无法在井字游戏中正确打分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44992468/

10-12 23:00