Хорошо, если я теперь понимаю, сначала ...
Ваши данные пределов могут быть проще, если они представляют прямоугольные пределы. Вам нужно только minX, maxX, minY, maxY. Я хотел бы создать объект для хранения этих:
public class Limits {
int minX;
int minY;
int maxX;
int maxY;
public Limits(int x1, y1, x2, y2) {
minX = x1;
minY = y1;
maxX = x2;
maxY = y2;
}
}
Тогда ваши объекты станут
Limits weaponAreaLimits = new Limits(-2, -2, 2, 2);
Limits foodAreaLimits = new Limits(-3, -3, 3, 3);
Limits trapAreaLimits = new Limits(-4, -4, 4, 4);
Это работает, потому что прямоугольник может быть определен двумя диагональными углами. В этом случае мы используем нижний левый и верхний правый углы. Вам не нужна каждая вершина.
Теперь вам нужен такой метод:
public boolean setPoints(Item item, Limits includeRange, Limits excludeRange) {
// These two variables hold the width & height of the box where things can be
int width = includeRange.maxX - includeRange.minX + 1;
int height = includeRange.maxY - includeRange.minY + 1;
int x;
int y;
do {
x = includeRange.minX + (rand() % width);
y = includeRange.minY + (rand() % height);
// At this point, x and y are inside the includeRange.
// We need to make sure they aren't in the disallowed area
} while ( (excludeRange == null) ||
(x >= excludeRange.minX && x <= excludeRange.maxX &&
y >= excludeRange.minY && y <= excludeRange.maxY) );
// When the above loop exits, you have an x and y that works.
item.x = x;
item.y = y;
return true;
}
Я не запускаю это через компилятор Java, поэтому могут быть синтаксические ошибки. Но в основном мы зацикливаемся, произвольно устанавливая x и y во внешнем блоке, пока не получим случайное значение, которого нет внутри внутреннего блока. Но мы также допускаем нулевое внутреннее поле, чтобы мы могли обращаться с оружием тем же методом.
Теперь, чего здесь не хватает - я не проверяю, чтобы убедиться, что это место не занято чем-то другим. ,Этот метод должен возвращать false, если он не может работать, потому что вся область уже заполнена. Я оставлю это для вас. Представьте, что вы пытались добавить 50 единиц оружия в область, в которой можно удерживать только 25.
Здесь есть куча важных вещей. Помимо базовой структуры кода, есть понимание определения прямоугольника. Внутри этого прямоугольника генерируются случайные числа. И есть код исключения.
Надеюсь, этого достаточно для продвижения вперед.