康威的生命游戏 - 如何伪造“无限”2d飞机

时间:2013-09-01 23:52:16

标签: javascript algorithm multidimensional-array

我正在使用二维数组来表示细胞网格。当边缘或角落中的单元格检查它的邻居是否会超出界限时,它会将它们视为永久死亡。

function getCell(row, column) {
  if(row === -1 || row === cellMatrix.length || column === -1 || column === cellMatrix[0].length)
  {
    return 0;
  }
  else return cellMatrixCopy[row][column];
}

我只想摆脱滑翔机停止并在到达网格边缘时变成块的行为。你将如何“摆脱”阵列的边缘?

您可以查看完整的实施here。提前谢谢。

3 个答案:

答案 0 :(得分:4)

  

如何伪造“无限”2d飞机?

要创建无限维度游戏板,请使用稀疏矩阵表示,其中行和列指示是任意精度整数。大致如下:

map<pair<BigInt,BigInt>, Cell> matrix;

Cell& get_cell(BigInt x, BigInt y)
{
    return matrix[make_pair[x,y]];
}

答案 1 :(得分:0)

生命的游戏是不可能伪造无限的。假设您创建的结构试图扩展超过当前边界,什么是阻止它无限扩展。就像MitchWheat所说的那样,你可以把边缘包裹起来,这是你最好的选择(对于更自然的行为),但是因为它的图灵完成你不能在没有无限记忆的情况下假装它在每种情况下都是无限的。

由于生命游戏是图灵完成的,这意味着如果某个东西“脱离边缘”,就无法判断它是否会回归一般情况(与暂停问题相关),这意味着你使用的任何启发式决定什么时候出现边缘会有一定程度的不准确,如果这是可以接受的那么你应该考虑这种方法,虽然IMO模拟生活游戏不正确有点打败了目的。

另一种方法是有目的地模拟比你显示的更大的区域,这样物体就会偏离边缘

答案 2 :(得分:0)

这个问题也here有一些好的答案。

对模拟的最简单修改(在另一个问题上没有提到)将是区域长度和宽度的三倍,但只显示您当前显示的内容。唯一的问题是,如果有什么东西离开屏幕,撞墙,然后又回来了。您可以尝试在边界处玩游戏规则,以使其更有可能让一个单元死亡(这样滑翔机可以在成为一个可以搞砸的块之前再进一步)。也许有三个邻居的活细胞会死在旁边两步之内。

其他答案之一(和our answer)可以概括为跟踪实时节点,而不是整个屏幕。然后你就可以像缩放和平移一样做很酷的事情,就好像它是谷歌地图一样。