Tic-Tac-Toe реализация MiniMax всегда возвращает первое свободное место

голоса
0

Я пытаюсь реализовать Минимакс, чтобы найти лучший ход каждый поворот в крестики-нолики в JS.

Тем не менее, она всегда возвращает первое свободное место: 0,0 и, когда это место берется 0,1 и так далее. Оказывается, что функция Минимаксной всегда возвращает 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;
}

Я пытался смотреть на реализации других людей минимакса для Tic-Tac-Toe, но я не мог понять, что делает мою неудачу.

Что я сделал не так?

Задан 14/01/2020 в 00:03
источник пользователем
На других языках...                            


1 ответов

голоса
1

Я вижу 2 проблемы с минимаксом (negamax) код:

«1. В вашем минимаксе функции вы собираетесь через каждый квадрат найти лучший ход, чтобы сделать. Однако вы только вернув счет, не лучший ход. Если вы нашли выигрышный ход, а затем написать это:

return None, 1

Затем в минимаксном рекурсивном вызове Вы пишете:

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

В нижнем ответе вы пишете:

return bestMove, bestScore

Где вы решите bestScore вам также необходимо обновить bestMove, если только максимальные / минимальные изменения оценки. Подобно тому, что вы делаете в функции bestMove.

«2. В функции bestMove вы собираетесь через все квадраты РАЗ. Это то, что делает его вернуть ту же площадь снова и снова. Так как ваш минимаксный будет найти лучший шаг вам нужно всего лишь сделать первоначальный вызов:

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

В противном случае она будет идти на первый квадрат и сделать полный минимакс, поэтому найти лучший ход для позиции (независимо от того, начиная движение). Так как он никогда не будет найти лучший ход, чем лучший ход, он не будет обновлять bestMove к чему-либо еще, кроме первой возможной площади.

Надеюсь, что я делаю какой-либо смысл, английский не является моим родным языком, и я только для кодирования в Python :)

Ответил 15/01/2020 в 10:50
источник пользователем

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