在尝试将 minimax 实现为 tic tac toe 的 AI 数小时后,我只是不知道该做什么了。人工智能不会做出明智的选择,它似乎只是选择了它能做的第一步。这是我第一次尝试实现类似的东西。我用极客来写关于极小极大算法的极客文章,还有一些 youtube 视频作为这方面的基础。
'O' 是最大值或 AI,而 'X' 是最小值或玩家。 findBestMove 采用棋盘数组,并返回最佳着法作为索引值,以在数组中使用并插入在网络上创建的可视棋盘中。
function findBestMove(board) {
let bestMove = {};
let bestVal = -Infinity;
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (board[i][j] === '') {
board[i][j] = 'O';
let moveVal = minimax(board, 0, false);
board[i][j] = '';
if (moveVal > bestVal) {
bestVal = moveVal;
bestMove = { i, j };
}
}
}
}
return bestMove;
}
function minimax(board, depth, maxPlayer) {
let score = GameBoard.checkResult();
if (!!score) {
if (score < 0) {
return score + depth;
} else {
return score - depth;
}
}
if (!isMovesLeft(board)) {
return 0;
}
if (maxPlayer) {
let maxEval = -Infinity;
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (board[i][j] === '') {
board[i][j] = 'O';
let eval = minimax(board, depth + 1, false);
board[i][j] = '';
maxEval = Math.max(maxEval, eval);
console.log(maxEval + ' ' + eval);
}
}
}
return maxEval;
} else {
let minEval = Infinity;
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (board[i][j] === '') {
board[i][j] = 'X';
let eval = minimax(board, depth + 1, true);
board[i][j] = '';
minEval = Math.min(minEval, eval);
}
}
}
return minEval;
}
}
function isMovesLeft(board) {
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (board[i][j] === '') {
return true;
}
}
}
return false;
}