Javascript Tic-Tac-Toe-MiniMax实现总是返回第一个空闲点

Javascript Tic-Tac-Toe-MiniMax实现总是返回第一个空闲点,javascript,minimax,Javascript,Minimax,我正在尝试实现Minimax,以便在js中找到tic-tac-toe中的每个回合的最佳移动 但是,它总是返回第一个自由点:0,0,当这个点取0,1时,依此类推。 事实证明,miniMax函数总是返回1 let board = [ ['', '', ''], ['', '', ''], ['', '', ''] ]; const scores = { 'X': 1, 'O': -1 } function miniMax(board, isMaximizi

我正在尝试实现Minimax,以便在js中找到tic-tac-toe中的每个回合的最佳移动

但是,它总是返回第一个自由点:0,0,当这个点取0,1时,依此类推。 事实证明,miniMax函数总是返回1

let board = [
    ['', '', ''],
    ['', '', ''],
    ['', '', '']
];

const scores = {
    'X': 1,
    'O': -1
}

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)[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, bestScore];
}
我试着观察其他人对Tic-Tac-Toe的Minimax实现,但我不明白是什么导致我的失败

我做错了什么


编辑:我已经更新了我的代码,但现在它返回0,0然后1,0然后0,1然后2,0然后0,2

我发现您的minimax negamax代码存在两个问题:

"一,。在你的minimax函数中,你要通过每一个方块寻找最佳的移动。然而,你只是返回分数,而不是最好的动作。如果你发现一个成功的动作,那么写下:

return None, 1
然后在minimax递归调用中,编写:

miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)[1]
return bestMove, bestScore
在底部的回车处,您写下:

miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)[1]
return bestMove, bestScore
在决定最佳分数时,仅当最高/最低分数发生变化时,您还需要更新最佳移动。类似于您在bestMove函数中所做的操作

"二,。在bestMove函数中,您将再次遍历所有方块。这就是为什么它一次又一次地返回同一个正方形。由于您的minimax将找到最佳移动方式,您只需进行初始呼叫:

bestMove, bestScore = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)
否则,它将转到第一个正方形并执行完整的极小极大值,因此无论起始移动如何,都会找到该位置的最佳移动。因为它永远不会找到比最佳移动更好的移动,所以它不会将最佳移动更新到第一个可能的方块以外的任何位置


希望我说的有道理,英语不是我的母语,我只习惯于用Python编码:

谢谢你花时间回答!我试过你说的,我改变了minimax函数,我没有使用bestMove函数,但它仍然不起作用。现在它返回0,0,1,0,0,1,2,0,0,2。我做错了什么?我不能写在评论里。。。我将编辑我的问题