Conways Game of Life Simulation无法正确更新

时间:2013-11-11 23:14:10

标签: java conways-game-of-life

我必须为大学的编程模块编写一个Conways生命模拟游戏。该程序的工作原理是在每次迭代中正确计算邻居的数量。它应该如何工作:

Current State       Neighbors              Next State
Alive                   2                  Alive
Alive                   3                  Alive
Alive                  <2                  Dead
Alive                  >3                  Dead
Dead                    3                  Alive   

每次更改单元状态时,其周围的8个单元格邻居字段将递增或递减。

public static Cell[][] updateGrid(Cell[][] theMatrix){
Cell[][] copy = new Cell[DIMENSIONX][DIMENSIONY];
for(int x = 0; x < DIMENSIONX; x++){
    for(int y = 0; y < DIMENSIONY; y++ ){
        copy[x][y] = theMatrix[x][y];
    }
}
int increment;
for(int x = 0; x < DIMENSIONX; x++){
    for(int y = 0; y < DIMENSIONY; y++ ){
        //Underpopulation
        if((copy[x][y].alive == false)&&(copy[x][y].neighbours == 3)){
            theMatrix[x][y].alive = true;
            increment = 1;
            theMatrix = addNeighbours(theMatrix, increment, x,y);
        }
        //Over Population
        else if((copy[x][y].alive==true)&&(copy[x][y].neighbours > 3)){
            theMatrix[x][y].alive = false;
            increment = -1;
            theMatrix = addNeighbours(theMatrix, increment, x,y);
        }
    }
}
return theMatrix;
}

感谢您花时间看看伙计们! 〜保罗

2 个答案:

答案 0 :(得分:1)

您没有对活细胞进行所有检查。您还需要检查单元格其他参数

你有:

for(int x = 0; x < DIMENSIONX; x++){
    for(int y = 0; y < DIMENSIONY; y++ ){
        //Underpopulation
        if((copy[x][y].alive == false)&&(copy[x][y].neighbours == 3)){
            theMatrix[x][y].alive = true;
            increment = 1;
            theMatrix = addNeighbours(theMatrix, increment, x,y);
        }
        //Over Population
        else if((copy[x][y].alive==true)&&(copy[x][y].neighbours > 3)){
            theMatrix[x][y].alive = false;
            increment = -1;
            theMatrix = addNeighbours(theMatrix, increment, x,y);
        }
    }
}

简洁之处是:

for all cells of the grid:
  if dead and neighbor count is 3, make alive
  if alive and neighbor count is > 3 make dead

你需要:

for all cells of the grid:
  if dead and neighbor count is 3, make alive
  if alive and neighbor count is > 3 make dead
  if alive and neighbor count is 0 or 1 make dead // ** need this

另请注意,在if块中,请勿使用== false,例如

if((copy[x][y].alive == false) && .....

取而代之的是

if((!copy[x][y].alive) && .....

答案 1 :(得分:0)

您的评论需要一些工作。 “人口不足”线并没有真正测试人口不足。它正在测试创造:当一个死细胞正好有三个活着的邻居时,就会产生新的生命。

你根本没有人口密集的测试。这就是活细胞死亡的地方少于2个活着的邻居来支撑它。

最容易解决的问题是将“人口过剩”测试修改为“过度/不足”灭绝:

   //Overpopulation or underpopulation
    else if ( (copy[x][y].alive==true) && 
              ( copy[x][y].neighbours > 3 || copy[x][y].neighbours< < 2) ) {
        theMatrix[x][y].alive = false;
        increment = -1;
        theMatrix = addNeighbours(theMatrix, increment, x,y);
    }

确保addNeighbors正在使用新值创建new Cell对象,否则您将遇到其他问题。