【发布时间】:2018-12-21 13:18:54
【问题描述】:
这是我的 井字游戏 算法的 Javascript 代码:
function minimax(newGrid, depth, Player){
//debugger
const gameState = checkWin(newGrid,true);
if (gameState == false){
values = [];
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
const boardCopy = _.cloneDeep(newGrid);
if (boardCopy[i][j] !== '') continue;
boardCopy[i][j] = Player;
console.log(boardCopy);
const value = minimax(boardCopy, depth + 1, (Player === PLYR_TOKEN) ? COMP_TOKEN : PLYR_TOKEN);
values.push({
cost: value,
cell: {
i: i,
j: j
}
});
}
}
//debugger
if (Player === COMP_TOKEN){
const max = _.maxBy(values, (v) => {
return v.cost;
});
if( depth === 0 ){
return max.cell;
} else {
return max.cost;
}
}else{
const min = _.minBy(values, (v) => {
return v.cost;
});
if( depth === 0 ){
return min.cell;
} else {
return min.cost;
}
}
} else if (gameState === null){
return 0;
} else if (gameState === PLYR_TOKEN){
return depth - 10;
} else if (gameState === COMP_TOKEN){
return 10 - depth;
}
}
这个“算法”,“代码”的问题很简单:它不会阻止我的动作让我们想象一下这个场景:
X-> 播放器 O-> MM算法
X - O
- X -
- - -
正常,一个完美的 MiniMax 算法应该采取这个选择来阻止我获胜(小写的 o 是新的举动):
X - O
- X -
- - o
问题是我的代码是这样的(小写 o 是新举措):
X - O
- X o
- - -
为什么?我不知道,但我认为它必须赢得任何机会,无视我的举动,无视我离胜利只有一步之遥的事实。 老实说,我真的不明白这个算法是如何工作的。
其他信息:主板是一个二维数组,minimax函数的结果是一个具有两个属性(i,j)的对象,表示主板上的坐标。
const board = [
['','',''],
['','',''],
['','','']
];
【问题讨论】:
-
添加更多关于这是什么类型游戏的问题。
-
对不起,我没有意识到,谢谢。这是关于井字游戏的,我刚刚在帖子中添加了它。
-
这个问题真的不清楚。 “它不会阻止我的动作”是什么意思?为什么算法“抓住任何机会获胜”会很奇怪?具体来说,是什么没有按照您期望的方式工作?
-
这是我第一次发布问题,感谢您的所有建议,我试图更清楚地说明我的问题/解释。
标签: javascript algorithm minimax