首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

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

  •  
  •   harley27 · 95 天前 · 1905 次点击
    这是一个创建于 95 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    为了开发 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
        1
    harley27   95 天前
    这是我的代码:shared 点 微云拼音 点 康姆 /5UlK45D
        2
    harley27   95 天前
    在线玩生命游戏的网址 在必应国际版搜 game of life 第一个就是
    我已经放弃发网址了
        3
    harley27   95 天前
    抱歉,关于生命游戏,请自行百科,我发不了网址。
        4
    w274189159   95 天前   ♥ 1
        5
    harley27   95 天前
    这是我的代码:share 点 微云拼音 点 康姆 /5UlK45D
    上面的发错了。
        6
    harley27   95 天前
    @w274189159 谢谢你,就是这个
    很期待什么时候我的账号功能完善后能和大家正常讨论
        7
    q4336431   95 天前
    之前帮别人写过,数组版的跟链表版的,数组版的代码应该还在,你需要么- -
        8
    actar   95 天前   ♥ 1
    https://github.com/actar233/Conway_Game_of_Life/
    这是我之前自己写的,有兴趣的可以参考一下,希望能对你有帮助。
        9
    harley27   95 天前
    @q4336431 谢谢!要
        10
    newtype0092   95 天前
    第一个结果是对的么?
    第三行有两个连着的 1,那第二行这两个 1 上面肯定也是 1 啊,明显算错了吧。
    我算的第一轮后的结果:
    00000000000
    00110001100
    01111111110
    01101010110
    01001010010
    00101010100
    00100000100
    00111011100
    00011111000
        11
    q4336431   95 天前   ♥ 1
        12
    harley27   94 天前
    @newtype0092
    奇怪,我的运行结果不是这样的?
    而且我用数组 a 将计算范围限定在 一个 9x7 的范围内,最外围被初始化为 0 后应该就不会变了
    不知道为什么会出现不一样的情况
        13
    shawnyin   94 天前
    ```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;
    }
    }
    ```
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4288 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 02:07 · PVG 10:07 · LAX 19:07 · JFK 22:07
    ♥ Do have faith in what you're doing.