我正在尝试复制康威的生命游戏,虽然我的代码似乎是犹太人,但似乎不应该像它应该的那样。
这是它的基本内容:
if (pressingSpace) {
running = true;
} else {
running = false;
};
if (running) {
for (var i=0; i<tiles.length; i++) {
var tile = tiles[i];
if (tile.alive && (tile.neighborsAlive() < 2 || tile.neighborsAlive() > 3)) {
tile.die();
};
if (!tile.alive && tile.neighborsAlive() == 3) {
tile.comeToLife();
};
};
};
for (var i=0; i<tiles.length; i++) {
var key = tiles[i];
if (!key.alive && mouseDown && key.sprite.contains([cursorX,cursorY]) && cursorX != null) {
key.comeToLife();
}
};
所有正在运行的功能都经过全面测试,似乎按预期工作。但是当它运行时,&#34; alive&#34;正方形似乎比它们应该更容易超出屏幕。特别是当一个柱子被制成三个高的瓷砖时,它会在下一个框架上消失,根据规则,它应该产生两个&#34; alive&#34;同时在两边的瓷砖。
我怀疑这与操作顺序有关。我是否需要&#34;标记&#34;适当的瓷砖改变状态,而不是当场改变它们?我知道Conway有很多实现,但我试图在我自己的基础上开发它。也就是说,任何正确方向的推动都会受到高度赞赏。谢谢!
您可以在此处看到它:http://www.eggborne.com/tiles
答案 0 :(得分:2)
据我所知,这是因为你在迭代时更改了tilemap。
E.g。我假设.comeToLife()
方法将.alive
字段更改为true
,如果.neighborsAlive()
返回非缓存值,但计算.alive
个图块,则实质上是在改变您的迭代时的游戏场,新改变的细胞破坏了整个画面。
最简单的解决方案是创建“旧”和“新”平铺贴图,并迭代“旧”贴图,同时仅对“新”贴图进行更改。缓存'neighborsAlive'本质上是以不同的方式创建两个数组 - 这样你也创建了一个tilemap,每个tile都保存了此时有多少邻居活着的值 - 你必须在所有事情之前确定这个值别的变化。如果不这样做,您将遇到与目前相同的问题。
为了演示您的问题,请在每次更改瓷砖时更新您的运动场 - 您将看到问题的动画:)
希望这有助于解决您的问题。