我在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");
}
}
答案 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
,然后对于x
到0
的每个N-1
计算mid=x+N
,请将邻居设为{{1}然后使用left=mid-1
,right=mid+1
,grid(left%N)
对邻居进行计数(当然,以相同的方式添加第二维)。因此,您将在没有任何特殊情况下捕获环面属性......
如果你想确保它按预期工作,我可以建议你将网格初始化为一个众所周知的GOL模式(例如一个简单的滑翔机)。
同时验证GOL规则是否正确。