我正在尝试用Java编写Minesweeper。我目前正在尝试创建x个独特的Mines,其位置(作为POINTS,其中x对应于Row,y对应于JavaFX的列)保存在一维数组中。这样我就可以将列表返回给控制器了。
我可以开始了:
到目前为止,我的问题是,当我测试我刚刚创建的点是否为.equal()时,Mines []数组中的每个Point都会抛出异常,因为数组是空的。
这个新的解决方案是我迄今为止提出的最好的解决方案,但仍然是错误的。使用当前代码或更优雅的方法的一些指针将是伟大的!
感谢您的帮助
MineNumber = mines;
Mheight = height;
Mwidth = width;
int row;
int column;
int counter = 0;
Point[] Mines = new Point[MineNumber]; //5
Random Rnd = new Random();
boolean create=true;
不知道为什么它只适用于那里-1,但经过一些尝试这种方式它至少运行
do {
if (counter < MineNumber - 1) {
row = Rnd.nextInt(Mwidth);
column = Rnd.nextInt(Mheight);
Point p = new Point(row, column);
System.out.println(p); //test
if (counter <= 0) {
Mines[0] = p;
counter++;
} else {
for (int i = 0;i < counter; i++) {
if (Mines[i].equals(p)) {
break;
} else {
Mines[counter] = p;
counter++;
}
}
}
} else {
create = false;
}
} while (create);
System.out.println(Mines[0] + " " + Mines[1] + " " + Mines[2] + " "
+ Mines[3] + " " + Mines[4]);
}
Output:
java.awt.Point[x=3,y=2]
java.awt.Point[x=1,y=8]
java.awt.Point[x=9,y=12]
java.awt.Point[x=3,y=2] java.awt.Point[x=1,y=8] java.awt.Point[x=9,y=12] java.awt.Point[x=9,y=12] null
答案 0 :(得分:1)
将放置的矿的每个位置存储在一个集合中:
Set<Point> placedMines = new HashSet<>();
然后你可以从0到我的数字进行循环,而无需更改索引并遇到访问尚未设置的元素的问题。
您可以轻松查看:
Point p = Point(row, column);
while (placedMines.contains(p)) {
// there is already a mine at that location, select a different one.
p = Point(Rnd.nextInt(Mwidth), Rnd.nextInt(Mheight));
}