-1

因此,代码正在编译并完美运行。但是,通常,康威的生命游戏会在一段时间后稳定下来,而这段代码会无限期地运行,而不会出现死分支,如果有人能帮助我找出原因,我会很高兴。

int[][] world;
int SCALE_FACTOR = 4;
float DENSITY = 0.1;

void setup() {
  size(500,500);
  world = new int[width/SCALE_FACTOR][height/SCALE_FACTOR];
  for(int i = 0; i < width/SCALE_FACTOR; i++) {
    for (int j = 0; j < height/SCALE_FACTOR; j++) {
      int r = (int)random(100);
      world[i][j] = r % (int)(1/DENSITY) == 0 ? 1 : 0;
    }
  }
  frameRate(1);
  stroke(0, 255, 0);
}

void draw() {
  scale(SCALE_FACTOR);
  background(0);
  for(int i = 0; i < width/SCALE_FACTOR; i++) {
    for (int j = 0; j < height/SCALE_FACTOR; j++) {
      if (world[i][j] == 1) point(i, j);
    }
  }
  lifeCycle();    
}

void lifeCycle() {
  int[][] newworld = new int[width/SCALE_FACTOR][height/SCALE_FACTOR];
  for(int i = 0; i < width/SCALE_FACTOR; i++) {
    for (int j = 0; j < width/SCALE_FACTOR; j++) {
      if (world[i][j] == 1) {
        if (neighbours(i, j) == 3) {
          newworld[i][j] = 1;
        } else {
          newworld[i][j] = 0;
        }
      } else {
        if (neighbours(i, j) == 2 || neighbours(i, j) == 3) {
          newworld[i][j] = 1;
        } else {
          newworld[i][j] = 0;
        }
      }
    }
  }
  for (int i = 0; i < width/SCALE_FACTOR; i++) {
    for (int j = 0; j < height/SCALE_FACTOR; j++) {
      world[i][j] = newworld[i][j];
    }
  }
}

int neighbours(int x, int y) {
  int px = (x == width/SCALE_FACTOR - 1) ? 0 : (x+1);
  int py = (y == height/SCALE_FACTOR - 1) ? 0 : (y+1);
  int mx = (x == 0) ? (width/SCALE_FACTOR - 1) : (x-1);
  int my = (y == 0) ? (height/SCALE_FACTOR - 1) : (y-1);
  return world[mx][my] + world[mx][y] + world[mx][py]
    + world[x][my] + world[x][py]
    + world[px][my] + world[px][y] + world[px][py];
}
4

1 回答 1

1

好吧,这看起来是错误的:

for (int j = 0; j < width/SCALE_FACTOR; j++) {

当然应该是这样height

下一步:目前你的逻辑是,“如果广场之前是活着的,只有在它有三个邻居的情况下,它才在下一轮活着;如果它之前是死的,如果它有两三个邻居,它在下一轮是活着的。” 这是错误的方式。创造生命需要三个活着的邻居,但维持生命只需要两三个邻居。

这就是我可以立即看到的所有问题,但是关于诊断问题的提示:

  • 我强烈建议保持和width游戏术语而不是像素大小,我认为这是本意。绘制时按比例放大单位但根据实际网格元素保留所有逻辑。heightSCALE_FACTOR
  • 如果您将 UI 与“业务逻辑”隔离开来,您可以轻松地对其进行单元测试。
  • 当您使用 UI 显示板时,您可能希望为其提供“手动前进”模式,以便您可以更轻松地准确查看正在发生的事情。
于 2013-02-28T19:20:03.190 回答