2015-11-22 2 views
1

Я сделал версию игры в жизни conways в C, используя 2d-массив, который должен обернуться вокруг сторон. К сожалению, все, что происходит, это цифры, которые перемещаются взад и вперед между 1 и 0 без четкого рисунка. Вот код: #include Игра жизни Конвея в C

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"); 
    } 
} 
+1

Теперь я просматриваю код проблемы, но я предлагаю сделать некоторые функции, чтобы сделать это более читаемым. –

ответ

1

Я замечаю одну проблему.

В четвертом правиле говорится, что мертвая ячейка должна снова ожить, если она имеет ровно 3 соседей. В настоящее время, ваш код делает противоположное

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

Это оставит клетку мертвым, если есть ровно 3 и сделать его живым, когда это не так. Переключите 1 и 0, и он должен работать.

0

Путь считать своих соседей ложно (насчет -1%HEIGHT, например ???). Я предполагаю, что вы хотите использовать тор (крайний левый столбец подключен к самому крайнему столбцу и тот же для строк), поэтому вам нужно делать специальные случаи для границ. Трюк заключается в использовании модуля, например, следующего.

Предположим, у вас есть строка длиной N, то для каждого x из 0 в N-1, вычислить mid=x+N, получить соседей, как left=mid-1 и right=mid+1, затем подсчитывать соседей grid(left%N), grid(mid%N), grid(right%N) (добавить второе измерение так же, конечно,). Таким образом, вы поймаете свойство тора без каких-либо особых случаев ...

Если вы хотите быть уверены, что он работает должным образом, я могу предложить вам инициализировать сетку на хорошо известном шаблоне GOL (простой планер для пример).

Также убедитесь, что правила GOL являются правильными.