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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:42:29