为什么我的康威生命游戏表现得很奇怪

Why is my Conway's Game of Life acting strangely?

本文关键字:我的 康威 生命 游戏 为什么      更新时间:2023-09-26

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

这是它的基本内容:

  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();
    }
  };

所有正在运行的功能都经过了彻底的测试,似乎可以按预期工作。但是当它运行时,"活着"的方块似乎比它们应该更容易溢出屏幕。特别是当一列被制成三个图块高时,当它应该同时在两侧产生两个"活动"图块时,它会在下一帧中消失。

我怀疑这与操作顺序有关。我是否需要为状态更改"标记"适当的磁贴,而不是当场更改它们?我知道那里有很多Conway的实现,但我正在尝试自己开发它。也就是说,任何朝着正确方向的推动将不胜感激。谢谢!

你可以在这里看到它的实际效果:http://www.eggborne.com/tiles

据我所知,这是因为您在迭代时更改了瓦片图。

例如,我假设.comeToLife()方法将字段更改为true .alive,如果.neighborsAlive()返回非缓存值,但计算周围的.alive块,那么您本质上是在迭代时更改您的游戏场地,新更改的单元格会破坏整个画面。

最简单的解决方案是创建"旧"和"新"

瓦片,并迭代"旧"图块,同时仅对"新"进行更改。缓存"neighborsAlive"本质上是创建两个数组,只是方式不同 - 这样你也创建了一个瓦片地图,每个瓦片保存一个值,说明此时有多少邻居处于活动状态 - 你必须在其他一切改变之前确定这个值。如果您不这样做,您将遇到与当前相同的问题。

为了演示您的问题,请随着每次磁贴更改而更新您的游戏场地 - 您将看到您的问题动画:)

希望这对您的问题有所帮助。