我在 JavaScript 中实现了 Conway 的生命游戏,但我没有看到与 Gosper 的 Glider Gun 相同的模式。我按照 Wikipedia 文章中描述的方式为网格播种,但是,枪从来没有发生过。
有人会查看我的代码,看看它是否有任何问题,对实施有什么建议吗?
我在 JavaScript 中实现了 Conway 的生命游戏,但我没有看到与 Gosper 的 Glider Gun 相同的模式。我按照 Wikipedia 文章中描述的方式为网格播种,但是,枪从来没有发生过。
有人会查看我的代码,看看它是否有任何问题,对实施有什么建议吗?
您不是同时更新所有单元格,而是按顺序更新。在第一代出生的细胞不会在第一代其他细胞的计算中显示为活着(它仍然算作死亡)。
创建一个名为 willBeAlive 的新属性,并使用它来保存单元格的新计算活动状态。完成该代的所有计算后,将每个单元格的 live 属性设置为其 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's Glider Gun”的种子数组:
[[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]]