4

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

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

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

你可以在这里查看完整的实现。提前致谢。

4

3 回答 3

4

如何伪造一个“无限”的二维平面?

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

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

Cell& get_cell(BigInt x, BigInt y)
{
    return matrix[make_pair[x,y]];
}
于 2013-09-02T00:23:17.960 回答
0

生命的游戏不可能假装是无限的。假设您创建的结构试图扩展超出当前范围,什么是阻止它无限扩展。就像 MitchWheat 说的那样,你可以包装边缘,这是你最好的选择(为了看起来更自然的行为),但由于它是完整的,你不能在没有无限记忆的情况下假装它在任何情况下都是无限的。

由于生命游戏正在完成,这意味着如果某事“超出边缘”,则无法判断它是否会在一般情况下(与停止问题有关)回来,这意味着您用来决定某事何时发生的任何启发式偏离边缘会有一定程度的不准确,如果这是可以接受的,那么你应该考虑这种方法,尽管 IMO 错误地模拟了生活游戏有点违背了目的。

另一种方法是故意模拟比您显示的更大的区域,以便对象看起来超出边缘

于 2013-09-02T00:10:35.680 回答
0

这个问题也在这里有一些很好的答案。

对您的模拟进行的最简单修改(在另一个问题中未提及)是将区域的长度和宽度增加三倍,但仅显示您当前显示的内容。唯一的问题是,如果有东西离开屏幕,撞到墙上,然后又回来了。您可以尝试在边界处玩弄游戏规则,以使细胞更有可能死亡(这样滑翔机就可以在成为可能搞砸的块之前再深入一点)。说不定一个有三个邻居的活细胞如果在旁边两步之内就会死掉。

其他答案之一(和我们的答案)可以概括为跟踪活动节点,而不是整个屏幕。然后你就可以像谷歌地图一样做一些很酷的事情,比如缩放和平移。

于 2013-09-02T02:54:40.860 回答