生命游戏(康威的游戏) - 如何检查细胞邻居

时间:2011-12-03 00:13:28

标签: java

大家好我正在尝试计算我的二维数组中包含的邻居单元格数,对角线数。之后,我将运行使用生命游戏规则的程序,将填满我的新网格。但是我被一个indexOutOfBoundsException困住了,我无法弄清楚我做错了什么,希望有人可以帮助我,这里的代码:

import java.util.Scanner;
import java.io.*;

class LifeGrid
{
    private int[][] grid;
    private int generation;

    public LifeGrid(int x, int y, String filename) throws FileNotFoundException 
    { 
        grid = new int[x][y];
        int j = 0;

        Scanner scanner = new Scanner(new File(filename));

        while(scanner.hasNextLine() && j < x)
        {
            String line = scanner.nextLine();
            for(int i=0; i<line.length() && i<y; i++)
            {
                if(line.charAt(i) == '*')
                    grid[j][i] = 1;
                else
                    grid[j][i] = 0;
            }
            j++;
        }
        scanner.close();
    }

    public void show()
    {
        for(int i=0; i<grid.length; i++)
        {
            for(int j=0; j<grid[i].length; j++)
            {
                if(grid[i][j] == 1)
                    System.out.print("*");
                else
                    System.out.print(" "); 
            }
            System.out.println();
        }
        System.out.println("Generation:" + generation);
    }

    //Getter methods

    public int getWidth()             { return grid[0].length;  }
    public int getHeight()            { return grid.length;     }
    public int getGeneration()        { return this.generation; }
    public int getCell(int x, int y)  { return grid[x][y];      }


    public static void main(String[] args)throws FileNotFoundException 
    {
        LifeGrid life = new LifeGrid(6, 10, args[0]);
        life.run(); 
    }

    //Check neighbours

    public int neighbours(int x, int y)
    {
        int neighbours = 0;

        if(x >= 1 && y >= 1 && x < getHeight() && y < getWidth())
        {
            if(grid[x][y++] == 1)       {neighbours++;} 
            if(grid[x][y--] == 1)       {neighbours++;}
            if(grid[x++][y] == 1)       {neighbours++;}
            if(grid[x++][y++] == 1)     {neighbours++;} 
            if(grid[x++][y--] == 1)     {neighbours++;}
            if(grid[x--][y--] == 1)     {neighbours++;}
            if(grid[x--][y++] == 1)     {neighbours++;}
        }
        else if(x == 0 && y == 0)
        {
            if(grid[x][y++] == 1)       {neighbours++;} 
            if(grid[x++][y] == 1)       {neighbours++;}
            if(grid[x++][y++] == 1)     {neighbours++;}
        }
        else if(x == 0 && y >= 1 && y < getWidth() && x < getHeight())
        {
            if(grid[x][y++] == 1)       {neighbours++;} 
            if(grid[x][y--] == 1)       {neighbours++;}
            if(grid[x++][y] == 1)       {neighbours++;}
            if(grid[x++][y++] == 1)     {neighbours++;} 
            if(grid[x++][y--] == 1)     {neighbours++;}
        }
        else if(x >= 1 && x < getHeight() && y == 0 && y < getWidth())
        {
            if(grid[x][y++] == 1)       {neighbours++;} 
            if(grid[x++][y] == 1)       {neighbours++;}
            if(grid[x++][y++] == 1)     {neighbours++;} 
            if(grid[x--][y++] == 1)     {neighbours++;}
        }
        else if(x == getHeight() && y >= 1 && y < getWidth())
        {
            if(grid[x][y++] == 1)       {neighbours++;} 
            if(grid[x][y--] == 1)       {neighbours++;}
            if(grid[x--][y--] == 1)     {neighbours++;}
            if(grid[x--][y++] == 1)     {neighbours++;}
        }
        else if(x >=1 && x < getHeight() && y == getWidth())
        {
            if(grid[x][y--] == 1)       {neighbours++;}
            if(grid[x++][y] == 1)       {neighbours++;}
            if(grid[x++][y--] == 1)     {neighbours++;}
            if(grid[x--][y--] == 1)     {neighbours++;}
        }
        else if(x == 0 && y == getWidth())
        {   
            if(grid[x][y--] == 1)       {neighbours++;}
            if(grid[x++][y] == 1)       {neighbours++;}
            if(grid[x++][y--] == 1)     {neighbours++;}
        }
        else if(x == getHeight() && y == 0)
        {
            if(grid[x--][y] == 1)       {neighbours++;}
            if(grid[x][++y] == 1)       {neighbours++;}
            if(grid[x--][y++] == 1)     {neighbours++;}
        }
        else if(x == getHeight() && y == getWidth())
        {
            if(grid[x][y--] == 1)       {neighbours++;}
            if(grid[x--][y] == 1)       {neighbours++;}
            if(grid[x--][y--] == 1)     {neighbours++;}
        }
        return neighbours;
    }

    public void run()
    {
        int[][] newGrid = grid;
        int[][] swapGrid = grid;;
        for(int i=0; i<grid.length; i++)
        {
            for(int j=0; j<grid[i].length; j++)
            {
                if(grid[i][j] == 1)
                {
                    if(neighbours(i,j) < 2)     generation = 0;
                    if(neighbours(i,j) > 3)     generation = 0;
                    if(neighbours(i,j) == 2)    generation = 1;
                }
                if(neighbours(i,j) == 3)        generation = 1;
                if(generation == 1)
                {
                    swapGrid[i][j] = 1;
                    newGrid = swapGrid;     
                }
                else
                {
                    swapGrid[i][j] = 0;
                    newGrid = swapGrid;
                }
            }
        }
        grid = newGrid;
        show();
    }
}       

异常详情:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at   
LifeGrid.neighbours(LifeGrid.java:87) at LifeGrid.run(LifeGrid.java:150) at 
LifeGrid.main(LifeGrid.java:59)

谢谢你们的直接答案,现在代码可以工作,我可以看到我的输出。但是我注意到我在run()方法中的算法是完全错误的,因为我从生命游戏的规则中获得了不同的输出。 规则:

对于“已填充”的空间:

每个有一个或没有邻居的细胞都会死亡,好像是孤独的。 每个有四个或更多邻居的小区都会死亡,好像是人口过剩。 每个有两个或三个邻居的细胞存活下来。 对于“空”或“未填充”的空间:

每个有三个邻居的单元格都会填充。

程序使用的文件设计如下:

                                          * * *

因此遵循我应该作为输出的规则:

                                          *
                                          *
                                          *

这是我的代码:

  import java.util.Scanner;
  import java.io.*;

  class LifeGrid
  {
    private int[][] grid;
    private int generation;

    public LifeGrid(int x, int y, String filename) throws FileNotFoundException 
    {  
        grid = new int[x][y];
        int j = 0;

        Scanner scanner = new Scanner(new File(filename));

        while(scanner.hasNextLine() && j < x)
        {
                String line = scanner.nextLine();

            for(int i=0; i<line.length() && i<y; i++)
            {
                if(line.charAt(i) == '*')
                    grid[j][i] = 1;
                else
                    grid[j][i] = 0;
            }
            j++;
        }
        scanner.close();
    }

    public void show()
    {
        for(int i=0; i<grid.length; i++)
        {
            for(int j=0; j<grid[i].length; j++)
            {
                if(grid[i][j] == 1)
                    System.out.print("*");
                else
                    System.out.print(" "); 
            }
            System.out.println();
        }
        System.out.println("Generation:" + generation);
    }

//Getter methods

    public int getWidth()             { return grid[0].length;  }
    public int getHeight()            { return grid.length;     }
    public int getGeneration()        { return this.generation; }
    public int getCell(int x, int y)  { return grid[x][y];      }


    public static void main(String[] args)throws FileNotFoundException 
    {
        LifeGrid life = new LifeGrid(6, 10, args[0]);
        life.run(); 
        }

//Check neighbours

    public int neighbours(int x, int y)
    {
        int neighbours = 0;

        if(x >= 1 && y >= 1 && x < getHeight() -1 && y < getWidth() -1)
        {
            if(grid[x][y+1] == 1)       {neighbours++;} 
            if(grid[x][y-1] == 1)       {neighbours++;}
            if(grid[x+1][y] == 1)       {neighbours++;}
            if(grid[x+1][y+1] == 1)     {neighbours++;} 
            if(grid[x+1][y-1] == 1)     {neighbours++;}
            if(grid[x-1][y-1] == 1)     {neighbours++;}
            if(grid[x-1][y+1] == 1)     {neighbours++;}
        }
        else if(x == 0 && y == 0)
        {
            if(grid[x][y+1] == 1)       {neighbours++;} 
            if(grid[x+1][y] == 1)       {neighbours++;}
            if(grid[x+1][y+1] == 1)     {neighbours++;}
        }
        else if(x == 0 && y >= 1 && y < getWidth() -1 && x < getHeight() -1)
        {
            if(grid[x][y+1] == 1)       {neighbours++;} 
            if(grid[x][y-1] == 1)       {neighbours++;}
            if(grid[x+1][y] == 1)       {neighbours++;}
            if(grid[x+1][y+1] == 1)     {neighbours++;} 
            if(grid[x+1][y-1] == 1)     {neighbours++;}
        }
        else if(x >= 1 && x < getHeight() -1 && y == 0 && y < getWidth() -1)
        {
            if(grid[x][y+1] == 1)       {neighbours++;} 
            if(grid[x+1][y] == 1)       {neighbours++;}
            if(grid[x+1][y+1] == 1)     {neighbours++;} 
            if(grid[x-1][y+1] == 1)     {neighbours++;}
        }
        else if(x == getHeight() && y >= 1 && y < getWidth() - 1)
        {
            if(grid[x][y+1] == 1)       {neighbours++;} 
            if(grid[x][y-1] == 1)       {neighbours++;}
            if(grid[x-1][y-1] == 1)     {neighbours++;}
            if(grid[x-1][y+1] == 1)     {neighbours++;}
        }
        else if(x >=1 && x < getHeight() - 1 && y == getWidth() )
        {
            if(grid[x][y-1] == 1)       {neighbours++;}
            if(grid[x+1][y] == 1)       {neighbours++;}
            if(grid[x+1][y-1] == 1)     {neighbours++;}
            if(grid[x-1][y-1] == 1)     {neighbours++;}
        }
        else if(x == 0 && y == getWidth() )
        {   
            if(grid[x][y-1] == 1)       {neighbours++;}
            if(grid[x+1][y] == 1)       {neighbours++;}
            if(grid[x+1][y-1] == 1)     {neighbours++;}
        }
        else if(x == getHeight()  && y == 0)
        {
            if(grid[x-1][y] == 1)       {neighbours++;}
            if(grid[x][y+1] == 1)       {neighbours++;}
            if(grid[x-1][y+1] == 1)     {neighbours++;}
        }   
        else if(x == getHeight()  && y == getWidth() )
        {
            if(grid[x][y-1] == 1)       {neighbours++;}
            if(grid[x-1][y] == 1)       {neighbours++;}
            if(grid[x-1][y-1] == 1)     {neighbours++;}
        }
        return neighbours;
    }

    public void run()
    {
        int[][] newGrid;
        int[][] swap, old, New;
        int n;

        for(int i=0; i<grid.length; i++)
        {
            for(int j=0; j<grid[i].length; j++)
            {
                n = neighbours(i,j);
                old = grid;

                if(grid[i][j] == 1)
                {
                        if(n < 2)       {generation = 0;}
                    else if(n > 3)      {generation = 0;}
                    else if(n == 2)     {generation = 1; }
                }
                else
                {
                    if(n == 3)      {generation = 1;}
                    else
                            {generation = 0;}
                }

                if(generation == 1)
                {
                    New = old;
                    New[i][j] = 1;
                    swap = New;
                    newGrid = swap;
                    grid = newGrid;

                    show();

                    grid = old;
                }
                else
                {
                    New = old;
                    New[i][j] = 0; 
                                        swap = New;
                    newGrid = swap;
                                        grid = newGrid;

                                        show();

                                        grid = old;
                }

            }
        }
    }
}

提前谢谢你。

2 个答案:

答案 0 :(得分:2)

我认为这是在neighbor()方法中。那些x ++或y ++应该是x + 1或y + 1(对于x--也是如此)。

,而不是检查大于x(或y)的1

答案 1 :(得分:0)

使用示例和演练重申 dgunderson

//...

public int neighbours(int x, int y)
{
int neighbours = 0;

if(x >= 1 && y >= 1 && x < getHeight() && y < getWidth())
{
    if(grid[x][y++] == 1)       {neighbours++;} 
    if(grid[x][y--] == 1)       {neighbours++;}
    if(grid[x++][y] == 1)       {neighbours++;}
    if(grid[x++][y++] == 1)     {neighbours++;} 
    if(grid[x++][y--] == 1)     {neighbours++;}
    if(grid[x--][y--] == 1)     {neighbours++;}
    if(grid[x--][y++] == 1)     {neighbours++;}
}
//...

让:getHeight()返回6.

设:getWidth()返回10.

设:x等于getHeight() - 1。

设:y等于getWidth() - 1。

因此:

//...

public int neighbours(int x, int y)
{
int neighbours = 0;

//if 5 >= 1 && 9 >= 1 && 5 < 6 && 9 < 10...TRUE
if(x >= 1 && y >= 1 && x < getHeight() && y < getWidth())
{
    //if grid[5][9] == 1)  "increment y"  { "increment neighbors" };
    if(grid[x][y++] == 1)       {neighbours++;}
    //if grid[5][10] <-- WHUPS! out of bounds.
    if(grid[x][y--] == 1)       {neighbours++;}
    if(grid[x++][y] == 1)       {neighbours++;}
    if(grid[x++][y++] == 1)     {neighbours++;} 
    if(grid[x++][y--] == 1)     {neighbours++;}
    if(grid[x--][y--] == 1)     {neighbours++;}
    if(grid[x--][y++] == 1)     {neighbours++;}
}
//...

此外,调用堆栈说错误特别发生在邻居中,而你在邻居中唯一做的就是操纵数组索引。