java - 康威的生命游戏检测额外的活细胞

标签 java japplet conways-game-of-life

我正在编写康威的生命游戏,但我对活细胞的检测揭示了当我尝试使用细胞坐标设置信号灯(连续 3 个活细胞)时代码抛出的一些额外内容[36][22] 至 [36][24]。 我的迭代更新方法是这样的:

private void nextGeneration() {
    for (int i = 0; i < cell.length; i++) {
        for (int j = 0; j < cell[i].length; j++) {
            if(i>0 && i<79 && j>0 && j<99){
                if(cell[i][j].getAlive()){
                    cell[i][j].calcNeighbors(cell, i, j);
                    if(cell[i][j].getNeighbors() < 2){
                        cell[i][j].setAlive(false);
                    }
                    if(cell[i][j].getNeighbors() == 2 || cell[i][j].getNeighbors() == 3 && cell[i][j].getAlive()){
                        cell[i][j].setAlive(true);
                    }
                    if(cell[i][j].getNeighbors() > 3){
                        cell[i][j].setAlive(false);
                    }
                }
                else {
                    cell[i][j].calcNeighborsForNull(cell, i, j);
                    if (cell[i][j].getNeighborsForNull() == 3) {
                        cell[i][j].setAlive(true);
                    }
                }
            }
        }
    }
}

其中 nextGeneration() 每 1 秒调用一次,cell[][] 是 Cell 类的数组

我使用以下代码检测单元格:

myNeighbors = 0;
        if(cell[i-1][j-1].myAlive){
            myNeighbors++;
            System.out.println("top left");
        }
        if(cell[i-1][j].myAlive){
            myNeighbors++;
            System.out.println("top center");
        }
        if(cell[i-1][j+1].myAlive){
            myNeighbors++;
            System.out.println("top right");
        }
        if(cell[i][j-1].myAlive){
            myNeighbors++;
            System.out.println("mid left");
        }
        if(cell[i][j+1].myAlive){
            myNeighbors++;
            System.out.println("mid right");
        }
        if(cell[i+1][j-1].myAlive){
            myNeighbors++;
            System.out.println("lower left");
        }
        if(cell[i+1][j].myAlive){
            myNeighbors++;
            System.out.println("lower center");
        }
        if(cell[i+1][j+1].myAlive){
            myNeighbors++;
            System.out.println("lower right");
        }
        System.out.println(myNeighbors +" at " + j + "," + -i);

当我运行代码时,我得到控制台输出:

top right
mid right
2 at 22,-36
top center
top right
mid left
mid right
4 at 23,-36
top left 
top center
2 at 24,-36
mid right
lower left
lower right
3 at 23,-35
mid left
lower center
2 at 24,-35
top right
1 at 22,-36
top left
top center
mid left
3 at 24,-36
mid right
lower center
lower right
3 at 23,-35

编译器认为活细胞上方的死细胞也是活细胞。有人能看到我做错了什么吗? 谢谢。

最佳答案

根据您的 SetAlive 方法的工作原理,您认为应该死亡的单元实际上可能已被设置为 Activity 。上学期我必须为类编写一个生命游戏模拟,诀窍是使用两个“板”。由于整个“板”应该立即更新,因此使用您的方法可能会导致意外结果。迭代每个单元,但将结果发送到第二 block 板,以便当前步骤的单元状态与下一步的单元状态之间不存在重叠。通过文字解释有点困难,但如果您需要更多帮助,请告诉我,因为我认为这就是您的问题所在。

关于java - 康威的生命游戏检测额外的活细胞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11658742/

相关文章:

java - RxJava。 Observable.delay 工作奇怪(最后缺少一些项目)

java - 使用 Java 在 Mac 上存储用户名/密码

java - 我的人生游戏总是在消亡

python - (已关闭)康威的生命游戏未正确更新(Python)

java - (Java) 如何存储 x 和 y 值以便在 for 循环之外使用它们?

java - 空 View 不显示任何内容

java - JApplet repaint() 不起作用

java - JApplet 中的 JLabel 和图像 - 图像未显示

java - 在启动时向 JApplet 添加组件

java - 如何在 Java 中将环境指针传递给 Windows CreateProcess(使用 jna)