我正在研究tic tac toe(用户与计算机)的AI,并且我使用minimax算法来实现计算机的最佳移动。我在youtube上查看了一些视频,并阅读了一些人的代码。但是,有些部分代码我仍然对正在做的事情感到困惑。让我们从tic tac toe minimax函数中获取以下代码。那里有一个主要的if,else if,else语句,其他一切都来自那里。我的主要问题是理解嵌入式for循环,以及后面的2个ifs。我认为,我已经对这些内容做了一些评论。我从此YouTube视频中获取了示例代码:https://www.youtube.com/watch?v=x_Je9i3aKNk tic tac toe的minimax函数。
//minimax function
function minimax(newGrid, depth, player) {
const gameState = isGameOver(newGrid);
//if the game is not over, evalute best move for computer
if(gameState === false) {
const values = [];
for(var i = 0; i < 3; i++) {
for(var j = 0; j < 3; j++) {
const gridCopy = _.cloneDeep(newGrid);
//if that spot is taken, skip to next loop
if(gridCopy[i][j] !== ' ') continue;
//if spot is player, evaluate
gridCopy[i][j] = player;
//need clarification
const value = minimax(gridCopy, depth+1, (player == PLAYER_TOKEN) ? COMPUTER_TOKEN : PLAYER_TOKEN);
values.push(value);
}
}
//need clarification for computer turn
if(player === COMPUTER_TOKEN) {
const max = _.maxBy(value, (v) => {
return v.cost;
});
if(depth === 0) {
return max.cell;
}
else {
return max.cost;
}
//need clarification for user turn
else {
const min = _.minBy(value, (v) => {
return v.cost;
});
if(depth === 0) {
return v.cell;
}
else {
return v.cost;
}
}
//if game state is null return 0
else if (gameState === null) {
return 0;
}
//if game state is player return negative
else if(gameState === PLAYER_TOKEN) {
return depth - 10;
}
//if game state is computer return positive
else if(gameState === COMPUTER_TOKEN) {
return 10 - depth;
}
}
答案 0 :(得分:4)
Minimax算法的关键是两个玩家之间的来回,其中&#34;转向的玩家是&#34;希望以最高分获得此举。反过来,每个可用移动的得分由对方玩家决定其可用移动中的哪一个具有最小分数来确定。并且对手球员移动的得分再次由轮流球员试图最大化其得分以及从移动树一直到最终状态一直决定。
算法的描述,假设X是&#34;轮流玩家,&#34;看起来像是:
您会注意到此算法是递归的,它会在玩家之间来回翻转,直到找到最终得分。
让我们通过完整移动树来完成算法的执行,并从算法上说明为什么会选择即时获胜动作:
有关代码中算法的更多详细信息和实现,您可以阅读以下文章:
Tic Tac Toe: Understanding The Minimax Algorithm