我正在使用 malloc 数组作为 0 和 1 的网格来实现康威的生命游戏,任何带有 0
的地方我都会打印代表“死”单元格的白色背景空间和任何地方使用 1
我打印一个代表“事件”单元格的黑色背景空间。
我在每个周期更新单元格时遇到一些问题。我的方法是使用 getState()
函数,该函数仅检查网格条目是 0
还是 1
,然后相应地返回一个值。我还有一个 countN() 函数,它会遍历网格并计算数字 - 考虑角点、边缘和中心情况。我已经用几个例子彻底测试了它们,它们按照我期望的方式工作,对于给定的网格坐标,它总是返回正确的状态和存活邻居的数量。
这就是我尝试做的(伪代码):
void updateGrid(int **grid, int r, int c) {
copyGrid = grid;
for (i = 0; i < r; i++)
for (j = 0; j < c; j++) {
alive->getState(grid, i, j)
neighbours->countN(grid, i, j)
if (alive) {
if (neighbour < 2 || neigbour > 3)
copyGrid[i][j] = 0;
else
copyGrid[i][j] = 1;
} else {
if (neighbour == 3)
copyGrid[i][j] = 1;
else
copyGrid[i][j] = 0;
}
}
grid = copyGrid;
printGrid(grid, r, c)
}
有一个简单的调用函数,它只是从输入文件生成一个初始网格,清除屏幕,然后调用 updateGrid()
并在每个周期后休眠,直到一定数量的周期。初始网格是我期望的样子,邻居和事件函数返回正确的值,但网格更新不正确,并且输出相当扭曲。
例如,使用 1 和 0:
Input: Expected Output: Actual Output
0 0 0 0 1 0 0 1 1
1 1 1 0 1 0 1 0 1
0 0 0 0 1 0 0 0 0
任何提示将不胜感激!
最佳答案
将网格副本复制回grid
的方法不起作用:copyGrid = grid;
和grid = copyGrid;
不起作用不这样做,第一个会覆盖全局指针copyGrid
,这会导致更新的单元格被写入原始网格,第二个不执行任何操作,因为两个指针已经指向同一区域。
您必须删除 copyGrid = grid;
语句。所有更新的单元格都会被计算并存储到copyGrid
中,因此无需复制原始单元格。一旦计算出新的一代,您必须将其复制回原始网格:假设复制网格具有与网格相同的几何形状,即一个数组如果 r
指针指向 c
整型数组,则必须使用循环来复制此间接二维数组。
另一种方法是使用 2 个全局数组,并在计算每个新代后交换指针。
这是修改后的版本:
int **copyGrid; // assuming this pointer points to an allocated grid
void updateGrid(int **grid, int r, int c) {
// compute the new grid value in copyGrid
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
int alive = getState(grid, i, j);
int neighbours = countN(grid, i, j);
if (alive) {
if (neighbours < 2 || neighbours > 3)
copyGrid[i][j] = 0;
else
copyGrid[i][j] = 1;
} else {
if (neighbour == 3)
copyGrid[i][j] = 1;
else
copyGrid[i][j] = 0;
}
}
}
// copy the new grid value from copyGrid back to grid
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
grid[i][j] = copyGrid[i][j];
}
}
printGrid(grid, r, c);
}
关于arrays - 康威在 C 语言中使用 malloc 数组进行的生命游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72587288/