2016-01-08 2 views
0

Я пытаюсь запрограммировать Minesweeper на Java. В настоящее время я пытаюсь создать х количество уникальных Mines, позиции которых (поскольку POINTS, где x соответствует Row и y в столбце для JavaFX), сохраняются в одномерном массиве. Поэтому я могу вернуть список контроллеру.Добавить уникальные случайные точки в массив

Я мог бы начать и:

  • создать все очки, добавьте их в массив, тест каждый пункт с любой другой точкой, перезаписать двойник с новыми точками, тест снова ... , но это кажется ужасно безвкусный.

Моя проблема в том, что когда я проверяю, является ли моя только что созданная точка равным .equal() для каждой точки в массиве Mines [], она генерирует исключение, поскольку массив пуст.

Это новое решение - лучшее, что я придумал до сих пор, но все еще неисправен. Либо некоторые указатели с текущим кодом, либо более элегантный подход были бы замечательными!

Спасибо за помощь

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

Есть конкретная проблема, вы испытываете? – Quotidian

+0

Если бы вы могли инициализировать весь массив равным нулю, это исправило бы вашу первоначальную проблему? –

+0

Мое решение не делает то, что я хочу, так как Мины [3] такие же, как Mine [3], а Mine [4] пуст. Когда Minenumber равен 5, и мне интересно, есть ли более элегантные решения для этого. –

ответ

1

магазин каждое положение помещенного шахты в комплекте:

Set<Point> placedMines = new HashSet<>(); 

Тогда вы можете сделать свою петлю от 0 до шахтного номера без необходимости cha nge индекс и проблемы с доступом к элементу, который еще не был установлен.

Вы можете проверить легко:

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)); 
} 
+0

Спасибо, поэтому у меня просто есть второй массив, где я проверяю уникальные значения. Если его нет во 2-м массиве, я добавлю его оба? –

+0

У вас есть массив 'Point [] Mines' и' Set'' Set размещенMines'. Вы можете даже рассмотреть вместо использования массив и набор, просто поместив 'Point', представляющий местоположение шахты в« List ». Поиск списка такой же, как и для набора. – hotzst

Смежные вопросы