C#开发扫雷程序时如何初始化Cell二维数组避免元素为null
问题根源
- C#中引用类型的数组仅创建容器时,所有元素默认值为
null,你没有给每个坐标位置单独实例化Cell对象 - 现有代码逻辑错误:遍历的是传入参数
playField的_playField数组,而非你刚刚新建的当前类的_playField数组,直接访问null对象的IsMine属性会抛出空引用异常 Cell类仅定义了带参构造函数,实例化时必须传入neighbors和isMine两个参数- 遍历数组给元素赋值不能用
foreach:foreach只能读取元素值,无法修改数组本身的元素引用,必须通过索引操作完成赋值
修正后代码
public void GeneratePlayField(PlayField playField) { // 初始化数组容器 _playField = new Cell[XSize, YSize]; // 嵌套for循环遍历所有坐标 for (int x = 0; x < XSize; x++) { for (int y = 0; y < YSize; y++) { // 随机判断当前位置是否为雷 bool isMine = playField._random.NextDouble() <= playField.FillAmount; // 实例化Cell对象,邻居数先默认填0,后续单独统计 _playField[x, y] = new Cell(0, isMine); } } // 此处可追加邻居数统计逻辑:遍历每个格子,计算周围8个方向的雷数,赋值给对应Cell的Neighbors字段 }
补充说明
如果需要计算每个格子的邻居雷数,在上述所有Cell实例化完成后,再做一次嵌套遍历即可:对每个坐标,检查周围8个相邻坐标是否越界、是否为雷,统计总数后赋值给当前Cell的Neighbors字段,就完成了整个棋盘的初始化。
内容的提问来源于stack exchange,提问作者Hale Jan
相关产品推荐
相关产品推荐

