Tic-Tac-Toe aplicación MiniMax siempre devuelve primer lugar libre

votos
0

Estoy tratando de poner en práctica Minimax para encontrar el mejor movimiento en cada turno de tic-tac-dedo del pie en js.

Sin embargo, siempre devuelve el primer lugar libre: 0,0 y cuando este punto se toma 0,1 y así sucesivamente. Resulta que la función miniMax siempre devuelve 1.

let board = [
    ['', '', ''],
    ['', '', ''],
    ['', '', '']
];

const p1 = 'X';
const p2 = 'O';
const scores = {
    'X': 1,
    'O': -1
}

function bestMove(board, isMaximizing, player, turns) {
    let bestScore = isMaximizing ? -Infinity : Infinity;
    let bestMove;
    let score;

    for (let i = 0; i < 3; i++) {
        for (let j = 0; j < 3; j++) {
            if (board[i][j] == '') {
                board[i][j] = player;
                score = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1);
                board[i][j] = '';
                if (isMaximizing) {
                    if (score > bestScore) {
                        bestScore = score;
                        bestMove = [i, j];
                    }
                }
                else {
                    if (score < bestScore) {
                        bestScore = score;
                        bestMove = [i, j];
                    }
                }

            }
        }
    }
    return bestMove;
}

function miniMax(board, isMaximizing, player, turns) {
    let winner = checkForWinner(board);
    if (winner != null)
        return scores[winner];
    if (turns > 9)
        return 0;

    let bestScore = isMaximizing ? -Infinity : Infinity;
    let score;

    for (let i = 0; i < 3; i++) {
        for (let j = 0; j < 3; j++) {
            if (board[i][j] == '') {
                board[i][j] = player;
                score = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1);
                board[i][j] = '';
                if (isMaximizing)
                    bestScore = Math.max(score, bestScore);
                else
                    bestScore = Math.min(score, bestScore);
            }
        }
    }

    return bestScore;
}

He intentado buscar en la aplicación de otras personas de Minimax para Tic-Tac-Toe, pero no podía entender lo que hace que desfallecieron.

¿Qué hice mal?

Publicado el 14/01/2020 a las 00:03
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

Veo 2 problemas con su código de Minimax (negamax):

'1. En su función de Minimax que está pasando cada cuadrado encontrar el mejor movimiento para hacer. Sin embargo, sólo está devolviendo el resultado, no el mejor movimiento. Si usted encuentra un movimiento ganador, a continuación, escribir lo siguiente:

return None, 1

Luego, en su llamada recursiva Minimax se escribe:

miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)[1]

En el retorno del fondo se escribe:

return bestMove, bestScore

Donde se decide el bestScore también es necesario actualizar el bestMove, sólo si el máximo / mínimo de cambios de puntuación. De manera similar a lo que se hace en la función bestMove.

'2. En su función de bestMove usted está pasando por todos los cuadrados NUEVO. Esto es lo que lo hace regresar la misma plaza una y otra vez. Debido a que su Minimax encontrará el mejor movimiento que sólo tiene que hacer la llamada inicial:

bestMove, bestScore = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)

De lo contrario, ir a la primera plaza y hacer el Minimax completa, por lo tanto, encontrar el mejor movimiento para la posición (sin tener en cuenta a partir mover). Ya que nunca encontrará un movimiento mejor que el mejor movimiento, no se actualizará el bestMove a cualquier otra cosa que la primera plaza posible.

Espero que estoy haciendo ningún sentido, el Inglés no es mi lengua materna y sólo estoy acostumbrado a la codificación en Python :)

Respondida el 15/01/2020 a las 10:50
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more