康威的生命游戏阵列问题

时间:2010-01-16 23:05:03

标签: visual-c++ conways-game-of-life

我正在为学校写一个康威的生活游戏。在程序中,我遇到了数组,我正在分配它们的值。在程序的某一点上,他们打印出分配给他们的值(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;
}

4 个答案:

答案 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),以使格式看起来更清晰。