【问题标题】:game of life in CC中的生活游戏
【发布时间】:2011-11-19 08:56:21
【问题描述】:

我只是想试试康威的生命游戏,但我真的很挣扎……这真是一个惊喜!有人可以暗示算法问题吗?只是轻轻一推?这不是家庭作业。

#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) 还活着。

【问题讨论】:

  • 您有什么特别希望我们看的吗?否则,这可能会因为不是一个真正的问题而被关闭。在 codereview 上可能会更好。
  • 您遇到了什么问题?你的输入是什么?你的预期输出是什么?你的实际输出是多少?
  • 考虑到您的代表,我原以为您会意识到有必要解释什么不起作用。
  • 啊,对不起,伙计们。你说的对。我编辑了,希望你看看我在newgen中的内容@
  • 我投票支持重新开放,这个问题没有错(现在)

标签: c algorithm cell conways-game-of-life


【解决方案1】:

在函数initcopy 中有一个双循环。内循环的计数器j 应该在内循环中初始化,而不是在外循环中。

在函数newgen 中,您正在检查相邻的单元格,所有八个单元格,即使单元格位于矩阵的边缘。这会导致访问超出范围的数据和未定义的行为。

一个小笔记。尝试编写好的代码,不要试图变得聪明。在循环之外初始化循环计数器试图变得聪明(但失败了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2011-01-30
    • 2021-11-22
    相关资源
    最近更新 更多