игра в жизнь в C - PullRequest
       10

игра в жизнь в C

0 голосов
/ 19 ноября 2011

Я просто подумал, что смогу получить удовольствие от игры жизни Конвея, но серьезно борюсь ... что удивительно! Может кто-то может намекнуть на алгоритмические проблемы? Просто маленький толчок? Это не домашняя работа.

#include <stdio.h>
#include <stdlib.h>

#define HEIGHT 10
#define WIDTH 10

int *gb[HEIGHT];
int *gb2[HEIGHT];

void copy() {
  int i, j;
  for (i = j = 0; i < HEIGHT; i++) {
    for (; j < WIDTH; j++) {
      gb2[i][j] = gb[i][j];
    }
  }
}

void init() {
  int i, j;
  for (i = 0; i < HEIGHT; i++) {
    gb [i] = malloc(sizeof(int)*WIDTH);
    gb2[i] = malloc(sizeof(int)*WIDTH);
  }
  for (i = j = 0; i < HEIGHT; i++) {
    for (; j < WIDTH; j++) {
      gb [i][j] = 0;
    }
  }
  gb[0][0] = 1;
  gb[0][1] = 1;
  gb[1][0] = 1;
  gb[1][1] = 1;
  copy();
}

void printg() {
  int i, j;
  printf("    ");
  for (i = 0; i < WIDTH; i++) {
    printf("%2d  ", i);
  }
  printf("\n\n");
  for (i = 0; i < HEIGHT; i++) {
    printf("%d   ", i);
    for (j = 0; j < WIDTH; j++) {
      printf(" %c  ", gb2[i][j]?'+':'-');
    }
    printf("\n");
  }
}

void ckill(int i, int j) {
  gb2[i][j] = 0;
}

void clive(int i, int j) {
  gb2[i][j] = 1;
}

void newgen() {
  int i, j = i = 1, n = 0;
  for (; i < HEIGHT-1; i++) {
    for (j = 0; j < WIDTH-1; j++) {
      if (gb[i][j+1]) n++;
      if (gb[i+1][j]) n++;
      if (gb[i+1][j+1]) n++;
      if (gb[i-1][j-1]) n++;
      if (gb[i][j-1]) n++;
      if (gb[i-1][j]) n++;
      if (gb[i+1][j-1]) n++;
      if (gb[i-1][j+1]) n++;

      if (n < 2) ckill(i, j);
      else if ((n == 2 || n == 3) && gb[i][j]) clive(i, j);
      else if (n > 3) ckill(i, j);
      else if (n == 3 && gb[i][j] == 0) clive(i, j);
    }
  }
}

int main() {
  int i;
  init();
  newgen();
  printg();
  for (i = 0; i < HEIGHT; i++) {
    free(gb[i]);
  }
}

Это не требует ввода, но начинается с живых клеток в (0, 0), (0, 1), (1, 0) и (1, 1). После одного поколения он должен остаться прежним, но вместо этого убивает клетки, так что только (0, 0) и (1, 0) живы.

1 Ответ

5 голосов
/ 20 ноября 2011

В функциях init и copy есть двойной цикл. Счетчик внутреннего цикла j должен быть инициализирован во внутреннем цикле, а не во внешнем.

В функции newgen вы проверяете соседние ячейки, все восемь из них, даже если ячейка находится на краю матрицы. Это приводит к получению доступа к связанным данным и неопределенному поведению.

Небольшая заметка. Попробуй сделать хороший код, не пытайся быть умным. Инициализирующий счетчик цикла вне цикла пытается быть умным (но терпит неудачу).

...