约翰康威的生命游戏 - C语言的基本实现

时间:2014-11-16 23:57:08

标签: c arrays algorithm

  <> John Conway的生命游戏 - 规则集

     
      
  1. 任何活着的邻居少于两个的活细胞都会死亡,好像是由人口不足造成的。
  2.   
  3. 任何有三个以上活着的邻居的活细胞都会死亡,就像过度拥挤一样。
  4.   
  5. 任何有两三个活邻居的活细胞都会留在下一代。
  6.   
  7. 任何有三个活邻居的死细胞都会成为活细胞。
  8.   

在过去的几个小时里,我一直在努力实施John Conway的C生命游戏。我尝试做的是在连续K次迭代后显示电路板的状态。作为输入,我使用二维数组的行数(int n)和列(int m),数组的组件(1表示实时,0表示死亡)和生成数(K)。 / p>

我已成功使用飞机方法成功实施游戏。

enter image description here

您可以在左侧网格中看到的平面方法是什么意思,我们在那里检查黑框的邻居到N,NW,S,SW等等。我的算法适用于此,即生活&#39;功能看起来像这样。为了实现这一点,我用零填充了边缘线/列。

void life(int a[100][100],int n,int m) {
  //Copies the main array to a temp array so changes can be entered into a grid
  //without effecting the other cells and the calculations being performed on them.
  int count;
  copy(a, temp, n ,m);
  for(int i = 1 ; i <=n ; i++) {
    for(int j = 1; j <= m; j++) {
      count = 0;
      count = a[i-1][j] + a[i][j-1] + a[i+1][j] + a[i][j+1] + a[i-1][j+1]
        + a[i+1][j-1] + a[i-1][j-1] + a[i+1][j+1];
      //The cell dies.
      if(count < 2 || count > 3)
        temp[i][j] = 0;
      //The cell stays the same.
      if(count == 2)
        temp[i][j] = a[i][j];
      //The cell either stays alive, or is "born".
      if(count == 3)
        temp[i][j] = 1;
    }
  }
  //Copies the completed temp array back to the main array.
  copy(temp, a, n ,m);
}

但是在第二个网格上,我们注意到每个框都有八个邻居,无论它在地图上的位置如何。为了以这种方式检查所有邻居,我应该使用环形方法。

但是我无法理解这个概念,我的意思是我明白了什么是torrus,但是我无法找到一种方法来实现并在代码中编写一个检查功能... < / p>

有人说,有人可以解释如何思考,也许可以写出这样的方法吗?

1 个答案:

答案 0 :(得分:5)

在处理您不了解的问题时,首先尝试解决更简单的问题通常更容易。

在生命游戏中,你有一个二维网格。如果我们通过只有一个维度来简化事情会怎么样?如果您只有一行而不是网格怎么办?你将如何处理行邻居的第一个和最后一个元素?