Tic-Tac-Toe implementação MiniMax sempre retorna primeiro lugar livre

votos
0

Eu estou tentando implementar Minimax para encontrar a melhor jogada cada curva tic-tac-toe em js.

No entanto, ele sempre retorna o primeiro lugar livre: 0,0 e quando este ponto é tomada 0,1 e assim por diante. Acontece que a função miniMax sempre retorna 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;
}

Eu tentei olhar para a implementação de outras pessoas de Minimax para Tic-Tac-Toe, mas eu não conseguia entender o que faz a minha falha.

O que eu fiz errado?

Publicado 14/01/2020 em 00:03
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Vejo 2 problemas com o seu minimax (negamax) Código:

'1. Em sua função minimax você está passando por cada quadrado encontrar a melhor jogada a fazer. No entanto só estão voltando a pontuação, não a melhor jogada. Se você encontrar uma jogada vencedora, em seguida, escrever o seguinte:

return None, 1

Então, em sua chamada recursiva minimax você escreve:

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

No retorno inferior você escreve:

return bestMove, bestScore

Onde você decide o bestScore você também precisa atualizar o bestMove, somente se o máximas / mínimas alterações de pontuação. Semelhante ao que você faz na função bestMove.

'2. Em sua função bestMove você está passando por todas as praças NOVAMENTE. Isto é o que faz com que seja retornar o mesmo quadrado mais e mais. Desde a sua minimax vai encontrar o melhor movimento que você só precisa fazer a chamada inicial:

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

Caso contrário, ele irá para o primeiro quadrado e fazer o minimax completa, portanto, encontrar a melhor jogada para a posição (independentemente de começar movimento). Uma vez que nunca vai encontrar um movimento melhor do que a melhor jogada, não vai atualizar o bestMove a qualquer outra coisa do que a primeira praça possível.

Espero que eu estou fazendo nenhum sentido, Inglês não é minha língua nativa e eu só estou acostumado a codificação em Python :)

Respondeu 15/01/2020 em 10:50
fonte usuário

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