使用变量访问数组元素返回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
相关产品推荐
相关产品推荐

