我试图在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/