-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

次のステップ:現在、あなたの論理は、「正方形が以前に生きていた場合、3人の隣人がいる場合にのみ次のラウンドで生きています。前に死んでいた場合、2人または3人の隣人がいる場合は次のラウンドで生きています。」それは間違った方法です。生命を生み出すには3人の隣人が必要ですが、生命を維持するには2、3人の隣人しかいません。

それが間違っていることがすぐにわかりますが、問題を診断するためのヒントは次のとおりです。

  • ピクセルサイズではなく、ゲーム用語でwidth維持するheightことを強くお勧めします。描画時に単位拡大しますが、実際のグリッド要素に関してすべてのロジックを保持します。SCALE_FACTOR
  • UIを「ビジネスロジック」から分離すると、簡単に単体テストを行うことができます。
  • UIを使用してボードを表示している場合は、「手動アドバンス」モードを指定して、何が起こっているかをより簡単に正確に確認できるようにすることができます。
于 2013-02-28T19:20:03.190 に答える