用于存储坐标值的二维布尔数组

时间:2019-04-08 18:42:03

标签: java

我正在创建一个以回合制为基础的游戏。在这个游戏中-我有N x N大小的网格。

我认为使用2D布尔数组表示此网格中所有单元的二进制状态是一个好主意。

想象:

// T = true | F = false
---------------------
| F |   |   |   |   |
---------------------
|   | T |   |   |   |
---------------------    // i.e. grid[0][0] = false
|   |   |   |   |   |
---------------------
|   |   |   |   |   |
---------------------

每个正方形可以为true或false。游戏规则并不重要...请注意,每个单元格可以是对还是错。

这是我试图实现的:

public class Life {
    Boolean[][] grid;

    public Life(int x, int y, Boolean status) {
        if(!this.grid[x][y]) {
            this.grid = new Boolean[x][y];
        }
        this.grid[x][y] = status;
    }
}

我要这样实例化:

new Life(0,0,false);
new Life(2,1,true);

但是,当我这样做时,我的程序崩溃了,我不确定自己在做什么错。任何帮助表示赞赏。

  

由以下原因引起:java.lang.NullPointerException       在Life。(Life.java:6)

4 个答案:

答案 0 :(得分:1)

您正在将构造函数与setter混合使用。似乎您正在尝试将整个网格设置为设置为任何状态。由于几个不同的原因,这行不通。首先:

this.grid[x][y] = status;

实际上正在尝试将x,y坐标处的元素设置为status。当实例化一个新的网格时,它将实际上尝试执行此操作,并且由于索引为零,因此将返回超出范围的数组异常。如果将网格设置为1、1大小,然后尝试访问元素[1、1],则该元素不存在。 [1,1]网格中唯一的元素是[0,0]。

您需要像这样分离出构造方法和设置方法:

public class Life {
    Boolean[][] grid;

    public Life(int xMax, int yMax) {       
            this.grid = new Boolean[xMax][yMax];
    }

    public void setStatus(int x, int y, Boolean status) {
            this.grid[x][y] = status;
    }

    public boolean getStatus(int x, int y) {
            return this.grid[x][y];
    }
}

编辑:正如其他人所提到的那样,如果希望网格默认为false,则应使用布尔值而不是布尔值。

答案 1 :(得分:0)

您正在访问构造函数中的grid字段,该字段尚未实例化。

可能想做的是:

public class Life {
    boolean[][] grid;

    public Life(int x, int y, boolean status) {
        grid = new boolean[5][5]; //where 5 is the size of the matrix: 5x5
        grid[x][y] = status;
    }
}

注意:我使用原始boolean而不是Boolean对象,因为在您的情况下创建对象是多余的。

更新:
如果Life应该仅是一个单元格,那么最好将grid字段声明为静态并将其实例化一次。可以通过getters \ setters对单元格进行任何操作:

public class Life {
    static boolean[][] grid = new boolean[5][5]; //where 5 is the size of the matrix: 5x5;

    public void setStatus(int x, int y, boolean status) {
        grid[x][y] = status;
    }

    public boolean getStatus(int x, int y) {
        return grid[x][y];
    }
}

答案 2 :(得分:0)

该问题是由于Boolean默认为null而引起的。因此,当您尝试执行以下操作时:

if(!this.grid[x][y]) {

您确实在做

if(!null) {

,它是无效的Java,结果为NullPointerException。如果希望网格的元素默认为false,请使用boolean[][]代替Boolean[][],因为boolean原语不能为空,并且默认为{{1} }:

false

如果构造函数需要接受public class Life { static boolean[][] grid; public Life(int x, int y, boolean status) { this.grid[x][y] = status; } } 对象,则可以使用三元数检查null:

Boolean

答案 3 :(得分:-1)

您正在呼叫此行:

if(!this.grid[x][y]) {

在未初始化的矩阵中,在第一行中声明:

Boolean[][] grid;

对于添加的每个新值,您还将覆盖网格的值,我敢肯定这不是您的意图。

您应该首先在构造函数中初始化矩阵,如下所示:

public Life(int x, int y) {
  grid = new boolean[x][y];
}

然后仅引用这样存储的值:

public addValue(int x, int y, Boolean status) {
    grid[x][y] = status;
}