【问题标题】:John Conway's Game of Life - Basic implementation in CJohn Conway 的生命游戏 - C 语言的基本实现
【发布时间】:2014-11-16 23:57:08
【问题描述】:

约翰·康威的人生游戏 - 规则集

  1. 任何存活的邻居少于两个的活细胞都会死亡,好像是由于人口不足造成的。
  2. 任何有超过三个活邻居的活细胞都会死亡,就像过度拥挤一样。
  3. 任何有两三个活邻居的活细胞都可以传给下一代。
  4. 任何只有三个活邻居的死细胞都会成为活细胞。

在过去的几个小时里,我一直致力于在 C 中实现 John Conway 的生命游戏。我要做的是在 K 次连续迭代后显示板的状态。作为输入,我使用二维数组的行数(int n)和列数(int m)、数组的组成部分(1 表示活,0 表示死)和代数(K)。

我已经成功地使用平面方法实现了游戏。

您可以在左侧网格中看到平面进近的含义,我们在其中检查黑框到 N、NW、S、SW 等的邻居。我的算法对此工作得很好,“生命”功能看起来像这样。为此,我用零包围了两个边缘线/列。

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);
}

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

但我无法真正理解这个概念,我的意思是我理解圆环是什么,但我只是找不到一种方法来实现并在代码中为此编写一个检查函数......

说了这么多,有人可以解释一下如何思考并编写这样的方法吗?

【问题讨论】:

  • 尝试使用% 运算符来环绕限制:x %= 100 将把100 变成0101 变成1,等等。
  • 在数组索引中使用取模运算符:a[i-1][j+1] --> a[(i+n-1)%n][(j+m+1)%m]
  • 投反对票似乎最不公平,如果我的部分帖子不足,为什么不提出一些智慧,并建议我如何改进它?
  • 首先,您的第一个平面方法真的有效吗?在我看来,您正在从不存在的数组索引 [100] 和 [101] 中读取数据。我假设nm 是100。一旦你弄清楚飞机接近边缘的情况,你可能会知道如何处理环绕(环面)情况。
  • (在涉及编程(语言)的标题/标题中,不要轻易使用BASIC:)

标签: c arrays algorithm


【解决方案1】:

当处理一个你不理解的问题时,先尝试解决一个更简单的问题通常会更容易。

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

【讨论】:

  • 这既不是对问题的批评,也不是要求澄清的请求。这是对这个问题以及 OP 未来可能面临的许多其他问题的一个很好的答案。
  • 感谢您和其他所有人的努力解释,但我仍然不明白。我就是想不通这种环形方法,太令人沮丧了..
  • 让我更进一步来帮助您理解它。也许做一些身体上的事情会有所帮助。取一张 8 x 11 英寸的纸,撕成一条窄条。现在在窄条上绘制 9 条垂直线,并用索引号填充线条之间的空间,从 0 开始。这表示您的 10 个元素的一维数组。您如何重新排列纸张以使所有元素都相邻?我没有直接为您提供答案,因为我认为如果您从我给您的内容中弄清楚,您会更好地理解圆环方法。
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 2018-07-11
  • 2016-04-05
  • 1970-01-01
  • 2023-02-08
  • 2023-03-28
  • 2019-07-11
  • 2021-04-09
相关资源
最近更新 更多