Я использую следующий метод, чтобы попытаться найти точку (координату), которая ранее не использовалась, и не находится в границах элементов, которые ранее использовались и координировались.Java: Итерация, чтобы найти точку координат, которая не была использована?
Способ, которым это работает, - это рендеринг «оснований» (игра сверху вниз RTS), и я создаю два места случайной переменной для x и y. Я передаю их вместе с основой текстуры в следующий метод. Метод проходит через список прямоугольников, которые являются прямоугольниками каждой ранее оказанной базы. Если точка находится внутри любого из прямоугольников, метод снова вызывается с использованием другого набора координат. Он делает это, пока не найдет набор, который не находится внутри прямоугольника. Затем он добавляет новый прямоугольник в список в этих координатах и возвращает их, чтобы игра могла визуализировать новую базу.
Однако основания все еще перекрываются.
Вот метод:
private Point getCoords(int x, int y, Texture t){
for (int i=bases.size()-1; i> -1; i--) {
if (bases.get(i).contains(new Point(x,y))){
x = new Random().nextInt(map.getWidth() * map.getTileWidth());
y = new Random().nextInt(map.getHeight() * map.getTileHeight());
getCoords(x, y, t);
}
}
bases.add(new Rectangle(x,y,t.getImage().getWidth(), t.getImage().getHeight()));
return new Point(x, y);
}
А вот где она вызывается:
switch(ran){
default:
int x = new Random().nextInt(map.getWidth() * map.getTileWidth());
int y = new Random().nextInt(map.getHeight() * map.getTileHeight());
Point p = getCoords(x, y, temp);
map.generateBase("air", p.x, p.y);
break;
}
Любые идеи, что здесь не так?
Благодаря
Спасибо за ваш ответ. Однако есть проблема с этим. Я использую потоки для обновления и рендеринга игры.Цикл while заставляет поток останавливать обновление других вещей, и в данный момент многопоточность слишком сложна для задачи, настолько тривиальной. По этой причине я пытался избежать использования циклов. Есть ли другой способ этого? –
Нет реальной разницы в потоке выполнения между рекурсией for + и while + for. Единственное различие может заключаться в том, что введенный вами код выполняет более легкие операции и возвращает неправильные позиции, поэтому он должен выполнять гораздо меньше итераций/вызовов для себя, чтобы найти точку. Если вы уже используете потоки, просто создайте новый, чтобы вызвать этот метод: когда у вас есть результаты, основной поток будет обновлять игру с помощью решения, но не будет блокировать поиск точки. – Nadir