Генерация мира

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Аватара пользователя
kipar
Сообщения: 2073
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Генерация мира

Сообщение kipar » 15 фев 2017, 09:20

BreakMT писал(а):
15 фев 2017, 08:52
Я похожие карты генерировал и без всяких сложных алгоритмов - просто соединял комнаты без обхода. Почему бы не соединять их последовательно, зачем какие-то графы и "компоненты связанности"? :shock:
Картинку давай. У меня когда я пробовал получалось не очень интересно, слишком очевидные коридоры и много перекрестков. Но у тебя насколько я помню подземелья неплохо выглядели.

altmax
Сообщения: 70
Зарегистрирован: 15 сен 2012, 11:59

Re: Генерация мира

Сообщение altmax » 15 фев 2017, 12:05

BreakMT писал(а):
15 фев 2017, 08:52
Я похожие карты генерировал и без всяких сложных алгоритмов - просто соединял комнаты без обхода. Почему бы не соединять их последовательно, зачем какие-то графы и "компоненты связанности"? :shock:

PS: посмотрел свои исходники. Я делал так - у комнаты может быть от 1 до 4 дверей. Первая дверь обязательно соединяется со следующей комнатой, остальные двери с рандомной.
В данном алгоритме комнаты раскидываются рандомно и их может быть очень много, т.е. можно кинуть не 40 комнат, как на скрине, а 100. И комнаты могут накладываться друг на друга. Если комнат прям очень много, то в итоге получается 2-3 больших зала странной формы. И если все комнаты соединять последовательно, то в итоге коридоры покроют почти весь уровень и он превратится в одну огромную комнату. А здесь вычисляются отдельные друг от друга помещения и строится минимально достаточное количество проходов.

Аватара пользователя
BreakMT
WANDER Team
Сообщения: 880
Зарегистрирован: 27 ноя 2006, 12:16

Re: Генерация мира

Сообщение BreakMT » 15 фев 2017, 13:54

altmax писал(а):
15 фев 2017, 12:05
BreakMT писал(а):
15 фев 2017, 08:52
Я похожие карты генерировал и без всяких сложных алгоритмов - просто соединял комнаты без обхода. Почему бы не соединять их последовательно, зачем какие-то графы и "компоненты связанности"? :shock:

PS: посмотрел свои исходники. Я делал так - у комнаты может быть от 1 до 4 дверей. Первая дверь обязательно соединяется со следующей комнатой, остальные двери с рандомной.
В данном алгоритме комнаты раскидываются рандомно и их может быть очень много, т.е. можно кинуть не 40 комнат, как на скрине, а 100. И комнаты могут накладываться друг на друга. Если комнат прям очень много, то в итоге получается 2-3 больших зала странной формы. И если все комнаты соединять последовательно, то в итоге коридоры покроют почти весь уровень и он превратится в одну огромную комнату. А здесь вычисляются отдельные друг от друга помещения и строится минимально достаточное количество проходов.
Теперь понятно, благодарю. У меня карты были довольно компактные, поэтому с такой проблемой не сталкивался.

Код: Выделить всё

#########
#.......#
+...@.z.#             "Got ya, didn't I, you little sucker!!!"
#.......#
#########
>>Мои программы для Андроида<<

Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Re: Генерация мира

Сообщение Oreyn » 15 фев 2017, 16:25

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

Пример:
Скрытый текст: ПОКАЗАТЬ
Изображение
Шаблоны комнат хранились в json с данными о тайлах и доступных выходах, относительно некого центра. Что позволяло просто их алгоритмически крутить на 90 градусов.
В центр карты поставили стартовую комнату, добавили ее доступные выходы в пул.
Рандомно вытащили новый шаблон из доступного пула, рандомно повернули его на угол кратный 90, попробовали прислонить его к рандомному доступному выходу из пула. Не вышло - повторяем всю процедуру.
Если вышло - добавляем комнату, новые выходы в пул, те что были задействованы при соединении - убираем.
Из нюансов, тайлы стен нужно разрешать накладывать друг на друга, чтобы толщина стен между комнатами была возможна в 1 тайл.
Плюс кольцевые связывания выходов возможны только случайно, и нужно учитывать, чтобы они выходили из пула свободных входов.
Еще момент - нужно поиграться с вероятностью выпадения сегментов коридора, их обычно должно быть чуть больше.
Повторять пока критерий построенности подземелья не выполнен. Я делал что занято Н процент клеток из доступных на поле. (которые, понятно считались декрементально от Х на У всего поля размер и минус занятые тайлы при установке каждой новой комнаты.
Или же генерить все заново если закончились свободные входы или же неудачных попыток прислонить новую комнату больше лимита.

Эдакий собиратель паззлов с кристализацией от центра и в итоге получается компактный лабиринт. На больших типовых комнатах шаблоны будут видны, но на Г, Т и | образных сегментах коридора - фиг там =)

Далее алгоритм был усложнен, в пул шаблонов комнат подмешивались новые исходя из условий заполненности клеток. Так можно особые комнаты располагать ближе к концу уровня.

Karlo
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:01

Re: Генерация мира

Сообщение Karlo » 20 фев 2017, 22:22

В соседней теме вспомнил, как генерировал карты биомов. В общем суть, все делается по шумам Перлина, генерируется карта высот. Создается шум температур и накладывается на градиент температур для симуляции поясов. Далее генерируем влажность. При накладывании всех трех карт руководствуемся несложными правилами, то как - над водой влажность максимальная, в горах температура ниже и еще чето-то там было. А на основе всех наложений высчитываем биомы. В общем закидываю файлик с прогой, в ней можно поиграться картами, правда она тормозит нереально, поэтому кнопки надо нажимать много много раз, чтобы сработали. New - генерация новой карты, Hght - карта высот, Temp - карта температур, Moist - карта влажности, Bioms - сама карта, Retrn - показать общую картинку.
Вложения
2017-02-21_01-20-31.png
2017-02-21_01-20-31.png (87.33 КБ) 917 просмотров
fantasy_map_generator.rar
(1.95 МБ) 15 скачиваний

Аватара пользователя
Jesus05
Сообщения: 1785
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Генерация мира

Сообщение Jesus05 » 21 фев 2017, 06:52

А как-же код :) поиграться это хорошо, но подробный алгоритм построения был бы ценнее.

Аватара пользователя
Apromix
Мастер
Сообщения: 1068
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Генерация мира

Сообщение Apromix » 21 фев 2017, 09:25

Неплохо бы такую штуку заточить в берлиб :)
Изображение Изображение

Karlo
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:01

Re: Генерация мира

Сообщение Karlo » 21 фев 2017, 12:31

Jesus05 писал(а):
21 фев 2017, 06:52
А как-же код :) поиграться это хорошо, но подробный алгоритм построения был бы ценнее.
какой алгоритм описать? Перлина?
по сути строится 3 матрицы шума, одна градиентом(по убыванию по 'y' например), потом в пятую записываются данные, которые сравниваются в трех. Все пороги подбираются только методом тыка, так как у всех разные цели. Неделю гуглил, читал,как шумы вообще создаются, за день сделал, все просто оказывается :wink:
Могу конечно сам код привести

altmax
Сообщения: 70
Зарегистрирован: 15 сен 2012, 11:59

Re: Генерация мира

Сообщение altmax » 23 фев 2017, 08:38

Karlo писал(а):
21 фев 2017, 12:31

Могу конечно сам код привести
Ну было бы неплохо.

Аватара пользователя
Uvadzucumi
Сообщения: 364
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Генерация мира

Сообщение Uvadzucumi » 19 мар 2017, 21:56

Раз уж раскопали такую древнюю тему, то положу сюда и свой вариант генерации карты (также на перлине основан). идея была создать остров/острова где бы и происходило все действо. результат приблизительно такой:
Скрытый текст: ПОКАЗАТЬ
Изображение
Изображение
описание алгоритма: viewtopic.php?f=7&t=1097#p34514
исходники можно тут глянуть: https://github.com/Uvadzucumi/simple-roguelike
Меня окружали милые, добрые люди... медленно сжимая кольцо

Аватара пользователя
Apromix
Мастер
Сообщения: 1068
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Генерация мира

Сообщение Apromix » 20 мар 2017, 08:27

Помню-помню, сам тогда такое примерно повторил по твоему алгоритму на дельфи, но, кажись, нигде так и не использовал. Эх, ностальгия :D Удалось тогда съездить на родину :lol: ?
Изображение Изображение

Аватара пользователя
Uvadzucumi
Сообщения: 364
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Генерация мира

Сообщение Uvadzucumi » 21 мар 2017, 18:48

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

Аватара пользователя
Христос
Сообщения: 1
Зарегистрирован: 18 апр 2017, 18:49

Re: Генерация мира

Сообщение Христос » 22 апр 2017, 08:28

В игре XCOM 2 используется система генерации карт из заранее созданных кусочков. Это позволяет уровням быть проработанными и случайно-генерируемыми одновременно.
I never asked for this.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя