是否可以仅使用单个数组实现康威生命游戏Conway's Game of Life
康威生命游戏单数组实现问题
原有实现说明
我已经使用C语言实现了康威生命游戏(Conway's Game of Life),代码如下:
#include <stdio.h> int main(int argc, char *argv[]) { char field[20][20] = {0}; //game field char cpy[20][20] = {0}; //copy of game field int gens; //number of generations scanf("%d", &gens);//input by user while(1){ //runs till 'break;' char c; scanf(" %c", &c); //read next char if(c == 'a'){//break at char 'e' int i,j; scanf("%d %d",&i,&j);//scan coordinates field[j][i] = 1; //setting cell to state alive }else{ break; } } //calculate and print generations for(int i = 0; i <= gens; i++){ printf("-- Generation: %d\n",i); //iterating over each cell for(int k = 0; k < 20;k++){ for(int l = 0; l < 20; l++){ //print current generation if(field[k][l] == 1){ printf("%c",'#');//alive }else{ printf("%c",'.');//dead } //counting neighbors of field[k][l] int neighbors = 0; for(int y = -1; y < 2; y++){ for(int x = -1; x < 2; x++){ if(!(x == 0 && y == 0)){ if( k + y < 20 && k + y >= 0 && l + x < 20 && l + x >= 0){ if(field[k+y][l+x] == 1){ neighbors++; } } } } } //rules //Any live cell with two or three live neighbours survives. //Any dead cell with three live neighbours becomes a live cell. //All other live cells die in the next generation. Similarly, all other dead cells stay dead. if(field[k][l] == 1 && (neighbors == 2 || neighbors == 3)){ cpy[k][l] = 1; }else if(field[k][l] == 0 && neighbors == 3){ cpy[k][l] = 1; }else if(field[k][l] == 1){ cpy[k][l] = 0; } } printf("\n"); } //setting gamefield to new generation for(int a = 0; a < 20; a++){ for(int b = 0; b < 20; b++){ field[a][b] = cpy[a][b]; } } } return 0; }
用户输入示例如下:
3 a 9 9 a 9 10 a 9 11 e
输入规则:第一个数字为需要模拟的世代数,之后用户可以输入字符a加x、y坐标将对应单元格设置为存活状态,输入字符e结束输入。
提问内容
当前代码使用了两个数组,一个存储当前世代的细胞状态,另一个存储下一世代的细胞状态。出于兴趣,是否可以仅使用单个数组实现完整的康威生命游戏功能?
解答
可以实现,核心思路是扩展细胞的状态标识,避免修改后的状态干扰当前世代的邻居计数。
原来的数组只用到了0(死亡)、1(存活)两个状态,我们可以新增两个过渡状态:
- 2:当前存活,下一世代死亡
- 3:当前死亡,下一世代存活
具体实现逻辑如下:
- 统计邻居存活数量时,只要邻居的状态值为奇数(1和2都是当前存活状态)就算入存活邻居
- 遍历所有细胞根据规则设置过渡状态:
- 当前状态为1(存活):邻居数为2或3时保持1,否则设为2
- 当前状态为0(死亡):邻居数为3时设为3,否则保持0
- 所有细胞过渡状态设置完成后,再遍历一次数组,每个值对2取余,就能得到下一世代的0/1状态
这种方案全程只需要使用单个数组,不需要额外的拷贝数组,内存占用比双数组方案低一半,在超大网格模拟场景下优势更明显。
内容的提问来源于stack exchange,提问作者noah1400
相关产品推荐
相关产品推荐

