2

Java で作成した Game of Life アプリケーションのロジック コードは次のとおりです。ルールがデフォルトのコンウェイのライフ ゲーム ルールのように機能しないという問題があります。私はウィキペディアでそれらを読みましたが、それらは次のとおりです。

  • 生きている隣人が 2 つ未満の生きているセルは、人口不足が原因であるかのように死にます。
  • 2 つまたは 3 つの生きた隣人を持つ生きたセルは、次の世代に生き続けます。
  • 生きている隣人が 3 つ以上いる生きているセルは、過密状態のように死にます。
  • ちょうど 3 つの生きている隣接セルを持つ死んだセルは、再生によって生きているセルになります。

これらのルールを次のコードで複製しようとしましたが、通常のコンウェイのライフ ゲームとは異なります。

int surroundingLife = 0;
if (lifeMap[cX+1][cY]) { //Right
    surroundingLife++;
}
if (lifeMap[cX-1][cY]) { // Left
    surroundingLife++;
}
if (lifeMap[cX][cY+1]) { // Above
    surroundingLife++;
}
if (lifeMap[cX][cY-1]) { // Below
    surroundingLife++;
}
if (lifeMap[cX-1][cY-1]) { // Bottom left
    surroundingLife++;
}
if (lifeMap[cX+1][cY+1]) { // Top Right
    surroundingLife++;
}
if (lifeMap[cX-1][cY+1]) { // Some other corner (I don't know which one)
    surroundingLife++;
}
if (lifeMap[cX+1][cY-1]) { // Yet another corner (I don't know which one)
    surroundingLife++;
}
if (running) {
    // Logic for life
    if (surroundingLife < 2 && lifeMap[cX][cY]) {// Rule 1. Any live cell with fewer than two live neighbours dies, as if caused by under-population.
        lifeMap[cX][cY] = false;
    } else if (surroundingLife == 2 && lifeMap[cX][cY]) { // Rule 2. Any live cell with two or three live neighbours lives on to the next generation.
        lifeMap[cX][cY] = true;
    } else if (surroundingLife == 3 && lifeMap[cX][cY]) { // Rule 3. Same as above
        lifeMap[cX][cY] = true;
    } else if (surroundingLife > 3 && lifeMap[cX][cY]) { // Rule 4. Any live cell with more than three live neighbours dies, as if by overcrowding.
        lifeMap[cX][cY] = false;
    } else if (surroundingLife == 3 && !lifeMap[cX][cY]) { // Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
        lifeMap[cX][cY] = true;
    }
}   

これは、数世代実行した後の様子です。

GameOfBugs、または BugsOfLife。

奇妙な「迷路」ルールセットを思い起こさせます。

エンティティの周囲に 8 つの他のエンティティがある場合、8 が返されるため、soundingLife 計算機に問題があるとは思いません。Y をループしてから X をループするのが原因ですか?

4

1 に答える 1

10

問題は、何を変更する必要があるかを評価しているのと同じパスでグリッドを変更していることです。セルを変更するたびに、そのセルに隣接する同じパス内の将来のすべてのテストの結果に影響を与えます。

グリッドのコピーを作成する必要があります。常にそのコピーからテスト (読み取り) し、オリジナルに変更を適用 (書き込み) します。

于 2013-01-03T15:58:00.450 に答える