首先,如果标题有误导性,我深表歉意。我想用Java实现自己的Minesweeper版本。当我创建对象数组并测试我的一个功能时,我得到了NullPointerException。浏览堆栈溢出我设法解决了我的问题。但是事实证明,必须先实例化然后初始化数组。所以我要问的是:我可以实例化一个对象数组并同时对其进行初始化吗?
MineSweeperMain.java
public class MineSweeperMain {
public static void main(String[] args) {
MineSweeper ms = new MineSweeper(9,9);
int test;
for (int i=0;i<9;i++)
for (int j=0;j<9;j++)
{
ms.tile[i][j]=new Tile(); // can I initialize the array in the same line that I am instantiating it using the default constructor?
}
test = ms.tile[0][0].getNeighbours();
System.out.println("Test: " + test);
}
}
Tile.java
public class Tile {
int numNeighbours;
boolean hasBomb;
Tile() {
numNeighbours = 0;
hasBomb = false;
}
int getNeighbours() {
return numNeighbours;
}
boolean hasBomb() {
return hasBomb;
}
}
Minesweeper.java
public class MineSweeper {
Tile tile[][];
MineSweeper(int x,int y) {
tile = new Tile[x][y];
}
}
谢谢。
编辑:使用tile[9][9]();
也不起作用。
答案 0 :(得分:2)
也许这就是您想要做的...
window = tkinter.Tk()
window.title("Sample App")
window.geometry('640x480')
tkinter.Label(window, width="5", text="Title").grid(row="0", column="0")
答案 1 :(得分:1)
首先,使用2个嵌套的for
循环填充二维数组的元素没什么问题。
但是,可以使用Java流在2D数组中生成新的Tiles。
从Stream
的代码开始,以生成Tile
s的一维数组。
Tile[] oneDArray = Stream.generate(Tile::new).limit(9).toArray(Tile[]::new);
然后,您可以使用该表达式告诉外部Stream
如何生成一维数组作为整个二维数组的一部分。
Tile[][] tile = Stream.<Tile[]>generate(
() -> Stream.generate(Tile::new).limit(x).toArray(Tile[]::new)
).limit(y).toArray(Tile[][]::new);
出于类型推断的目的,我必须明确提供Tile[]
类型参数。
我把它写成多行,但这全是一条语句。无论您选择哪种方式,嵌套的for
循环或此流解决方案,都可以将代码移入Minesweeper
构造函数中,以便将其隐藏在main
代码中。
答案 2 :(得分:0)
使用ArrayList。 在您的minesweeper类中,应该包含一个tile数组列表。 让Minesweeper的构造函数调用一个用tile填充arraylist的方法。 给每个图块一个X和Y坐标。 然后为了获得邻居,只需遍历图块arraylist以及tyle.getX和tyle.getY来确定它是否是边界……,或者它是否是炸弹..或是否已被翻转。
ArrayList tile = new ArrayList();
.....
平铺图块=新图块(X,Y)
tiles.add(tile)