我正在使用 JavaScrip 开发 Tic Tac Toe 游戏。当我调用 MinMax 函数时,我收到错误日志序列。这里我调用了 minmax 函数,据我所知,我分配的值是可以的。
const value = minmax(gridCopy, 深度+1, ((player===PLAYER_TOKEN)?COMPUTER_TOKEN:PLAYER_TOKEN));
我在控制台中收到错误
main.js:86 Uncaught TypeError: Cannot read property 'cost' of undefined
at minmax (main.js:86)
at minmax (main.js:64)
at minmax (main.js:64)
at minmax (main.js:64)
at minmax (main.js:64)
at minmax (main.js:64)
at minmax (main.js:64)
at minmax (main.js:64)
at minmax (main.js:64)
at computerMove (main.js:120)
如果您想查看我的完整功能,这里是代码。
function minmax(newGrid, depth, player) {
const gameState= gameOver(newGrid);
if(gameState === false) {
const values= [];
for (var i=0; i<3; i++) {
for (var j = 0; j<3;j++){
const gridCopy = _.cloneDeep(newGrid);
if (gridCopy[i][j]!=='') continue;
gridCopy[i][j]=player;
const value = minmax(gridCopy, depth+1, ((player===PLAYER_TOKEN)?COMPUTER_TOKEN:PLAYER_TOKEN));
values.push({
cost:value,
cell: {
i:i,
j:j
}
});
}
}
if (player === COMPUTER_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===PLAYER_TOKEN) {
return depth - 10;
}
else if (gameState===COMPUTER_TOKEN) {
return 10 - depth;
}
}
function computerMove(){
return minmax(grid,0,COMPUTER_TOKEN);
}
这是完整项目的链接
最佳答案
我认为这里的问题是你的递归函数。您调用 minmax
九次,当 深度
最终达到 8 时,它应该解析其值,但它不能,因为值是根据 values
数组计算的永远不会被填满。结果是使用空 values
数组调用 .min/.max 方法。
最内部的递归调用应该从常量或其他内容解析其返回值,但不能使用依赖于递归函数本身的变量(值
)。
所以在我看来 minmax
函数的下半部分应该看起来像这样。但不知道你的费用是多少?算法因此只返回 1 作为结果。
if (player === COMPUTER_TOKEN) {
const max = _.maxBy(values, (v) => {
return v.cost;
});
if (depth === 8) {
return 1;
} else {
return max.cost;
}
} else {
const min = _.minBy(values, (v) => {
return v.cost;
});
if (depth === 8) {
return 1;
} else {
return min.cost;
}
}
但是这里还有另一个问题。 minmax
函数返回一个整数值并且
let value = minmax(gridCopy, depth + 1, ((player === PLAYER_TOKEN) ? COMPUTER_TOKEN : PLAYER_TOKEN));
需要一个整数值,但是
const move = ComputerMove();
需要位置对象,但获取一个整数。
编辑
抱歉回复晚了。我又看了一遍代码,我错了。
您正在使用 const gameState = gameOver();
模拟 minmax
函数中每次迭代的游戏结束。但 gameOver 函数使用全局网格变量,它是当前真实的游戏状态。所以我用 const gameState = gameOver(newGrid); 更改了它。并在框上单击处理将 let gameState = gameOver();
更改为 let gameState = gameOver(grid);
对游戏重新启动进行了其他更改,并且不允许更改网格单元格,如果游戏结束或网格单元不为空。
修改代码here
关于javascript - Minmax JavaScript 算法返回控制台错误 Uncaught TypeError : Cannot read property 'cost' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45845304/