javascript - 我无法让井字游戏的极小极大算法按预期工作
问题描述
大家好,我正在尝试使用 javascript 在我的井字游戏中实现 minimax,但我似乎无法让它工作。我已经尝试了我能想到的一切,但人工智能只是做出可怕的动作,所以我确定我把事情搞砸了,但我整晚都在试图找出我的错误,但没有用。
我注意到我的最大化玩家 bestScore 是非常随机的。它可以是 1、-1 或 -Infinity。另一方面,最小化玩家 bestScore 始终为 -1 或 -Infinity。我认为这与问题有关。
这是相关的代码:
const makeMove = () => {
let bestScore = -Infinity;
let move;
let board = Gameboard.gameBoard;
for (let i = 0; i < board.length; i++) {
if (typeof board[i] !== 'string') {
const originalValue = board[i];
board.splice(i, 1, Gameflow.p2.sign);
let score = minimax(board, 0, false);
console.log(score);
board.splice(i, 1, originalValue);
if (score > bestScore) {
bestScore = score;
move = i;
}
}
}
board.splice(move, 1, Gameflow.p2.sign);
};
const minimax = (board, depth, isMaximizing) => {
let result = Gameflow.checkResult();
if (result != null) {
return scores[result];
}
if (isMaximizing) {
let bestScore = -Infinity;
for (let i = 0; i < board.length; i++) {
if (typeof board[i] !== 'string') {
const originalValue = board[i];
board.splice(i, 1, Gameflow.p2.sign);
let score = minimax(board, depth + 1, false);
board.splice(i, 1, originalValue);
bestScore = Math.max(score, bestScore);
}
}
return bestScore;
} else {
let bestScore = Infinity;
for (let i = 0; i < board.length; i++) {
if (typeof board[i] !== 'string') {
const originalValue = board[i];
board.splice(i, 1, Gameflow.p1.sign);
let score = minimax(board, depth + 1, true);
board.splice(i, 1, originalValue);
bestScore = Math.min(score, bestScore);
}
}
return bestScore;
}
};
const scores = {
O: 1,
X: -1,
tie: 0,
};
我希望我的描述性足够,但如果需要任何澄清,我很乐意提供更多信息。如果您想查看整个代码,请点击以下链接:https ://github.com/Gianluca-CIoni/tic-tac-toe/blob/ai/index.js