You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript遍历数组触发TypeError:四连棋游戏代码报错求助

四连棋游戏报错:Cannot read properties of undefined (reading '3') 原因分析与修复

核心错误原因

  1. 内层循环变量更新错误
    内层循环for (j = 0; j < 6; i++)里,循环增量错误地写为i++而非j++。这导致j始终停留在0,i却持续累加,很快超出feild数组的行数范围(feild仅有6行,索引为0-5)。当i >= 6时,feild[i]变为undefined,此时访问feild[i+3][j+3]必然抛出“无法读取undefined的属性”错误。

  2. 值类型不匹配(非直接报错原因,但影响功能)
    数组初始值是字符串"_",但判断条件中用== 1(数字)进行比较,后续会导致胜利判断逻辑失效,需要统一数据类型(比如将空位置设为数字0,玩家落子设为1或2)。

修复后的代码示例

var player = 0;
var gameOver = false;
var FinalMes = document.getElementById("gameOver");

// 统一用数字类型:0=空,1/2=玩家棋子
var field = [
  [0, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0, 0],
];

// 检查右下对角线方向的四连
for (let i = 0; i < 3; i++) {
  // 修复内层循环增量为j++
  for (let j = 0; j < 6; j++) {
    const currentPlayer = player + 1;
    if (
      field[i][j] === currentPlayer &&
      field[i + 1][j + 1] === currentPlayer &&
      field[i + 2][j + 2] === currentPlayer &&
      field[i + 3][j + 3] === currentPlayer
    ) {
      // 确保f变量已定义(比如游戏棋盘容器)
      if (typeof f !== 'undefined') f.hidden = true;
      gameOver = true;
      FinalMes.innerHTML = `Spelare ${currentPlayer} vann!`;
    }
  }
}

额外优化提示

  • 用let声明循环变量i和j,避免污染全局作用域。
  • 四连棋需要检查水平、垂直、两个对角线共4个方向,当前代码仅处理了右下对角线,需补充其他方向的判断逻辑。
  • 修正变量名拼写:feild改为field,提升代码可读性。

内容的提问来源于stack exchange,提问作者Tage Danielsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:45:37