Piškvorky realizace MiniMax vždy vrátí první volné místo

hlasů
0

Snažím se realizovat Minimax najít nejlepší tah všechny odbočky Piškvorky v JS.

Nicméně, to vždy vrátí první volné místo: 0,0, a je-li toto místo přijmout 0,1 a tak dále. Ukazuje se, že funkce miniMax vždy vrátí 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;
}

Snažil jsem se při pohledu na realizaci jiných lidí o Minimax pro Piškvorky, ale nemohl jsem pochopit, co dělá moje selhání.

Co jsem udělal špatně?

Položena 14/01/2020 v 00:03
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Vidím 2 problémy s minimax (negamax) kód:

‚1. Ve vašem minimax funkci, kterou prochází každý čtvereční najít nejlepší tah, aby se. Ať už se vracejí pouze skóre, není nejlepší tah. Pokud zjistíte, vítězný tah, pak napsat toto:

return None, 1

Pak ve svém minimax rekurzivní volání píšete:

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

Na spodním návratu píšete:

return bestMove, bestScore

Kde se rozhodne o bestScore je také nutné aktualizovat bestMove, pouze pokud je maximální / minimální změny skóre. Podobně jako to, co děláte ve funkci bestMove.

‚2. Ve funkci bestMove jdete přes všechny čtverce znovu. To je to, co dělá to vrátí stejný čtverec znovu a znovu. Vzhledem k tomu, minimax najde nejlepší tah je třeba jen proto, aby počáteční volání:

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

V opačném případě půjde na první pole a udělat kompletní minimax, tedy nalezení nejlepší tah na pozici (bez ohledu na to začíná tah). Vzhledem k tomu, že nikdy nenajde lepší tah než nejlepší tah, nebude aktualizovat bestMove na nic jiného než na první možnou náměstí.

Doufám, že mě nedává smysl, angličtina není můj rodný jazyk a já jsem použít pouze ke kódování v Pythonu :)

Odpovězeno 15/01/2020 v 10:50
zdroj uživatelem

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