Sto costruendo un gioco di tic tac toe per una divertente esperienza di apprendimento. Ho costruito un algoritmo minimax per restituire la mossa ottimale per il computer, ma in qualche modo sto andando male e ottenere l'output strano come questoCosa c'è di sbagliato con il mio algoritmo minimax per 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
Si può vedere che il computer ha scelto l'angolo in basso a sinistra, piuttosto che tagliare la giocatore. Il mio codice tenta di capovolgere in modo ricorsivo tra virate attraverso tutti i possibili gamestates, sommando il punteggio per ogni vincita o perdita a cui il turno può portare, quindi restituisce il movimento con il punteggio massimo. La stampa è il punteggio di ogni turno prima che sia fatto (puoi vedere che sceglie il più alto), quindi perché non sto tagliando il giocatore? Come posso risolvere questo? Ecco il mio codice.
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;
}
Stampa le schede prospect durante ogni ricorsione. I risultati potrebbero sorprenderti. – WhozCraig