我知道这有点含糊,但我一直在尝试在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数组(矩阵)存储游戏状态,每个单元都建模为一个简单的对象-此处唯一相关的参数是其状态(存储为颜色,实时显示为“黑色” )。
答案 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];