为什么康威的生命游戏表现奇怪?

时间:2014-04-01 09:47:19

标签: javascript conways-game-of-life

我正在尝试复制康威的生命游戏,虽然我的代码似乎是犹太人,但似乎不应该像它应该的那样。

这是它的基本内容:

  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

1 个答案:

答案 0 :(得分:2)

据我所知,这是因为你在迭代时更改了tilemap。

E.g。我假设.comeToLife()方法将.alive字段更改为true,如果.neighborsAlive()返回非缓存值,但计算.alive个图块,则实质上是在改变您的迭代时的游戏场,新改变的细胞破坏了整个画面。

最简单的解决方案是创建“旧”和“新”平铺贴图,并迭代“旧”贴图,同时仅对“新”贴图进行更改。缓存'neighborsAlive'本质上是以不同的方式创建两个数组 - 这样你也创建了一个tilemap,每个tile都保存了此时有多少邻居活着的值 - 你必须在所有事情之前确定这个值别的变化。如果不这样做,您将遇到与目前相同的问题。

为了演示您的问题,请在每次更改瓷砖时更新您的运动场 - 您将看到问题的动画:)

希望这有助于解决您的问题。