Tic-Tac-Toe mise en œuvre MiniMax retourne toujours la première place libre

voix
0

Je suis en train de mettre en œuvre Minimax pour trouver le meilleur mouvement à chaque tour en tic-tac-toe en js.

Cependant, il retourne toujours la première place libre: 0,0 et quand cet endroit est pris 0,1 et ainsi de suite. Il se trouve que la fonction miniMax retourne toujours 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;
}

J'ai essayé de regarder la mise en œuvre d'autres personnes de Minimax pour Tic-Tac-Toe, mais je ne pouvais pas comprendre ce que le mien fait échouer.

Qu'ai-je fait de mal?

Créé 14/01/2020 à 00:03
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Je vois 2 problèmes avec Minimax (negamax) Code:

'1. Dans votre fonction Minimax vous traversez chaque carré de trouver le meilleur coup à faire. Cependant vous ne restituez le score, pas le meilleur coup. Si vous trouvez un coup gagnant, puis écrire ceci:

return None, 1

Ensuite, dans votre appel récursif Minimax vous écrivez:

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

Au retour bas, vous écrivez:

return bestMove, bestScore

Où vous décidez de la bestScore vous devez également mettre à jour le bestMove, seulement si le score change minimum / maximum. Semblable à ce que vous faites dans la fonction bestMove.

« 2. Dans votre fonction bestMove vous allez à travers toutes les places AGAIN. C'est ce qui retourne la même place à plusieurs reprises. Étant donné que votre Minimax trouver le meilleur mouvement que vous avez seulement besoin de faire l'appel initial:

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

Sinon, il ira à la première place et faire le Minimax complet, trouver donc le meilleur mouvement pour la position (quel que soit mouvement de départ). Comme il ne trouvera jamais un meilleur mouvement que le meilleur mouvement, il ne sera pas le jour bestMove à rien d'autre que la première place possible.

L'espoir que je fais tout sens, l'anglais est pas ma langue maternelle et je ne suis utilisé pour coder en Python :)

Créé 15/01/2020 à 10:50
source utilisateur

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