javascript - Minmax JavaScript 算法返回控制台错误 Uncaught TypeError : Cannot read property 'cost' of undefined

标签 javascript lodash minmax

我正在使用 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);
    }

这是完整项目的链接

https://codepen.io/ziaullahzia/full/wqpGxW/

最佳答案

我认为这里的问题是你的递归函数。您调用 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/

相关文章:

javascript - 如何在页面上显示多个 ember 模型

javascript - 这是您合并 Onload 事件的方式吗?

html - 使行高适应 CSS 网格中的动态内容

javascript - 将 while 循环替换为 lodash

mysql - 从多个项目中选择最小/最大

CSS 最小最大值() : prioritize max value

javascript - Sencha 触摸 : container height needs to fit content

javascript - 将名称数组传递给 _.bindAll - 参数列表类型错误

javascript - Lodash 查找数组中是否存在对象属性

javascript - lodash递归查找数组中的项目