将唯一随机点添加到数组

时间:2016-01-08 13:58:40

标签: java arrays unique point

我正在尝试用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

1 个答案:

答案 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));
}