我正在创建一个以回合制为基础的游戏。在这个游戏中-我有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)
答案 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;
}