Tic-Tac-Toe MiniMax végrehajtása mindig visszatér az első szabad helyet

szavazat
0

Próbálom végre Minimax, hogy megtalálják a legjobb lépés egyes lépéseinek tic-tac-toe js.

Azonban ez mindig visszatér az első szabad helyet: 0,0, és ha ezen a helyen kerül sor a 0,1 és így tovább. Kiderült, hogy a Minimax függvény mindig visszatér 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;
}

Megpróbáltam nézi mások általi végrehajtását Minimax a Tic-Tac-Toe, de nem tudtam, hogy mi teszi az enyém nem.

Mit csináltam rosszul?

A kérdést 14/01/2020 00:03
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
1

Látom 2 problémái vannak a minimax (negamax) kód:

„1. Az Ön minimax funkció megy keresztül minden téren megállapítás a legjobb lépés, hogy. Azonban akkor csak vissza a pontszám, és nem a legjobb lépés. Ha talál egy nyerő lépés, majd írjuk meg:

return None, 1

Ezután a minimax rekurzív hívás írsz:

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

Az alsó visszatérő írsz:

return bestMove, bestScore

Amennyiben úgy dönt, a bestScore akkor is frissíteni kell a bestMove csak akkor, ha a maximum / minimum pontszámot változásokat. Hasonlóan ahhoz, amit csinálsz a bestMove funkciót.

„2. Az Ön bestMove funkció megy keresztül az összes négyzet ISMÉT. Ez az, ami visszatér ugyanazon a téren újra és újra. Mivel a minimax fogja megtalálni a legjobb lépés csak akkor kell, hogy az első hívást:

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

Egyébként ez megy az első szögletes, és nem a teljes minimax, ezért megtalálni a legjobb lépés a helyzet (a kiindulási lépés). Mivel soha nem fog találni egy jobb mozog, mint a legjobb lépés, akkor nem frissíti a bestMove hogy mást, mint az első lehetséges téren.

Remélem én semmi értelme, az angol nem az anyanyelve, és én csak használt kódolás Pythonban :)

Válaszolt 15/01/2020 10:50
a forrás felhasználó

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