【发布时间】:2017-08-22 15:54:16
【问题描述】:
我正在研究 tic tac toe(用户与计算机)的 AI,并且我正在使用 minimax 算法来实现计算机的最佳移动。我在 youtube 上看过一些视频,并阅读了一些人的代码。但是,有些代码我仍然对正在做的事情感到困惑。让我们以 tic tac toe minimax 函数中的以下代码为例。有一个主要的 if、else if、else 语句,其他一切都从那里派生出来。我的主要问题是理解嵌入式 for 循环,以及紧随其后的 2 个 if。我认为,我已经在这些东西上放了一些 cmets。我从这个 youtube 视频中获取了示例代码:https://www.youtube.com/watch?v=x_Je9i3aKNk 井字游戏的极小极大函数。
//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;
}
}
【问题讨论】:
标签: javascript algorithm youtube tic-tac-toe minimax