正確得分分支我試圖創造C.一個完美的井字棋遊戲,我用一個二維數組來跟蹤板。極小不是在井字棋
我已經將問題縮小到了我的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;
}
我最好打賭是這樣的:if(board [i] [j] =='U'){'。這種情況從來沒有真的我猜 –
這一行:'分數[行] [列] = -11; //全部設置爲'O'wins'不正確。根據對函數簽名聲明的其他評論,'O'勝是-10,而不是-11 – user3629249
每個遞歸都是從一個新的,未初始化版本的'scores [] []'開始的'這可能是不正確的。 – user3629249