康威在C中的生命游戏

时间:2015-11-22 13:57:53

标签: c arrays conways-game-of-life

我在C中制作了一个conways游戏,使用了一个二维阵列,它应该环绕两侧。不幸的是,所发生的一切都是数字在1和0之间来回滑动,没有明确的模式。这是代码:     #include

int main(){
    int const WIDTH = 100;
    int const HEIGHT = 100;
    int const CYCLES = 1000;
    int grid[HEIGHT][WIDTH];
    int temp[HEIGHT][WIDTH];

    int row;
    int col;
    for(row = 0; row < HEIGHT; row++){
        for(col = 0; col < WIDTH; col++){
            grid[row][col] = 0;
        }
    }

    int i;
    int x;
    int y;
    int neighbours;
    for(i = 0; i < CYCLES; i++){
        for(row = 0; row < HEIGHT; row++){
            for(col = 0; col < WIDTH; col++){
                temp[row][col] = 0;
            }
        }
        for(row = 0; row < HEIGHT; row++){
            for(col = 0; col < WIDTH; col++){
                neighbours = 0;
                for(y = -1; y < 2; y++){
                    for(x = -1; x < 2; x++){
                        if(x != 0 && y != 0 && grid[(row + y) % HEIGHT][(col + x) % WIDTH] == 1){
                            neighbours++;
                        }
                    }
                }
                if(grid[row][col] == 1){
                    if(neighbours < 2 || neighbours > 3){
                        temp[row][col] = 0;
                    }else{
                        temp[row][col] = 1;
                    }
                }else if(grid[row][col] == 0){
                    if(neighbours == 3){
                        temp[row][col] = 0;
                    }else{
                        temp[row][col] = 1;
                    }
                }
            }
        }
        for(row = 0; row < HEIGHT; row++){
            for(col = 0; col < WIDTH; col++){
                grid[row][col] = temp[row][col];
                printf("%d", grid[row][col]);
            }
            printf("\n");
        }
        printf("\n");
    }
}

2 个答案:

答案 0 :(得分:1)

我注意到一个问题。

第4条规则规定,如果一个死细胞正好有3个邻居,它应该再次活着。目前,您的代码执行相反的操作

else if(grid[row][col] == 0){
    if(neighbours == 3){
        temp[row][col] = 0;
    }else{
        temp[row][col] = 1;
    }
}

如果确实有3个,那么这将使细胞死亡,并且当不是这种情况时将其保持活着。切换1和0,它应该工作。

答案 1 :(得分:0)

你计算邻居的方式是错误的(例如-1%HEIGHT怎么样?)。我想你想要使用圆环(最左边的列连接到最右边的列,相同的行连接),所以你需要为边框制作特殊情况。一个技巧是使用如下的模数。

假设您有一行N,然后对于x0的每个N-1计算mid=x+N,请将邻居设为{{1}然后使用left=mid-1right=mid+1grid(left%N)对邻居进行计数(当然,以相同的方式添加第二维)。因此,您将在没有任何特殊情况下捕获环面属性......

如果你想确保它按预期工作,我可以建议你将网格初始化为一个众所周知的GOL模式(例如一个简单的滑翔机)。

同时验证GOL规则是否正确。