【问题标题】:Conway's Game of Life (C) - Coordinates not Corresponding to 2D Array Indexing?Conway 的生命游戏 (C) - 坐标不对应于 2D 数组索引?
【发布时间】: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


【解决方案1】:

您正在为char * 数组保留空间,但在函数内部使用int **,更改为

int **world = malloc(sizeof(int *) * rows);
for (int i =0; i < rows; i++) {
    world[i] = malloc(sizeof(int) * columns);
}

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多