You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可以仅使用单个数组实现康威生命游戏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. 统计邻居存活数量时,只要邻居的状态值为奇数(1和2都是当前存活状态)就算入存活邻居
  2. 遍历所有细胞根据规则设置过渡状态:
    • 当前状态为1(存活):邻居数为2或3时保持1,否则设为2
    • 当前状态为0(死亡):邻居数为3时设为3,否则保持0
  3. 所有细胞过渡状态设置完成后,再遍历一次数组,每个值对2取余,就能得到下一世代的0/1状态
    这种方案全程只需要使用单个数组,不需要额外的拷贝数组,内存占用比双数组方案低一半,在超大网格模拟场景下优势更明显。

内容的提问来源于stack exchange,提问作者noah1400

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:06:02