康威的人生游戏规则

时间:2019-04-15 18:59:24

标签: javascript conways-game-of-life

我知道这有点含糊,但我一直在尝试在JS中实施Conway的人生游戏规则,但我得到的结果是一团糟(不是正确的Conway的人生游戏框架) 。谁能告诉我我执行规则有什么问题?

      // Update state of selected cell
      if ((neighbours < 2) && (cells[y][x].colour == "black")) {
        // "Any live cell with fewer than two live neighbours dies, as if by underpopulation."
        cells[y][x].colour = "white";
      } else if ((2 <= neighbours <= 3) && (cells[y][x].colour == "black")) {
        // "Any live cell with two or three live neighbours lives on to the next generation."
        cells[y][x].colour = "black";
      } else if ((neighbours == 3) && (cells[y][x].colour == "white")) {
        // "Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction."
        cells[y][x].colour = "black";
      } else if ((3 < neighbours) && (cells[y][x].colour == "black")) {
        // "Any live cell with more than three live neighbours dies, as if by overpopulation."
        cells[y][x].colour = "white";
      }

注意:我使用2D数组(矩阵)存储游戏状态,每个单元都建模为一个简单的对象-此处唯一相关的参数是其状态(存储为颜色,实时显示为“黑色” )。

此处的上下文代码:https://github.com/HughEvans01/GameOfLife

3 个答案:

答案 0 :(得分:2)

您正在更新与阅读相同的网格。您可能想通过具有两个网格(当前状态和新状态)开始。迭代当前状态下的单元以计算新状态,然后将新状态用于下一次迭代,依此类推。

您可以进行很多优化,但这将为您提供一个正确的起点。

另外,正如其他人指出的那样,习惯用法2 <= neighbours <= 3不会评估您在JS中的想法

答案 1 :(得分:1)

您正在计算具有相同变异数据的邻居数量。这样的结果是,一个单元可以在失效/活动之间改变状态,然后该单元的新数据可以用于另一个单元的“邻居”计算。

答案 2 :(得分:1)

您需要两个网格副本才能正确执行此操作。在计算新一代单元格时,必须使用上一代所有相邻单元格的值。但是您将在循环期间覆盖每个单元格,因此某些邻居将具有其新值,而不是旧值。

因此,创建两个网格,分别调用一个current_cells和另一个next_cells。在计算新颜色时应使用current_cells,并将其分配给next_cells[x][y].colour。您还应该有一个else子句,该子句只能复制

next_cells[x][y].colour = current_cells[x][y].colour;

在循环结束时,交换他们的角色:

[next_cells, current_cells] = [current_cells, next_cells];