@kunjut19

Наиболее эффективный способ проверить принадлежность клетки диапазону (карта на 2-мерном массиве)?

5e768f2ab420f919285571.png

Храню карту игры в 2-мерном массиве. Задача такая: рандомно сгенерировать новый объект недалеко от заданной точки (вон она, красная), но на определенном расстоянии (в синей области), а именно - не ближе, чем в 4 клетках, но не дальше 7 клеток. Как создать такой сложный диапазон для рандома, я не представляю. Но пробовал делать так:
var new_y = Math.floor(Math.random() * (max_distance - max_distance * -1)) + max_distance * -1;
if (Math.abs(new_y) > min_distance) {
    var new_x = Math.floor(Math.random() * (max_distance - max_distance * -1)) + max_distance * -1;
        if (Math.abs(new_x) > min_distance) {

где max_distance = 8, а min_distance = 5. Но это не совсем удачная идея, потому что даже при 50 попытках не всегда получается выбрать точку в таком диапазоне. А использовать больше попыток не очень эффективно, как мне кажется. Как бы вы посоветовали решить эту задачу?
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Выбор стороны умноженный на диапазон.
X=(5(1-C1)+D1)(-1)^A
Y=(5(1-C2)+D2)(-1)^B

Случайные значения (каждое - генерируется отдельно!):
C1 - 0 или 1
A,B - 0 или 1

Вычисляемые значение:
C2=NOT C1=(C1%2+1)%2
C1==1 => D1 - рандом от 0 до 7, иначе: от 0 до 2
C2==1 => D2 - рандом от 0 до 7, иначе: от 0 до 2
Ответ написан
@ksnk
Там количество подходящих координат ограничено, и сильно меньше количества всех координат карты ? Перечислить сначала все координаты, которые можно выбирать, потом из них выбрать случайную. Для оптимизации этого дела - сгенерировать один раз "маску смещений" - массив смещений от "базовой точки". Итого - случайно выбираем элемент маски, складываем координату с нужной точкой - профит...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы