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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 20:39:03