我正在编写一个基于John Conway的生命游戏的程序。我得到它编译,甚至在经过几天不间断的工作后运行。但是,打印出来的结果是错误的......
这是我的代码(不包括主要方法)
//clears the grid
public static void clearGrid ( boolean[][] grid )
{
for(int row = 0; row < 18; row++){
for(int col = 0; col < 18; col++){
grid[row][col]= false;
}
}
//set all index in array to false
}
//generate the next generation
public static void genNextGrid ( boolean[][] grid )
{
int n; //number of neighbors
boolean[][] TempGrid = grid;// a temporary array
for(int row = 0; row < 18; row++)
{
for(int col = 0; col < 18; col++)
{
TempGrid[row][col] = grid[row][col];
n = countNeighbors(grid, row, col);
if(grid[row][col] == true)
{
if(n != 2 && n != 3)
{
TempGrid[row][col] = false;
}
else
TempGrid[row][col] = true;
}
else
{
if(n == 3)
{
TempGrid[row][col] = true;
}
else
TempGrid[row][col] = false;
}
grid[row][col] = TempGrid[row][col];
}
}
}
//count how many neighbors surrounding any speicific cell
public static int countNeighbors ( final boolean[][] grid, final int row, final int col )
{
int n = 0;
for (int TempRow = row - 1; TempRow <= row + 1; TempRow++)
{
if (TempRow >= 0 && TempRow < 18)
{
for (int TempCol = col - 1; TempCol <= col + 1; TempCol++)
{
if (TempCol >= 0 && TempCol < 18 && (TempRow != row || TempCol != col))
{
if (grid[TempRow][TempCol])
{
n++;
}
}
}
}
}
return n;
}
我很确定我的genNextGrid
方法中出现了问题。
包括作业表
public static void genNextGrid (boolean[][] grid);
此方法实际上将生成下一代模拟。 它应该使用传递给它的二维数组网格作为“当前”代。它应该创建第二个, 临时二维数组,将保持“下一代”。您需要创建此临时矩阵才能工作 因为您无法更改当前矩阵,因为您可能会丢失所需的所有信息 为了成功创造下一代。“
所以我不确定我做错了什么。
已经快3点了,从中午开始就一直盯着我的Vim屏幕。任何帮助都会受到极大关注。
答案 0 :(得分:5)
boolean[][] TempGrid = grid;
将使用相同的数组,只是使用不同的名称。你必须分配一些新的内存。看看你的代码,这应该可以解决问题:
boolean TempGrid = new boolean[18][18];
(如果你用常量替换那些18
会好得多)
答案 1 :(得分:4)
最明显的问题是:
boolean[][] TempGrid = grid;// a temporary array
TempGrid
只指向grid
。您需要创建一个单独的数组:
boolean[][] TempGrid = new boolean[18][18];
答案 2 :(得分:3)
除了没有真正创建一个新的临时数组,只是获得对旧的数组的引用之外,正如其他答案中所述:您将tempGrid
单元格复制到同一循环中的grid
单元格中你计算了它。因此,下一循环迭代将使用新的计算值,而不是网格中当前的“旧”值。
您需要先计算整个tempGrid
,然后将其复制到grid
。或者比复制更好的方法是将网格设置为指向tempGrid的数组,但这可能超出了您的作业范围(您必须从tempGrid
返回genNextGrid()
并将其分配给原始网格参考)。
需要tempGrid
而不仅仅是单个临时单元格的重点是,在计算下一代时需要grid
中的上一代。