生命游戏继续发挥作用

时间:2013-12-09 11:04:36

标签: c++

所以我一直在尝试生命游戏,我注意到细胞只能被限制在我创造的网格中。我想尝试让它连续,所以如果一个细胞到达一侧,它将从另一侧继续。当你离开左边从右侧回到游戏时,类似于游戏pac-man。以下是单元格移出界限http://i.stack.imgur.com/dofv6.png

时的外观图像

这是我所拥有的限制所有内容的代码。那么如何让它回绕?

int NeighborhoodSum(int i, int j) {
  int sum = 0;
  int k, l;
  for (k=i-1;k<=i+1;k++) {
    for (l=j-1;l<=j+1;l++) {
      if (k>=0 && k<gn && l>=0 && l<gm && !(k==i && l==j)) {
        sum+=current[k][l];
      }
    }
  }
  return sum;
}

根据dshepherd的建议,这就是我的想法。

if (!(k == i && l == j)) {
    sum += current[k][l];
} else if (k == 1 || k == -1) { // rows
    sum += current[k+1][l];
} else if (l == 1 || l == -1) { // columns
    sum += current[k][l+1];
}

3 个答案:

答案 0 :(得分:1)

开始考虑尺寸为ARRAY_SIZE的一维数组。

当您要求负索引的单元格时,您希望该数组返回什么?对于索引&gt; = ARRAY_SIZE怎么样?操作员会让您想到什么(提示:&lt; = 0,%ARRAY_SIZE,...)

这将引导您找到dshepherd的更通用的解决方案,例如,如果您希望将来能够在单元格周围指定生命/死亡规则而不仅仅是一个索引。

答案 1 :(得分:1)

假设0的{​​{1}}到n-1以及x的{​​{1}}到0的网格尺寸为m-1y维度的大小,nx维度的大小,您要做的是检查坐标是否在范围内,并相应地移动。所以(伪代码):

m

当开始位置标记为红色时,您需要计算一个新方块的移动或繁殖:您需要检查它是否会超出范围。如果确实如此,那么新的细胞就会出现在橙色的任何一个位置,如果不是,它就会诞生  在任何蓝色位置:

Figure one: orange are overflow remapped positions, blue are non remapped "natural" positions

希望有所帮助:)如果您需要更多信息,请告诉我:))

答案 2 :(得分:0)

看起来你正在对最近的邻居进行求和,因此如果(i,j)是边缘单元格,那么你需要做的就是扩展求和以包括另一边的单元格。

您可以通过向中央if添加else语句来相当轻松地执行此操作,以检查lk-1gn的情况/ gm(即刚过边缘)并从对面的单元格中添加适当的术语。

更新

你在编辑中添加的内容并不是我的意思,我很确定它不起作用。我认为你需要仔细考虑初始代码的确切内容,然后再进一步了解。也许拿一些纸并手工做一些例子?

更具体的建议(但在尝试使用之前,请执行上述说明):

  1. 如果current[k][l]k分别为负数或大于l / gn,则无法直接gm,因为没有数组条目那个索引(该程序应该是段错误的)。你真正希望它做的是在通常使用0条目的任何地方使用gn条目,依此类推所有其他边界。
  2. 您可能需要将if语句拆分为5个而不是3个,因为k < 0k > gn的情况不同(类似于l)。
  3. 您正在使用(k == 1 || k == -1)l
  4. 类似地与错误的值进行比较