java - 如果生命游戏中的语句重置板而不是遵守规则

标签 java algorithm loops if-statement conways-game-of-life

我正在尝试创建生命游戏,但我在代码的某些方面遇到了问题。首先,当我单击方 block 并通过按下开始按钮告诉生活游戏开始时,所有方 block 都变为空白,而不是遵循我在更新方法中描述的规则。无论我推到什么位置或多少个方 block ,它们都会返回 false,就好像我正在重置游戏一样。我认为我的 for 循环是正确的,但我认为我的一个 if 语句中可能遗漏了一些东西。任何帮助,将不胜感激。

public class GameOfLife 
{   
    private int row;
    private int col;
    private boolean[][] grid;
    private LifeBoard board;


        public static void main(String[] args) 
        {   
            GameOfLife game = new GameOfLife();
        }

        public GameOfLife()
        {
            board = new LifeBoard( this );
            grid = new boolean[board.getGridSize()][board.getGridSize()];
        }

        public void clickSquare( int row, int column ) 
        {
             if (grid[row][column] == false)
             {
                 grid[row][column] = true;   
             }
             else
             {
                 grid[row][column] = false; 
             }
            return;  
        } 

        public void resetGrid()
        {
            for (row = 0; row < grid.length; row++)
            {
                for (col = 0; col < grid[row].length; col++)
                {
                     grid[row][col]= false;
                }

            }   
            return;
        }

        public void updateGrid() 
        {
            boolean[][] grid2 = new boolean[grid.length][grid.length];
            //Nested for loop to go through entire array
            for (row = 0; row < grid.length; row++)
            {
                for ( col = 0; col < grid[row].length; col++)
                {
                    int neighbors = 0;
                    /*If statements to determine if cell is alive and whether and then to 
                    add neighbors depending upon position.*/
                    if (row > 0 && col > 0 && grid[row-1][col -1] == true)
                    {
                        neighbors++;
                    }

                    if (col > 0 && grid[row][col-1] == true)
                    {
                        neighbors++;
                    }

                    if (col > 0 && row < grid.length-1 && grid[row+1][col-1] == true)
                    {
                        neighbors++;
                    }

                    if (row > 0 && grid[row-1][col] == true)
                    {
                        neighbors++;
                    }

                    if (col < 0 && row < grid.length-1 && grid[row+1][row-1] == true)
                    {
                        neighbors++;
                    }

                    if (row > 0 && col < grid.length-1 && grid[row-1][col+1] == true)
                    {
                        neighbors++;
                    }

                    if (col < grid.length-1 && grid[row][col+1] == true)
                    {
                        neighbors++;
                    }

                    if (row < grid.length-1 && col < grid.length-1 && grid[row+1][col+1] == true)
                    {
                        neighbors++;
                    }

                    //If there are two or three neighbors than the grid remain true for those values
                    if (grid[row][col] == true)
                    {
                        if (neighbors == 2 || neighbors == 3 )
                        {
                        grid2[row][col] = true;
                        }
                        else 
                        {
                            grid2[row][col] = false;
                        }

                    if (grid[row][col] == false)
                    {
                        if (neighbors > 2)
                        {
                            grid2[row][col] = false;
                        }
                        if (neighbors == 3)
                        {
                            grid2[row][col] = true;
                        }   
                    }
                    }
                }
                grid = grid2;
            }
        }

        public boolean[][] getGrid()
        {
            return grid;
        }

最佳答案

你在哪里:

if (grid[row][col] == true)
{
    if (neighbors == 2 || neighbors == 3 )
    {
        grid2[row][col] = true;
    }
    else 
    {
        grid2[row][col] = false;
    }

if (grid[row][col] == false)
{
    if (neighbors > 2)
    {
        grid2[row][col] = false;
    }
    if (neighbors == 3)
    {
        grid2[row][col] = true;
    }   
}

您忘记关闭第一个 if。此外,它应该是一个 else,这样第二个 block 就不会撤消第一个 block 所做的事情。

其次,grid = grid2 应在关闭 for 循环后设置。因此,您不会在迭代过程中更改 grid

维基百科 article on Conway's Game of Life列出以下规则:

  1. 任何少于两个活邻居的活细胞都会死亡,好像是由人口不足引起的。
  2. 任何有两个或三个活邻居的活细胞都会传给下一代。
  3. 任何有超过三个活邻居的活细胞都会死亡,就像过度拥挤一样。
  4. 任何死细胞恰好有三个活的邻居都会变成活细胞,就像通过繁殖一样。

将其转化为代码:

if (grid[row][col]) {
    if (neighbors < 2 || neighbors > 3) {
        // 1. Any live cell with fewer than two live neighbours dies
        // 3. Any live cell with more than three live neighbours dies
        grid2[row][col] = false;
    }
    // 2. Any live cell with two or three live neighbours lives on. Does nothing.
} else if (neighbors == 3) {
    // 4. Any dead cell with exactly three live neighbours becomes a live cell.
    grid2[row][col] = true;
}

作为旁注,方法 clickSquare() 只是反转 grid[row][column] 中的值,因此它可以简单地实现为:

public void clickSquare(int row, int column) {
    grid[row][column] = !grid[row][column];
}

关于java - 如果生命游戏中的语句重置板而不是遵守规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28461976/

相关文章:

java - 从java应用程序调用acceleo模板

java - 以编程方式从 ant-task 中检索返回码

java - 如何验证页面上的所有元素?

java - 使用快速选择算法在未排序的数组中查找中位数

algorithm - 给定点的坐标,找到彼此之间存在一定距离的所有点对?

c++ - C++中while(x--)是什么意思

java - 如何在LWJGL/Slick2D中循环播放声音

python - 如何在 Python 中创建动态列表?

java - 求二维数组中 1 的最大个数

c++ - C++遍历一般树