初学 Java 写 生命游戏 失败,原因不明!

2019-07-17 16:24:15 +08:00
 harley27

大家好,表示欢迎。 对有兴趣前来讨论的新手老手表示感谢。

为了开发 app,刚开始学 2 天 java,于是就想写一个细胞自动机实践一下:

先说规则。细胞自动机是某某数学家发明,也叫 “生命游戏” (game of life),是一个特别能令人感兴趣的有趣算法!

具体规则是,一个二位矩阵(比如围棋棋盘),每个方格都是一个细胞,或者死,或者活。每个细胞的下一个状态,取决于它周围的八个细胞的当前状态。 对于一个活细胞,如果它周围的活细胞 = 2 or 3,那么它继续活,否则死。 对于一个死细胞,如果它周围的活细胞 = 3,那么它复活,否则继续死。

于是编程思路就来了。首先我建 x、y 两个数组,每个数组都代表一个 11 x 9 的矩阵 用循环来计算每个 x,然后赋值到 y,并输出 y 再用下一个循环来计算每个 y,然后赋值到 x,并输出 x。

多么无懈可击的一个思路!!! 然而到第二个循环就出错了,矩阵里莫名其妙多了两个活细胞!! 我设置的初始状态,是一个这样的形状:( 1 为活,0 为死)

00000000000

00000000000

00110001100

00101010100

00101010100

00001010000

00011011000

00011011000

00000000000

这个形状是 “ Tumbler ” 细胞循环中的一个状态,全部状态可以在这个在线玩生命游戏的网站测试: (见 1 楼) 网站里面可以选择 “ Tumbler ” 形状的预设。

我的程序,第一个计算结果是对的:

00000000000

00000000000

00110001100

01101010110

00001010000

00001010000

00000000000

00011011000

00000000000

但第二个开始,就有错误了:

00000000000

00000000000

01110001110

01101010110

00101010100 这行多出两个 1 ???

00000000000

00011011000

00000000000

00000000000

原因不明。根本就不知道什么什么情况,因为算法明明很简单! 源码如下,欢迎拿去品尝: (见 1 楼)

加油。好运。感谢。

3792 次点击
所在节点    Java
13 条回复
harley27
2019-07-17 16:26:59 +08:00
这是我的代码:shared 点 微云拼音 点 康姆 /5UlK45D
harley27
2019-07-17 16:28:38 +08:00
在线玩生命游戏的网址 在必应国际版搜 game of life 第一个就是
我已经放弃发网址了
harley27
2019-07-17 16:29:48 +08:00
抱歉,关于生命游戏,请自行百科,我发不了网址。
w274189159
2019-07-17 16:32:50 +08:00
harley27
2019-07-17 16:34:09 +08:00
这是我的代码:share 点 微云拼音 点 康姆 /5UlK45D
上面的发错了。
harley27
2019-07-17 16:35:08 +08:00
@w274189159 谢谢你,就是这个
很期待什么时候我的账号功能完善后能和大家正常讨论
q4336431
2019-07-17 16:52:42 +08:00
之前帮别人写过,数组版的跟链表版的,数组版的代码应该还在,你需要么- -
actar
2019-07-17 16:56:21 +08:00
https://github.com/actar233/Conway_Game_of_Life/
这是我之前自己写的,有兴趣的可以参考一下,希望能对你有帮助。
harley27
2019-07-17 17:01:27 +08:00
@q4336431 谢谢!要
newtype0092
2019-07-17 18:04:29 +08:00
第一个结果是对的么?
第三行有两个连着的 1,那第二行这两个 1 上面肯定也是 1 啊,明显算错了吧。
我算的第一轮后的结果:
00000000000
00110001100
01111111110
01101010110
01001010010
00101010100
00100000100
00111011100
00011111000
q4336431
2019-07-18 09:16:55 +08:00
harley27
2019-07-18 12:37:48 +08:00
@newtype0092
奇怪,我的运行结果不是这样的?
而且我用数组 a 将计算范围限定在 一个 9x7 的范围内,最外围被初始化为 0 后应该就不会变了
不知道为什么会出现不一样的情况
shawnyin
2019-07-18 13:53:07 +08:00
```java
class Solution {
public void gameOfLife(int[][] board) {
//use -1 to indicate the cell lives but die at this generation
//use 2 to indicate the cell dies but live at this generation
int[][] shift = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 }, { 1, 1 }, { 1, -1 }, { -1, 1 },
{ -1, -1 } };
int m = board.length;
int n = board[0].length;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int cnt_live = 0;
for (int k = 0; k < 8; k++) {
int x = i + shift[k][0];
int y = j + shift[k][1];
if (x >= 0 && y >= 0 && x < m && y < n && Math.abs(board[x][y]) == 1) {
cnt_live++;
}
}
if (board[i][j] == 0 && cnt_live == 3)
board[i][j] = 2;
if (board[i][j] == 1 && (cnt_live > 3 || cnt_live < 2)) {
board[i][j] = -1;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == -1)
board[i][j] = 0;
if (board[i][j] == 2)
board[i][j] = 1;
}
}
return;
}
}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/583827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX