Tic-Tac-Toe MiniMax uitvoering geeft altijd eerste vrije plek

stemmen
0

Ik probeer uit te voeren Minimax op zoek naar de beste zet elke beurt in tic-tac-teen in js.

Echter, het geeft altijd de eerste vrije plek: 0,0 en wanneer deze plek wordt ingenomen 0,1 en ga zo maar door. Het blijkt dat de miniMax functie altijd terug 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;
}

Ik heb geprobeerd te kijken naar de uitvoering van Minimax andermans voor Tic-Tac-Toe, maar ik kon niet begrijpen wat maakt mij niet.

Wat heb ik verkeerd gedaan?

De vraag is gesteld op 13/01/2020 om 22:03
bron van user
In andere talen...                            


1 antwoorden

stemmen
1

Ik zie 2 problemen met uw Minimax (negamax) code:

'1. In je minimax functie je gaat door elke vierkante vinden van de beste zet te maken. Maar bent u slechts het retourneren van de score, niet de beste zet. Als je een winnende zet vinden, schrijf dit dan:

return None, 1

Vervolgens in uw minimax recursieve aanroep je schrijft:

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

Aan de onderkant terug te schrijven u:

return bestMove, bestScore

Indien u besluit de bestScore moet u ook de bestMove te werken, alleen als de maximum / minimum score verandert. Vergelijkbaar met wat je doet in de bestMove functie.

'2. In je bestMove functie je gaat door alle pleinen OPNIEUW. Dit is wat maakt het hetzelfde plein terug te keren over en voorbij. Aangezien uw minimax de beste zet te vinden hoeft u alleen de eerste oproep te maken:

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

Anders zal gaan naar het eerste vierkant en doe de volledige minimax, dus het vinden van de beste zet voor de functie (ongeacht het starten van beweging). Omdat het nooit een betere zet dan de beste verhuizing zal vinden, zal het de bestMove niet updaten naar iets anders dan de eerste mogelijke plein.

Hoop dat ik wartaal uit, Engels is niet mijn moedertaal en ik alleen gebruikt om codering in Python :)

antwoordde op 15/01/2020 om 08:50
bron van user

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