【发布时间】:2018-01-28 16:46:26
【问题描述】:
我正在尝试用 C 编写康威的生命游戏。我创建了一个代表细胞的二维数组。我尝试使用坐标系统来解决游戏。
我编写了一个函数来创建一个数组,该数组强制所有可能的邻居坐标组合。
然后我使用双重嵌套 for 循环遍历二维单元格数组,并计算死亡和活着的相邻单元格的数量。
我有一个条件来检查相邻单元格是活的、死的还是不存在的(如果游戏中的单元格位于数组的边缘或角落,就会发生这种情况)。
唯一的问题是,无论我尝试什么,我总是计算错误的活细胞和死细胞数量,从而导致后续的错误生成。
我很确定这是因为我用来跟踪单元格的坐标系统与数组不对应。 (我试图解决这个问题,但失败了)
我的问题是,访问二维数组中特定单元格的正确方法是什么,使得数组的行和列对应于 x 和 y 轴?
void bruteforceNeighbors(int ** coord, int i, int j){
array[0][0] = i-1;
array[0][1] = j-1;
array[1][0] = i-1;
array[1][1] = j;
array[2][0] = i-1;
array[2][1] = j+1;
array[3][0] = i;
array[3][1] = j-1;
array[4][0] = i;
array[4][1] = j+1;
array[5][0] = i+1;
array[5][1] = j-1;
array[6][0] = i+1;
array[6][1] = j;
array[7][0] = i+1;
array[7][1] = j+1;
}
//world is the 2d array
char ** world = (char **)malloc(sizeof(char *)*rows);
for (int i =0;i < rows; i++){
world[i] = (char *) malloc(sizeof(char)*columns);
}
【问题讨论】:
-
array[0][0] = i-1;这样的行应该做什么? -
在调用任何堆分配函数(malloc、calloc、realloc)时 1) 始终检查 (!=NULL) 返回值以确保操作成功。 2)返回的类型是
void*,可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等。 -
表达式:
sizeof(char)在 C 标准中定义为 1。任何东西乘以 1 都没有效果。建议将该表达式从参数中删除到malloc() -
如果您有
enum例如:enum { dead, alive };,那么您可以在代码中使用名称dead和alive来初始化和测试邻居。
标签: c arrays conways-game-of-life