0

私が作成したアルゴリズム (コンウェイのライフ ゲームのルールの実装) は、コンウェイの GoL と一致しません。できることはすべて試しましたが、一致しません。

さらに、誰かがそれを無限平面にする方法、またはおそらくそれ自体をラップする方法を知っている場合は、私のコードで実装することに興味があります!

JSFiddle の実行: http://jsfiddle.net/jGkKF/2/

関連コード:

生きた細胞の周囲の細胞をチェックする: (28行目)

var   x2 = x+1,   x3 = x-1,   y2 = y+1,   y3 = y-1;     // Math
if(tC[x][y3] !== undefined && tC[x][y3]) ne++;          // T
if(tC[x][y2] !== undefined && tC[x][y2]) ne++;          // TR
if(tC[x2] !== undefined) {
    if(tC[x2][y]) ne++;                                 // R
    if(tC[x2][y3] !== undefined && tC[x2][y3]) ne++;    // BR
    if(tC[x2][y2] !== undefined && tC[x2][y2]) ne++;    // B
}
if(tC[x3] !== undefined) {
    if(tC[x3][y]) ne++;                                 // BL
    if(tC[x3][y3] !== undefined && tC[x3][y3]) ne++;    // L
    if(tC[x3][y2] !== undefined && tC[x3][y2]) ne++;    // TL
}

そしてアルゴリズム:(50行目)

if(cell && (ne < 2 || ne > 3)) cell = 0; // Over- or under- populated?
else if(!cell && ne == 3) cell = 1;      // Give life?
4

2 に答える 2

1

いくつかの項目:

  1. ゲームのルールでは、周囲の 8 つのマスすべてをチェックする必要があります。あなたのコードに基づいて、それらの 6 つだけをチェックしているようです。編集:OPは8つすべてをチェックしています。それでもポイント2をお勧めします。これにより、チェックされる各セルを一貫して処理できます。
  2. これを処理する最も簡単な方法は、チェックする必要があるセルのリストを設定し、そのリストに対してループを実行してカウントを行うことです。
  3. ラッピングリストを設定するには、セルのリストを設定するときに境界チェックコードを用意します。
    • cellIndex < 0 の場合、cellIndex == maxIndex
    • cellIndex >= maxIndex の場合、cellIndex = 0
  4. 「次の」世代を計算しようとしている間に「この」世代を表す値を更新すると発生する可能性がある「走査線」効果に注意する必要があります。この 2 つは個別に保管する必要があります。int の配列を使用している場合、これは単純に「この」世代を 0 と 1 として保存することを意味し、「次の」世代のライブ セルは 8 などを追加することで示すことができることに注意してください。現在の世代を処理した後、すべてを変更します > = 8 対 1 で、8 未満のセルはすべて 0 になります。
于 2014-04-09T14:09:00.793 に答える