Tic-Tac-Toe MiniMax implementering returnerer alltid første gratis spot

stemmer
0

Jeg prøver å implementere MiniMax å finne den beste farten hver sving i tic-tac-toe i JS.

Men går den alltid det første gratis spot: 0,0, og når dette punktet er tatt 0,1 og så videre. Det viser seg at MiniMax funksjonen alltid returnerer en.

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

Jeg har prøvd å se på andres implementering av MiniMax for Tic-Tac-Toe, men jeg kunne ikke forstå hva som gjør meg mislykkes.

Hva gjorde jeg galt?

Publisert på 14/01/2020 klokken 00:03
kilden bruker
På andre språk...                            


1 svar

stemmer
1

Jeg ser 2 problemer med minimax (negamax) kode:

'1. I minimax funksjon du går gjennom hver rute finne den beste trekket å gjøre. Men du bare returnere score, ikke det beste trekket. Hvis du finner en vinnende trekk, og deretter skrive dette:

return None, 1

Så i minimax rekursive kall du skriver:

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

Nederst retur skriver du:

return bestMove, bestScore

Der du bestemmer bestScore må du også oppdatere bestMove, bare hvis maksimum / minimum score endringer. I likhet med hva du gjør i bestMove funksjon.

'2. I bestMove funksjon skal du gjennom alle rutene IGJEN. Dette er det som gjør det tilbake samme plassen over og over. Siden minimax vil finne den beste farten trenger du bare å gjøre den innledende samtalen:

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

Ellers vil den gå til den første plassen og gjøre den komplett minimax derfor å finne den beste trekket for stillingen (uavhengig av start trekk). Siden det aldri vil finne en bedre trekk enn beste angrep, det vil ikke oppdatere bestMove til noe annet enn den første mulige torget.

Håper jeg gjør noe fornuftig, engelsk ikke er morsmålet mitt, og jeg er bare brukt til koding i Python :)

Svarte 15/01/2020 kl. 10:50
kilden bruker

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