Ich baue ein Tic Tac Toe-Spiel für eine unterhaltsame Lernerfahrung. Ich habe einen Minimax-Algorithmus konstruiert, um die optimale Bewegung für den Computer zurück, aber irgendwie falsch, ich werde und wierd Ausgabe wie dieseWas ist falsch mit meinem Minimax-Algorithmus für Tictactoe
TIC TAC TOE V1.0
---
---
---
Enter row, column of your move
1,1
---
-X-
---
...
0, 0: -1038
0, 1: -1470
0, 2: -1038
1, 0: -1470
1, 2: -1470
2, 0: -1038
2, 1: -1470
2, 2: -1038
O--
-X-
---
Enter row, column of your move
1,2
O--
-XX
---
...
0, 1: -15
0, 2: -9
1, 0: -10
2, 0: -1
2, 1: -29
2, 2: -41
O--
-XX
O--
Enter row, column of your move
1,0
O--
XXX
O--
WINNER: PLAYER
Sie zu sehen bekommen, dass der Computer die linke untere Ecke wählte anstatt das Abschneiden Spieler. Mein Code versucht, den Flop zwischen den Runden rekursiv durch alle möglichen Spielstände zu drehen, den Punktestand für jeden Sieg aufsummieren zu lassen oder den Verlust, zu dem der Spielzug führen könnte, und gibt dann den Zug mit der maximalen Punktzahl zurück. Der Ausdruck ist der Punktestand jeder Runde bevor er gemacht wird (Sie können sehen, dass er den höchsten Wert wählt), also warum schneide ich den Spieler nicht ab? Wie kann ich das beheben? Hier ist mein Code.
int compMoveScoreRecursive(state_t **board, int dimension, int row, int col, state_t turn) {
board[row][col] = turn;
state_t winner = checkWinner(board, dimension);
if (winner == COMPUTER) {
return 1;
} else if (winner == PLAYER) {
return -1;
} else {
int score = 0;
state_t nextTurn = turn == COMPUTER ? PLAYER : COMPUTER;
for (int i = 0; i < dimension; i++) {
for (int j = 0; j < dimension; j++) {
if (board[i][j] == NIL) {
state_t **boardCopy = copyBoard(board, dimension);
score += compMoveScoreRecursive(boardCopy, dimension, i, j, nextTurn);
destroyBoard(boardCopy, dimension);
}
}
}
return score;
}
}
move_t optimalCompMove(state_t **board, int dimension) {
move_t optMove;
int optScore = INT_MIN;
for (int row = 0; row < dimension; row++) {
for (int col = 0; col < dimension; col++) {
if (board[row][col] == NIL) {
state_t **boardCopy = copyBoard(board, dimension);
int score = compMoveScoreRecursive(boardCopy, dimension, row, col, COMPUTER);
printf("%d, %d: %d\n", row, col, score);
if (score > optScore) {
optMove.row = row;
optMove.col = col;
optScore = score;
}
destroyBoard(boardCopy, dimension);
}
}
}
return optMove;
}
Drucken Sie die Prospect Boards während jeder Rekursion. Die Ergebnisse können Sie überraschen. – WhozCraig