【发布时间】:2014-11-16 23:57:08
【问题描述】:
约翰·康威的人生游戏 - 规则集
- 任何存活的邻居少于两个的活细胞都会死亡,好像是由于人口不足造成的。
- 任何有超过三个活邻居的活细胞都会死亡,就像过度拥挤一样。
- 任何有两三个活邻居的活细胞都可以传给下一代。
- 任何只有三个活邻居的死细胞都会成为活细胞。
在过去的几个小时里,我一直致力于在 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变成0,101变成1,等等。 -
在数组索引中使用取模运算符:
a[i-1][j+1]-->a[(i+n-1)%n][(j+m+1)%m] -
投反对票似乎最不公平,如果我的部分帖子不足,为什么不提出一些智慧,并建议我如何改进它?
-
首先,您的第一个平面方法真的有效吗?在我看来,您正在从不存在的数组索引 [100] 和 [101] 中读取数据。我假设
n和m是100。一旦你弄清楚飞机接近边缘的情况,你可能会知道如何处理环绕(环面)情况。 -
(在涉及编程(语言)的标题/标题中,不要轻易使用BASIC:)