完成完成

时间:2015-03-01 19:24:30

标签: java

非常感谢所有帮助,非常感谢大家。这是一个很棒的社区

2 个答案:

答案 0 :(得分:1)

看起来你只使用一个网格,你需要第二个网格,将细胞放在下一个状态......

答案 1 :(得分:1)

我注意到两个问题:

  1. 您应该只在完成所有单元格的更新后更新网格。
  2. 你的缩进已经关闭,}放错了位置。重新格式化后,可以清楚地看到您没有覆盖所有情况,因此有些单元格没有获得新值。例如,如果一个单元格处于活动状态,则只处理具有2个或3个邻居的情况,但是else没有if,因此,活动单元格为1或4或者更多邻居永远不会更新。

    你可能会认为,在某种程度上,代码会落入一般的“其他”,但事实上,它永远不会到达那里。所有单元格值都是“活着”或“死亡”。所以构造如:

    if ( cell == aliveColor ) {
        // Handle alive cell
    } else if ( cell == deadColor ) {
        // Handle dead cell
    } else {
        // Handle all other cases - but there are none!
    }
    

    相当于:

    if ( cell == aliveColor ) {
       // Handle alive cell
    } else {
       // Handle dead cell
    }
    

    原来的“其他”永远不会到达,因为除了“aliveColor”和“deadColor”之外没有其他情况。


  3. 回复您的修改:

                if (cell == aliveColor)
                {
                    if (aliveNeighbors == 2 || aliveNeighbors == 3){
                        val =1;
                        grid.setPos(row,  column,val);
                    }
                    if (aliveNeighbors ==1 || aliveNeighbors == 4){
                        val = 0;
                        grid.setPos(row,column,val);
                    }
                }
    

    出于某种原因,您似乎认为每个细胞最多可能有4个邻居。再次查看实验室文档中的示例单元格:

    ⬜︎⬜︎⬛︎
    ⬛︎⬜︎⬛︎
    ⬛︎⬛︎⬜︎
    

    这个细胞有 5 死邻居,还有3个活着的邻居。事实上,每个小区最多可以有8个邻居 - 对角线邻居也可以计算!

    但你的规则是:

      
        
    1. 如果x是活着的并且恰好有2或3个活的邻居,则x存活到下一代。否则就会死。
    2.   
    3. 如果x已经死了并且正好有3个活的邻居,那么x在下一代中是活着的。否则它仍然死了
    4.   

    否则直接转换为编程中的else。因此,不要让第二个if具有互补条件(如果有1,4,5,6,7或8个活的邻居......),只需给出第一个else:< / p>

                    if (aliveNeighbors == 2 || aliveNeighbors == 3) {
                        grid.setPos(row, column, aliveColor);
                    } else {
                        grid.setPos(row, column, deadColor);
                    }
    

    当然,同样适用于死细胞的规则。

    (请注意,我也删除了val=1并且直接使用了这个值,val是多余的。我还使用了解释值是什么而不是1和0的名称(如果你怎么办?想要改变游戏以使用绿色和红色)?)。


    之前我没有注意到的一件重要事情:

    do
    {   
        row = 0;
        column = 0;
        generation = 0;
        while (row <= gridSize-1){
            while (column <= gridSize-1){
    

    循环之前,将行和列初始化为零。

    这意味着在第一行的末尾,column保持gridSize-1并且不会再次设置为零。所以实际上你只更新了一行,然后只更新了每一行的最后一列。

    应该是:

      do
    {   
        row = 0;
        generation = 0;
        while (row <= gridSize-1){
            column = 0;
            while (column <= gridSize-1){
    

    或者您可以使用for循环:

    for ( row = 0; row < gridSize; row++ ) {
        for ( column = 0; column < gridSize; column++ ) {
            ...
    

    如果您选择这样做,请不要忘记从循环体内删除row++column++,这样它们就不会增加两次。