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
相关产品推荐
相关产品推荐

