Java实现GameOfLife:如何统计细胞周围存活细胞数?
问题分析:count始终为0的核心原因
你的代码里count一直是0,最关键的问题出在对象引用的比较逻辑上,咱们一步步拆解问题:
1. 对象实例不匹配,==比较永远返回false
在World构造函数里,你创建了一个AliveCell cellNew = new AliveCell(1, "X");,并用它填充数组里的存活细胞。但在afficherUpdate方法里,你又新建了一个完全独立的AliveCell cellNew = new AliveCell(1,"X");。
在Java里,==用于对象时,比较的是内存中的引用地址,而不是对象的内容。这两个cellNew是不同的实例,内存地址完全不一样,所以this.myWorld[i][j] == cellNew永远返回false——统计存活细胞的代码块根本不会执行,count自然一直是0。
解决方法:
- 方案一:把
cellNew定义为类的成员变量,让构造函数和afficherUpdate共用同一个实例; - 方案二:给
Cell接口添加一个判断存活状态的方法(比如isAlive()),通过方法判断细胞是否存活,而非用==比较对象。示例代码如下:
之后统计时就可以用public interface Cell { boolean isAlive(); // 其他业务方法... } public class AliveCell implements Cell { @Override public boolean isAlive() { return true; } // 其他实现逻辑... } public class DeadCell implements Cell { @Override public boolean isAlive() { return false; } // 其他实现逻辑... }myWorld[i][j].isAlive()来判断,彻底避开对象引用比较的坑。
2. 其他会影响统计的细节问题
除了核心的对象比较问题,还有几个细节会干扰你的逻辑:
- count未及时重置:处理每个细胞前,需要把
count重置为0,否则上一个细胞的统计结果会累加到下一个细胞上; - 数组遍历边界错误:遍历二维数组时,列数应该用
myWorld[i].length而非myWorld.length(后者是行数),如果是矩形数组(行数列数不同),会导致遍历不完整或数组越界; - 随机位置重复覆盖:构造函数里生成存活细胞位置时,没有检查该位置是否已被设置为存活细胞,可能重复覆盖同一个位置,导致实际生成的存活细胞数量比预期少;
- 硬编码边界判断:比如
i > 0 && i < 50这种写法,如果数组大小不是50x50就会出错,应该用数组实际长度判断,比如i > 0 && i < myWorld.length - 1,避免越界。
修正后的核心逻辑示例
假设你已经给Cell接口添加了isAlive()方法,修正后的统计逻辑可以改成这样:
public void afficherUpdate(){ AliveCell cellBorn = new AliveCell(1, "B"); for(int i = 0; i < myWorld.length; i++) { for(int j = 0; j < myWorld[i].length; j++) { int count = 0; // 每个细胞统计前重置count // 遍历周围8个方向 for(int dx = -1; dx <= 1; dx++){ for(int dy = -1; dy <= 1; dy++){ if(dx == 0 && dy == 0) continue; // 跳过当前细胞本身 int x = i + dx; int y = j + dy; // 检查坐标是否在数组范围内 if(x >= 0 && x < myWorld.length && y >=0 && y < myWorld[x].length){ if(myWorld[x][y].isAlive()){ count++; } } } } // 后续处理细胞状态更新逻辑 // ... } } }
内容的提问来源于stack exchange,提问作者Karro
相关产品推荐
相关产品推荐

