康威的生命游戏人口过剩?

36r*_*fan 0 java simulation

我正在研究康威的生命克隆游戏因为这是一个好习惯,但我遇到了一个问题.我看到有像素删除和重生,但所有像素只是展开在屏幕的最后,然后其他像素重生,但它只是空转.

以下是一些截图: 在此输入图像描述

我将向您展示我的一些逻辑代码.它全部在change方法中处理:

package main;

import java.awt.Color;
import java.awt.Graphics;

public class Functions {

  public static int pixelsize=6,gridwidth=800/6,gridheight=600/6;
  static int[][] pixels = new int[gridwidth][gridheight];
  static boolean first = true;

  public static void change(){

    for(int i = 0; i < gridwidth; i++){
      for(int j = 0; j < gridheight; j++){
        int neighbors = 0;
        //check each cell

        try{

          if(pixels[i+1][j] == 1){neighbors++;}
          if(pixels[i-1][j] == 1){neighbors++;}
          if(pixels[i+1][j-1] == 1){neighbors++;}
          if(pixels[i][j+1] == 1){neighbors++;}
          if(pixels[i][j-1] == 1){neighbors++;}
          if(pixels[i+1][j+1] == 1){neighbors++;}
          if(pixels[i-1][j-1] == 1){neighbors++;}
          if(pixels[i-1][j+1] == 1){neighbors++;}

        }catch(ArrayIndexOutOfBoundsException e){

        }

        if(neighbors == 3 || neighbors == 2 ){
          pixels[i][j] = 1;
        }else if(neighbors < 2 || neighbors >= 4){
          pixels[i][j] = 0;
        }
      }
    }
  }

  public static void render(Graphics g){

    for(int i = 0; i < gridwidth;i++){
      for(int j = 0; j < gridheight; j++){
        if(pixels[i][j] == 1){

          g.setColor(Color.red);
          g.fillRect(i*6, j*6, 6, 6);
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


感谢所有的帮助.可悲的是,它仍然无法正常工作.
现在它正在做同样的事情,但在钻石形成如此:
在此输入图像描述

Jac*_*ack 6

我在这里看到的主要问题是你在发现它们时更新值.

在更新之前,您应该缓存你的整个网格(或至少邻居计数),否则,当你在更新元素(x, y),你alterating邻居计数元素是连续的(x+1,y),(x+1,y+1),(x,y+1)通过计算当前迭代的结果.

例如,您可以更新一个名为cachedPixels的单独数组,如下所示:

for(int i = 0; i < gridwidth; i++){
    for(int j = 0; j < gridheight; j++){
        int neighbors = 0;
        // find the proper boundaries
        int minI = Math.max(0, i - 1);
        int maxI = Math.min(gridwidth, i + 2)
        int minJ = Math.max(0, j - 1);
        int maxJ = Math.min(gridheight, j + 2)

        for (int i2 = minI; i2 < maxI; i2++) {
           for (int j2 = minJ; j2 < maxJ; j2++) {
              if (i2 != i || j2 != j) {
                 if (pixels[i2][j2] == 1) {
                    neighbors++;
                 }
              }
           }
        }

        if (neighbors == 2 || neighbors == 3) {
           cachedPixels[i][j] = 1;
        } else {
           cachedPixels[i][j] = 0; // probably not even necessary as 0 is default value
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

然后在使用arraycopy函数完成整个数组集的此过程之后:

for (int i = 0; i < length; i++) {
    System.arraycopy(cachedPixels[i], 0, pixels[i], 0, cachedPixels[i].length);
}
Run Code Online (Sandbox Code Playgroud)

简单地设置像素= cachedPixels将指向"像素"到"cachedPixels"阵列,因此改变一个会改变其他,并且系统会崩溃.

PS你用于GoL的规则与John H. Conway的规则不同.细胞永远活在下一时刻,如果他们有3个邻居,和生活在与邻国2只有当他们在这个时间步长活着,就是死了,下一次的步骤:

cachedPixels[i][j] = 0; // Default value - death.
if (neighbors == 3) {
   cachedPixels[i][j] = 1;
} else if (thisCell == 1 && neighbors == 2) {
   cachedPixels[i][j] = 1;
}
Run Code Online (Sandbox Code Playgroud)