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

使用变量访问数组元素返回undefined,硬编码数字却能获取预期对象的技术问题求助

问题分析与解决方案

你的问题核心在于**plantBombs()方法被过早调用了**,导致二维数组还没完全构建完成就尝试随机访问未初始化的行,自然会出现undefined的错误。

具体原因拆解

看你initialiseGame()里的逻辑:

for (let row = 0; row < this.size; row++) {
    this.data.push([]);
    for (let col = 0; col < this.size; col++){
        this.data[row][col] = new cell(row, col);
    }
    // 每次循环完一行就立刻调用plantBombs
    this.plantBombs();
}

当第一次执行循环(row=0)时,你只创建了data[0]这一行,其他行(data[1]到data[19])都还没被push进数组。这时候调用plantBombs(),randomX可能生成0-19之间的任意整数,一旦生成大于0的数,this.data[randomX]就会是undefined,后续访问[randomY]必然触发"无法读取undefined的属性"的错误。

另外,你的代码里还遗漏了bombs属性的定义——Game类里没有声明bombs变量,while (bombsPlanted < this.bombs)这行代码会因为this.bombs是undefined导致循环逻辑异常,这也是需要修正的点。

修正后的代码

把plantBombs()的调用移到外层循环之后,等整个二维数组完全初始化再执行埋炸弹操作,同时补上bombs属性:

class Game {
    data: Array<Array<cell>>;
    size: number;
    bombs: number; // 补上bombs属性定义
    constructor () {
        this.data = [];
        this.size = 20;
        this.bombs = 40; // 这里可以设置你需要的炸弹数量,比如20x20棋盘常用40个
    }
    initialiseGame() {
        this.data = []
        for (let row = 0; row < this.size; row++) {
            this.data.push([]);
            for (let col = 0; col < this.size; col++){
                this.data[row][col] = new cell(row, col);
            }
        }
        // 整个二维数组构建完成后再调用plantBombs
        this.plantBombs();
    }
    getRandomInt(max: number): number {
        return Math.floor(Math.random() * max)
    }
    plantBombs() {
        let randomX, randomY, bombsPlanted = 0;
        while (bombsPlanted < this.bombs){
            randomX = this.getRandomInt(this.size);
            randomY = this.getRandomInt(this.size);
            // 现在所有行都已初始化,不会出现undefined的情况
            if (!this.data[randomX][randomY].isMine){
                this.data[randomX][randomY].isMine = true;
                bombsPlanted ++;
            }
        }
    }
}

// 假设你的cell类是这样的(补充进来方便完整运行)
class cell {
    row: number;
    col: number;
    isMine: boolean;
    constructor(row: number, col: number) {
        this.row = row;
        this.col = col;
        this.isMine = false;
    }
}

额外注意点

  • 确保cell类的isMine属性初始化为false,否则你的判断条件!this.data[randomX][randomY].isMine可能会因为初始值未定义而出问题。
  • 如果担心随机生成的坐标重复(虽然循环会自动跳过已埋炸弹的位置),也可以考虑先生成所有不重复的随机坐标再批量设置炸弹,不过当前的循环逻辑已经能正常工作,只是极端情况下可能会多循环几次。

内容的提问来源于stack exchange,提问作者Cai Allin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:12:31