Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 生命的游戏继续_C++ - Fatal编程技术网

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条目,依此类推所有其他边界
  • 您可能需要将if语句分成5个部分,而不是3个部分,因为
    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