Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 康威';人口过剩的人生游戏?_Java_Simulation - Fatal编程技术网

Java 康威';人口过剩的人生游戏?

Java 康威';人口过剩的人生游戏?,java,simulation,Java,Simulation,我当时正在制作康威的生命克隆游戏,因为这是一个很好的练习,但我遇到了一个问题。我看到有一些像素被删除和重新生成,但是所有的像素只是分散在屏幕的最末端,然后其他的像素被重新生成,但是在那一点上它只是空转 以下是一些屏幕截图: 我将向您展示一些关于此逻辑的代码。这一切都是通过change方法处理的: packagemain; 导入java.awt.Color; 导入java.awt.Graphics; 公共类功能{ 公共静态int pixelsize=6,gridwidth=800/6,gridh

我当时正在制作康威的生命克隆游戏,因为这是一个很好的练习,但我遇到了一个问题。我看到有一些像素被删除和重新生成,但是所有的像素只是分散在屏幕的最末端,然后其他的像素被重新生成,但是在那一点上它只是空转

以下是一些屏幕截图:

我将向您展示一些关于此逻辑的代码。这一切都是通过
change
方法处理的:

packagemain;
导入java.awt.Color;
导入java.awt.Graphics;
公共类功能{
公共静态int pixelsize=6,gridwidth=800/6,gridheight=600/6;
静态int[][]像素=新int[gridwidth][gridheight];
静态布尔值优先=真;
公共静态无效更改(){
对于(int i=0;i=4){
像素[i][j]=0;
}
}
}
}
公共静态无效渲染(图形g){
对于(int i=0;i


谢谢你的帮助。可悲的是,它仍然不能正常工作。
现在它也在做同样的事情,但在菱形构造中是这样的:

我在这里看到的主要问题是,在发现值的同时更新值

在更新之前,您应该缓存整个网格(或至少是邻居数),否则,当您在
(x,y)
处更新元素时,您通过计算当前迭代的结果来更改元素的邻居数,这些元素连续为
(x+1,y)
(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
        }
    }   
}

您的新生像素不应被计算为此移动的邻居,您的死亡像素应被计算。它可以通过为新生和死亡像素设置另一个值,例如
2
3
,来实现。处理该字段后,通过将新生儿的值替换为
1
,将死亡的值替换为
0

提交其状态。为什么忽略AIOOBE?考虑上面的检查使用嵌套for循环,但是忽略i=0和& j=0的情况,并且使用<代码>数学.min(…)> />代码>和<代码>数学.max(…)>代码>处理边缘情况,这样您就不必担心AIOOBE了。<代码> catch(ArayIdxOutOfFunsExpRebug E)< /Cord>这是一个暴行!永远不要做那样的事。你的问题的解决方案实际上在我的另一个答案中是的,这就是问题及其解决方案。杰克:我添加了你建议的代码示例。如果可以,请留下它,如果不可以,请删除它。@HovercraftFullOfEels:可以,别担心。我只是太懒了,在我的代码库中找不到任何实现;)非常感谢!现在唯一的问题是,当我放置start时,它会以菱形展开,然后填充屏幕。
for (int i = 0; i < length; i++) {
    System.arraycopy(cachedPixels[i], 0, pixels[i], 0, cachedPixels[i].length);
}
cachedPixels[i][j] = 0; // Default value - death.
if (neighbors == 3) {
   cachedPixels[i][j] = 1;
} else if (thisCell == 1 && neighbors == 2) {
   cachedPixels[i][j] = 1;
}