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

C#实现Conway生命游戏时下一代状态设置异常问题

问题修复:Conway's Game of Life中整行Cell状态同步错误

核心问题根源

你的代码中Pad方法填充南北方向行时,所有Cell引用了同一个实例,导致修改单个Cell的NextState时,整行的Cell状态都会同步变化。

看Pad方法中N/S方向的填充逻辑:

Cell[] paddingRow = new Cell[_space[0].Count];
Array.Fill(paddingRow, new Cell(0));

new Cell(0)只执行一次,Array.Fill会把这个单一Cell实例的引用赋值给数组的所有元素。也就是说,整行的Cell其实是同一个对象,修改其中任意一个的NextState,整行都会跟着变。这就是为什么处理列2时整行变true,处理列3时整行又变false。

修复方案

修改Pad方法中N/S方向的填充代码,确保每个Cell都是独立实例:

修复后的Pad方法

private void Pad(char side)
{
    if (side == 'N')
    {
        // 循环创建独立的Cell实例,避免引用共享
        List<Cell> paddingRow = new List<Cell>();
        for (int i = 0; i < _space[0].Count; i++)
        {
            paddingRow.Add(new Cell(0));
        }
        _space.Insert(0, paddingRow);
    }
    else if (side == 'S')
    {
        List<Cell> paddingRow = new List<Cell>();
        for (int i = 0; i < _space[0].Count; i++)
        {
            paddingRow.Add(new Cell(0));
        }
        _space.Add(paddingRow);
    }
    else if (side == 'E')
    {
        foreach (List<Cell> cellList in _space)
        {
            cellList.Add(new Cell(0));
        }
    }
    else if (side == 'W')
    {
        foreach (List<Cell> cellList in _space)
        {
            cellList.Insert(0, new Cell(0));
        }
    }
    else
    {
        throw new ArgumentException("Argument for padding must be either 'N', 'E', 'S', or 'W'.");
    }
}

也可以用LINQ简化(需保留using System.Linq):

// N方向填充的LINQ写法
_space.Insert(0, Enumerable.Repeat(0, _space[0].Count).Select(x => new Cell(x)).ToList());
// S方向填充的LINQ写法
_space.Add(Enumerable.Repeat(0, _space[0].Count).Select(x => new Cell(x)).ToList());

验证修复效果

修复后,滑翔机种子的下一代状态会正确生成:

  • 第5行(索引4)仅列索引2的Cell NextState为true
  • 其他Cell的NextState不会被错误同步

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:37:04