Проблемы игры Конвейс - PullRequest
       11

Проблемы игры Конвейс

1 голос
/ 17 января 2010

Я пишу жизненную игру Конвея для школы. В программе у меня проблемы с массивами, принимающими значения, которые я им назначаю. В какой-то момент в программе они распечатывают присвоенное им значение (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 ]

3 голосов
/ 17 января 2010

Вы определяете свои массивы как [12] [12].

В цикле генерации вы идете от i = 0 до i <= 12, что составляет 13 шагов вместо 12 массива.Кроме того, вы пытаетесь получить доступ к x-1 и y-1, которые могут быть как -1.Опять же, не внутри вашего массива. </p>

Иногда вы получаете полуполезные значения из вашего массива, но на некоторых границах вы просто получаете случайные данные.

Попробуйте исправить вашу границу.

2 голосов
/ 17 января 2010

Вы забыли установить neighbors в 0, прежде чем считать их.

Поскольку это C ++ (не C), вы также можете объявить neighbors внутри тела цикла. Облегчает обнаружение подобных проблем.

Кроме того, это я или цикл while никогда не закончится? Твои брекеты вообще беспорядок, как и твои отступы. Вы можете сделать себе и нам одолжение, убрав их.

1 голос
/ 08 января 2013

Очевидно согласен со всеми вышеперечисленными предложениями. Один хороший трюк, который вы, возможно, захотите реализовать с помощью Life, - создать дополнительную границу вокруг вашей области. Поэтому, если пользователь хочет сетку 12x12 (и вы должны разрешить указание ширины / высоты и динамически выделять память), вы удерживаете сетку 14x14, соответствующую границе вокруг фактической сетки. Перед выполнением расчета скопируйте верхний ряд в нижнюю границу, нижний ряд в верхнюю границу и т. Д. Теперь вы можете запустить основной алгоритм на внутренней сетке 12x12, не беспокоясь о крайних случаях. Это позволит вашим шаблонам вновь появиться на другой стороне, если они упадут с края.

0 голосов
/ 17 января 2010

Вы также забываете установить значения обоих массивов на ноль. Это позаботится о нелепой проблеме с числом. Вы можете сделать это, скопировав цикл 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]);

Я бы также рекомендовал помещать printf с новой строкой (\ n) после печати каждой строки и вкладкой (\ t) после каждого элемента, чтобы форматирование выглядело чище.

...