Tic-Tac-Toe MiniMax Implementierung gibt immer erste freie Stelle

stimmen
0

Ich versuche, Minimax zu implementieren, um die beste Bewegung in jede Runde zu finden in Tic-Tac-Toe in js.

Allerdings gibt es immer die erste freie Stelle: 0,0 und wenn dieser Punkt wird 0,1 und so weiter gemacht. Es stellt sich heraus, dass die miniMax Funktion immer 1 zurück.

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;
}

Ich habe versucht, bei anderen Menschen der Implementierung von Minimax für Tic-Tac-Toe suchen, aber ich konnte nicht verstehen, was macht meine scheitern.

Was habe ich falsch gemacht?

Veröffentlicht am 14/01/2020 um 00:03
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Ich sehe zwei Probleme mit Ihrem Minimax (negamax) Code:

‚1. In Ihrer Minimax-Funktion, die Sie durch jeden Platz gehen, um den besten Zug zu finden, zu machen. Allerdings sind nur die Partitur zurückkehrt, nicht der beste Zug. Wenn Sie eine Gewinn Bewegung finden, dann schreiben Sie diese:

return None, 1

Dann in Ihrem Minimax rekursiven Aufruf Sie schreiben:

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

Am unteren Rückkehr Sie schreiben:

return bestMove, bestScore

Wo Sie die Bestscore entscheiden, müssen Sie auch die bestMove aktualisieren, nur, wenn die maximale / minimale Punktzahl Änderungen. Ähnlich dem, was Sie in der bestMove Funktion zu tun.

‚2. In Ihrer Funktion bestMove Sie die alle Quadrate WIEDER gehen durch. Das macht es den gleichen Platz immer und immer wieder zurückkehren. Da Ihr Minimax wird den besten Zug finden müssen Sie nur den ersten Anruf machen:

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

Sonst wird es auf den ersten Platz gehen und die komplette Minimax, damit die beste Bewegung für die Position zu finden (unabhängig bewegen zu starten). Da es nie eine bessere Bewegung als der beste Zug finden, wird es nicht die bestMove zu etwas aktualisiert anderes als der erste mögliche Platz.

Hoffe, dass ich keinen Sinn mache, Englisch ist nicht meine Muttersprache und ich nur Codierung in Python bin es gewohnt :)

Beantwortet am 15/01/2020 um 10:50
quelle vom benutzer

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