C++ 生命的游戏继续
所以我一直在尝试我的生命游戏,我注意到细胞只局限在我创造的网格内。我想试着让它连续,这样如果一个细胞到达一边,它就会从另一边继续。类似于吃豆人游戏,当你从左边离开,从右边回到游戏中。这是一张当细胞移出边界时的图像 这是我的代码,它限制了一切。那我怎么才能把它包起来呢C++ 生命的游戏继续,c++,C++,所以我一直在尝试我的生命游戏,我注意到细胞只局限在我创造的网格内。我想试着让它连续,这样如果一个细胞到达一边,它就会从另一边继续。类似于吃豆人游戏,当你从左边离开,从右边回到游戏中。这是一张当细胞移出边界时的图像 这是我的代码,它限制了一切。那我怎么才能把它包起来呢 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+
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;
}
它看起来像是对最近邻进行求和,因此,如果
(i,j)
是一个边缘单元,则需要做的就是将求和扩展到包含另一侧的单元
您可以通过向中央if
添加else语句来非常轻松地执行此操作,以检查l
或k
为-1
或gn
/gm
(即刚过边缘)的情况,并从对面的单元格中添加适当的术语
更新:
你在编辑中添加的内容不是我的意思,我很确定它不会起作用。我认为,在进一步研究之前,您需要仔细考虑初始代码到底做了什么。也许拿些纸,手工做一些例子
更具体的建议(但在尝试使用之前,请按照我上面所说的做):
k
或l
分别为负值或大于gn
/gm
,则不能直接获取当前[k][l]
,因为没有具有该索引的数组项(程序应该segfault)。实际上,您希望它在任何通常使用gn
th条目的地方使用0
th条目,依此类推所有其他边界k<0
和k>gn
的情况不同(对于l
类似)(k==1 | | k==1)
和类似的l
与完全错误的值进行比较开始考虑一维数组,大小为array\u size
当您请求负索引的单元格时,希望该数组返回什么?对于一个索引>=数组大小的数组如何?对于
x
和0
到m-1
对于y
(其中n
是x
维度的大小,m
是y
维度的大小,您要做的是检查坐标是否在范围内,并相应移动。因此(伪代码):
//此处为正常移动计算代码
如果(x<0){x=n-1;}
如果(x>=n){x=0;}
如果(y<0){y=m-1;}
如果(y>=m){y=0;}
//在这里进行实际移动
在起始位置标记为红色的情况下,您需要计算进入或繁殖到新正方形的运动:您需要检查它是否会超出范围。如果超出范围,则新细胞将在橙色位置中的任何一个位置出生,如果不超出范围,则可以出生
在任何蓝色位置:
希望有帮助:)如果您需要更多信息,请告诉我:)您忘了问问题:-)所以,你想让我们为你写代码吗?@Kos哈哈,我知道我忘了问如何把它包装起来:P@PlasmaHH提示或指向我正确的方向请为什么没有人会帮助lol?我添加到我的帖子你可以看看吗?是吗?我们不会为你做这项工作。试着专注于你想做什么,而不是如何去做。在开始编写代码之前,问题及其解决方案必须在您的头脑中或在一些纸上/在文本编辑器中清楚地显示出来。在编写代码时,请根据您试图解决的问题命名变量:currentColumnIndex、columnCount等。我非常感谢您的帮助,但是否有其他方法可以更简单地解释这一点?也许是视觉上的?我已经做了好几天了,我一直在努力解决这个问题。从0迭代到n意味着数组大小为n+1。如果数组的大小为n,则单元格的索引应该从0到n-1。您还需要更改图形;)是的,我同时更改了它们:)我用chrome刷新了4次才看到它。看起来你的绘图仍然将单元格从1索引到n-1,而不是从0索引到n-1
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];
}
// normal move calculation code here
if (x < 0) { x = n-1; }
if (x >= n) { x = 0; }
if (y < 0) { y = m-1; }
if (y >= m) { y = 0; }
// carry out actual move here