我正在为学校写一个康威的生活游戏。在程序中,我遇到了数组,我正在分配它们的值。在程序的某一点上,他们打印出分配给他们的值(1)但是在程序结束时,当我需要打印数组来显示游戏的迭代时,它显示了一个非常低的数字。另一个麻烦是我在进入一个循环时会遇到困难,这个循环会询问它是否要你运行另一个迭代。所以我删除它,直到修复以前的错误。 我用C ++写这个
#include <stdio.h>
int main (void)
{
int currentarray [12][12];
int futurearray [12][12];
char c;
char check = 'y';
int neighbors = 0;
int x = 0; // row
int y = 0; //column
printf("Birth an organism will be born in each empty location that has exactly three neighbors.\n");
printf("Death an organism with four or more organisms as neighbors will die from overcrowding.\n");
printf("An organism with fewer than two neighbors will die from loneliness.\n");
printf("Survival an organism with two or three neighbors will survive to the next generation.\n");
printf( "To create life input x, y coordinates.\n");
while ( check == 'y' )
{
printf("Enter x coordinate.\n");
scanf("%d", &x ); while((c = getchar()) != '\n' && c != EOF);
printf("Enter y coordinate.\n");
scanf("%d", &y ); while((c = getchar()) != '\n' && c != EOF);
currentarray [x][y] = 1;
printf ("%d\n", currentarray[x][y]);
printf( "Do you wish to enter more input? y/n.\n");
scanf("%c", &check); while((c = getchar()) != '\n' && c != EOF);
}
// Note - Need to add a printf statement showing the array before changes are made after input added.
// check for neighbors
while(check == 'y')
{
for(y = 0; y <= 12; y++)
{
for(x = 0; x <= 12; x++)
{
//Begin counting number of neighbors:
if(currentarray[x-1][y-1] == 1) neighbors += 1;
if(currentarray[x-1][y] == 1) neighbors += 1;
if(currentarray[x-1][y+1] == 1) neighbors += 1;
if(currentarray[x][y-1] == 1) neighbors += 1;
if(currentarray[x][y+1] == 1) neighbors += 1;
if(currentarray[x+1][y-1] == 1) neighbors += 1;
if(currentarray[x+1][y] == 1) neighbors += 1;
if(currentarray[x+1][y+1] == 1) neighbors += 1;
//Apply rules to the cell:
if(currentarray[x][y] == 1 && neighbors < 2)
futurearray[x][y] = 0;
else if(currentarray[x][y] == 1 && neighbors > 3)
futurearray[x][y] = 0;
else if(currentarray[x][y] == 1 && (neighbors == 2 || neighbors == 3))
futurearray[x][y] = 1;
else if(currentarray[x][y] == 0 && neighbors == 3)
futurearray[x][y] = 1;
}
}
}
// Set the current array to the future and change the future to 0
{
for(y = 0; y < 12; y++)
{
for(x = 0; x < 12; x++)
{
//Begin the process
currentarray [x][y] = futurearray [x][y];
futurearray [x][y] = 0;
}
}
}
{
for(y = 0; y < 12; y++)
{
for(x = 0; x < 12; x++)
{
//print the current life board
printf("%d ", currentarray[x][y]);
}
}
}
// Have gone through one iteration of Life
//Ask to do another iteration
printf("Do you wish to continue y/n?\n");
scanf("%c", &check); while((c = getchar()) != '\n' && c != EOF);
return 0;
}
答案 0 :(得分:3)
您将阵列定义为[12] [12]。
在你的生成循环中,你从i = 0走到i&lt; = 12,这是13步而不是数组的12。此外,您正在尝试访问x-1和y-1,它可以低至-1。再次不在你的数组内。
有时您会从数组中获得半有用的值,但在某些边界上您只是访问随机数据。
尝试纠正边框。
答案 1 :(得分:2)
在计算它们之前,您忘记将neighbors
设置为0.
因为这是C ++(而不是C),所以你也可以在循环体内声明neighbors
。使这些问题也更容易被发现。
另外,是我,还是while
循环永远不会完成?一般来说,你的牙套是一团糟,你的缩进也是如此。你可以通过清理它们来帮助我们自己和我们。
答案 2 :(得分:1)
显然同意上述所有建议。您可能希望在Life中实现的一个好方法是在您的区域周围创建一个额外的边框。因此,如果用户想要12x12网格(并且您应该允许指定宽度/高度并动态分配内存),则在内部保持14x14网格对应于实际网格周围的边框。在运行计算之前,将顶行复制到底部边框,将底行复制到顶部边框等。现在,您可以在内部12x12网格上运行主算法,而无需担心边缘情况。如果图案从边缘掉落,这将使您的图案重新出现在另一边。
答案 3 :(得分:0)
您还忘记将两个数组的值都设置为零。这将解决您所遇到的荒谬数字问题。你可以通过复制for for循环来做到这一点:
for(y = 0; y < 12; y++)
{
for(x = 0; x < 12; x++)
{
//Begin the process
currentarray [x][y] = futurearray [x][y];
futurearray [x][y] = 0;
}
}
并在while循环之前粘贴它,但不是设置currentarray [x] [y] = futurearray [x] [y],而是将其设置为0.此外,如果坐标是可视位置而不是数组坐标,你想要改变这个:
printf ("%d\n", currentarray[x][y]);
到此:
printf ("%d\n", currentarray[x-1][y-1]);
我还建议在每行打印后使用换行符(\ n)放置一个printf,并在每个项目后放置一个标签(\ t),以使格式看起来更清晰。