所以我一直在尝试生命游戏,我注意到细胞只能被限制在我创造的网格中。我想尝试让它连续,所以如果一个细胞到达一侧,它将从另一侧继续。当你离开左边从右侧回到游戏时,类似于游戏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];
}
答案 0 :(得分:1)
开始考虑尺寸为ARRAY_SIZE的一维数组。
当您要求负索引的单元格时,您希望该数组返回什么?对于索引&gt; = ARRAY_SIZE怎么样?操作员会让您想到什么(提示:&lt; = 0,%ARRAY_SIZE,...)
这将引导您找到dshepherd的更通用的解决方案,例如,如果您希望将来能够在单元格周围指定生命/死亡规则而不仅仅是一个索引。
答案 1 :(得分:1)
假设0
的{{1}}到n-1
以及x
的{{1}}到0
的网格尺寸为m-1
是y
维度的大小,n
是x
维度的大小,您要做的是检查坐标是否在范围内,并相应地移动。所以(伪代码):
m
当开始位置标记为红色时,您需要计算一个新方块的移动或繁殖:您需要检查它是否会超出范围。如果确实如此,那么新的细胞就会出现在橙色的任何一个位置,如果不是,它就会诞生 在任何蓝色位置:
希望有所帮助:)如果您需要更多信息,请告诉我:))
答案 2 :(得分:0)
看起来你正在对最近的邻居进行求和,因此如果(i,j)
是边缘单元格,那么你需要做的就是扩展求和以包括另一边的单元格。
您可以通过向中央if
添加else语句来相当轻松地执行此操作,以检查l
或k
为-1
或gn
的情况/ gm
(即刚过边缘)并从对面的单元格中添加适当的术语。
更新
你在编辑中添加的内容并不是我的意思,我很确定它不起作用。我认为你需要仔细考虑初始代码的确切内容,然后再进一步了解。也许拿一些纸并手工做一些例子?
更具体的建议(但在尝试使用之前,请执行上述说明):
current[k][l]
或k
分别为负数或大于l
/ gn
,则无法直接gm
,因为没有数组条目那个索引(该程序应该是段错误的)。你真正希望它做的是在通常使用0
条目的任何地方使用gn
条目,依此类推所有其他边界。k < 0
和k > gn
的情况不同(类似于l
)。(k == 1 || k == -1)
与l