初学 Java 写 生命游戏 失败,原因不明! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
harley27
V2EX    Java

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

  •  
  •   harley27 2019 年 7 月 17 日 4312 次点击
    这是一个创建于 2369 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    为了开发 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 楼)

    加油。好运。感谢。

    13 条回复    2019-07-18 13:53:07 +08:00
    harley27
        1
    harley27  
    OP
       2019 年 7 月 17 日
    这是我的代码:shared 点 微云拼音 点 康姆 /5UlK45D
    harley27
        2
    harley27  
    OP
       2019 年 7 月 17 日
    在线玩生命游戏的网址 在必应国际版搜 game of life 第一个就是
    我已经放弃发网址了
    harley27
        3
    harley27  
    OP
       2019 年 7 月 17 日
    抱歉,关于生命游戏,请自行百科,我发不了网址。
    w274189159
        4
    w274189159  
       2019 年 7 月 17 日   1
    harley27
        5
    harley27  
    OP
       2019 年 7 月 17 日
    这是我的代码:share 点 微云拼音 点 康姆 /5UlK45D
    上面的发错了。
    harley27
        6
    harley27  
    OP
       2019 年 7 月 17 日
    @w274189159 谢谢你,就是这个
    很期待什么时候我的账号功能完善后能和大家正常讨论
    q4336431
        7
    q4336431  
       2019 年 7 月 17 日
    之前帮别人写过,数组版的跟链表版的,数组版的代码应该还在,你需要么- -
    KotlinAmai
        8
    KotlinAmai  
       2019 年 7 月 17 日   1
    https://github.com/actar233/Conway_Game_of_Life/
    这是我之前自己写的,有兴趣的可以参考一下,希望能对你有帮助。
    harley27
        9
    harley27  
    OP
       2019 年 7 月 17 日
    @q4336431 谢谢!要
    newtype0092
        10
    newtype0092  
       2019 年 7 月 17 日
    第一个结果是对的么?
    第三行有两个连着的 1,那第二行这两个 1 上面肯定也是 1 啊,明显算错了吧。
    我算的第一轮后的结果:
    00000000000
    00110001100
    01111111110
    01101010110
    01001010010
    00101010100
    00100000100
    00111011100
    00011111000
    q4336431
        11
    q4336431  
       2019 年 7 月 18 日   1
    harley27
        12
    harley27  
    OP
       2019 年 7 月 18 日
    @newtype0092
    奇怪,我的运行结果不是这样的?
    而且我用数组 a 将计算范围限定在 一个 9x7 的范围内,最外围被初始化为 0 后应该就不会变了
    不知道为什么会出现不一样的情况
    shawnyin
        13
    shawnyin  
       2019 年 7 月 18 日
    ```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;
    }
    }
    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2711 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 03:34 PVG 11:34 LAX 19:34 JFK 22:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86