2013-10-02 6 views
0

Я пытаюсь случайным образом генерировать рельеф для игры таким образом, что объект в позиции x, y имеет номер типа f(x, y) (поэтому мне не нужно сохранять значения всех объектов. Я пытаюсь создать среду, как город, с улицами и блоками между нимиСлучайное мировое поколение улиц

. Например:

# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # 
# # # # # # # # # # # # 
      # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 

# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 

я могу генерировать что-то вроде как это в обычной модели, используя f(x, y): (x*y) mod n, где n является константой, а полученный фрагмент пуст, если f(x, y) == 0.

Например, с n, как 5:

# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 

# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 

# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 
# # # # # # # # # # # # 

Как я могу изменить свой алгоритм (или получить новый), чтобы получить результаты больше как в первом примере?

Или я об этом совершенно не так?

+1

Поиск генераторов подземелий типа изгоев. Вы должны быть способны адаптировать его к вашим потребностям. Просто замените комнаты-> здания и коридоры-> дороги, и все готово. – Geobits

+0

@Geobits Будут ли работать так, как я хочу, с помощью функции? Поскольку я мог бы создать алгоритм, который строит карту вверх по биту, чтобы быть таким, но тогда это должно было быть все сохранено в памяти, не так ли? – rlms

+0

Нет структур в памяти? Могу ли я спросить, почему? Если вы хотите нарисовать это на экране, вы не захотите запускать 'f (x, y)' для каждого пикселя/блока при каждом обновлении экрана. – Geobits

ответ

0

Я нашел функцию, которая производит более или менее то, что я хочу, однако это определенно может быть улучшено.

псевдокод:

function f(x, y): 
if x mod size_of_zones == 0 or y mod size_of_zones == 0: 
    return 0 
elif x % (a number between the maximum and minimum block sizes, randomly picked but the same for each block) == 0: 
    return 0 
elif y % (a number between the maximum and minimum block sizes, randomly picked but the same for each block) == 0: 
    return 0 
else: 
    return 1 

Мой код a number between the maximum and minimum block sizes, randomly picked but the same for each block был такой:

shuffled_list_of_integers_between_min_and_max_block_sizes[(y floordiv zone_size) mod maximum_block_size] 

для x и

shuffled_list_of_integers_between_min_and_max_block_sizes[(x floordiv zone_size) mod maximum_block_size] 

для y.

0

Для первого вопроса: это зависит от того, как «естественно» вы этого хотите. Вы можете легко использовать случайный генератор для генерации некоторых дорог определенной длины; или лучше, сделать дорогу, затем с обоих концов начать новую дорогу и т. д.

В случае более естественного способа подумайте о том, как выглядит настоящий город: более длинные дороги, с меньшими дорогами внутри. это, конечно, должно быть отражено в алгоритме.

Я не понимаю ваш второй вопрос, ... просто меняя каждый # на разные символы (обозначая разные здания)? В этом случае учитывайте здания разных размеров. Вам лучше сначала провести расстановку улиц, затем оставить (возможно, даже по улицам слева/справа), заполнив здания.

Edit:

Вы также можете использовать вместо «ASCII» карты, как и выше использование указателей на объекты. . в приведенной выше карте 14x14 вместо использования одного символа ASCII используйте указатель на объект. Что может указывать на что-нибудь вроде: - Дорога - Строительство (унаследованный от нескольких типов зданий)

Вы можете иметь несколько квадратов указывают на тот же объект (обозначающего большие здания), или на той же улице. Преимущества: - Вы можете использовать все виды недвижимости (например, какое здание, функции здания, возраст, статистика для здания) - Для дорог: название, указатели на другие дороги, связанные с ним (для целей навигации).

+0

Для второго вопроса - есть разные типы зданий. Вместо 2 типов плитки - пустой и полный, имея много, где одна плитка используется для создания улиц, а остальные - случайный микс. – rlms

+0

Я предполагаю, что # представляет собой здание ... просто используйте разные символы в этом случае ... и, возможно, специальные комбинации для больших зданий (например, # = дом, $ 01 = дом (3 пробела), $ 002 = гараж, четыре линии $ 00004 для пространства 4x6, такого как аэропорт и т. д.). –

+0

Также см. Редактирование в моем ответе для другого решения для зданий. –

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