私はJavaScriptでConwayのGame of Lifeを実装しましたが、Gosper's Glider Gunなどの同じパターンは表示されません。私はWikipediaの記事に描かれている方法でグリッドを蒔くが、銃は決して起こらない。JavaScriptとHTML5キャンバスに実装されたセルオートマトン
誰かが自分のコードを見て、何か間違っているかどうか、実装への提案はありますか?
https://github.com/DiegoSalazar/ConwaysGameOfLife
私はJavaScriptでConwayのGame of Lifeを実装しましたが、Gosper's Glider Gunなどの同じパターンは表示されません。私はWikipediaの記事に描かれている方法でグリッドを蒔くが、銃は決して起こらない。JavaScriptとHTML5キャンバスに実装されたセルオートマトン
誰かが自分のコードを見て、何か間違っているかどうか、実装への提案はありますか?
https://github.com/DiegoSalazar/ConwaysGameOfLife
あなたはむしろ順次、同時に細胞のすべてを更新していません。第1世代で生まれた細胞は、第1世代の他の細胞の計算には生き残っていません(まだ死んでいると見なされます)。
willBeAliveという名前の新しいプロパティを作成し、それを使用してセルの新しい計算されたアライブ状態を保持します。その世代のすべての計算が完了したら、各セルのaliveプロパティをそのwillBeAliveプロパティに設定して再描画します。ここで
は変更されている:
Automaton.prototype.update = function() {
for (var x = 0; x < this.w; x++) {
for (var y = 0; y < this.h; y++) {
this.grid[x][y].killYourselfMaybe();
}
}
// set the alive property to willBeAlive
for (var x = 0; x < this.w; x++) {
for (var y = 0; y < this.h; y++) {
this.grid[x][y].alive = this.grid[x][y].willBeAlive;
}
}
}
Cell.prototype.killYourselfMaybe = function(grid) {
var num = this.numLiveNeighbors();
this.willBeAlive = false;
if (this.alive) {
// 1. Any live cell with fewer than two live neighbours dies, as if caused by under-population.
if (num < 2) this.willBeAlive = false;
// 2. Any live cell with two or three live neighbours lives on to the next generation.
if (num == 2 || num == 3) { this.willBeAlive = true}
// 3. Any live cell with more than three live neighbours dies, as if by overcrowding.
if (num > 3) this.willBeAlive = false;
} else {
// 4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
if (num == 3) this.willBeAlive = true;
}
}
、ここでは "Gosperのグライダーガン" のためのシード配列である:
[[2,6],[2,7],[3,6],[3,7],[12,6],[12,7],[12,8],[13,5],[13,9],[14,4],[14,10],[15,4],[15,10],[16,7],[17,5],[17,9],[18,6],[18,7],[18,8],[19,7],[22,4],[22,5],[22,6],[23,4],[23,5],[23,6],[24,3],[24,7],[26,2],[26,3],[26,7],[26,8],[36,4],[36,5],[37,4],[37,5]]
恐ろしいですが、私が問題を認識するとすぐに、正しい解決策を使ってStackoverflowから電子メールを受け取ります!笑、うーん、私はそれを理解して、あなたがそれを確認してうれしいです。 Gosperのシード配列をありがとう! 変更をアップロードしてコメントしたい場合は、https://github.com/DiegoSalazar/ConwaysGameOfLifeに変更をアップロードしました。再度、感謝します! – DiegoSalazar
いくつかの一般的な提案は、 '==='使用して、実際そのされています'x? true:false'は '!! x'になります。それ以外は、これが私が恐れている非常に具体的な質問ではないと思います。 – pimvdb
私はそれがアルゴリズムの振る舞いを捨ててしまうかもしれないような小さな矛盾(平等のテスト、または1や何かによる)があるかもしれないと思っていました。私は===を使って試してみるつもりですが、どこで具体的に使うべきですか? – DiegoSalazar
一般的には、本当に必要な場合は、 '==='を '=='と一緒に使ってください。より堅牢なコーディングスタイルの問題です。おそらくバグを明示的に修正するものではありません。 – pimvdb