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

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

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

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

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

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

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

altmax
Сообщения: 91
Зарегистрирован: 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
Сообщения: 884
Зарегистрирован: 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
Сообщения: 72
Зарегистрирован: 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 КБ) 1328 просмотров
fantasy_map_generator.rar
(1.95 МБ) 20 скачиваний

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

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

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

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

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

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

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

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

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

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

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

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

altmax
Сообщения: 91
Зарегистрирован: 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
Мастер
Сообщения: 1076
Зарегистрирован: 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.

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

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

Сообщение altmax » 15 июл 2017, 12:09

Добавил к себе в игру еще один метод генерации (точнее говоря это второй). Это будут крысиные норы в моем киберпанк-постапокалипсисе. Если я когда-нибудь его доделаю.
1. Заполняем массив случайными числами 0-100;
2. Усредняем 1-7 раз, больше усреднять смысла нет, и так всего одна большая комната остается.
3. Если больше 47 значение элемента, то это стена, меньше или равно - пустое место. Значение получено опытным путем и не мной. и я очень благодарен тому человеку, т.к. мне не пришлось перебирать 100500 вариантов. 47 реально оказалось самым оптимальным значением.
4. Ну а теперь находим комнаты и связываем их между собой. Самая ресурсоемкая часть алгоритма. Если делать данж 128х40 с одним усреднением, то получается примерно 30-35 комнат, и чтобы их все связать, уходит 1-2 секунды реального времени - не много, но уже заметно при генерации следующего уровня. Но я связываю первую со второй, потом опять ищу отдельные комнаты, снова связываю первую со второй и так до тех пор, пока не останется одна. А если комнат много, то можно связывать сразу 5-10 пар и потом проверять, так гораздо быстрее будет.
Ну и результат на скринах - 1-4 усреднения (файлы добавились почему-то в обратном порядке, потому наоборот, 4-1 усреднения :) )

Ну и есть разные методы усреднения. Я беру квадрат 3х3, вычисляю среднее значение, записываю в центр, смещаюсь к соседнему тайлу, т.е. этот квадрат смещаю на 1 ячейку. Если брать центральный элемент и по очереди усреднять его со всеми соседями, то при одном проходе матрицы там реальный муравейник получается.
Вложения
Dung4.jpg
Dung4.jpg (266.3 КБ) 279 просмотров
Dung3.jpg
Dung3.jpg (379.22 КБ) 279 просмотров
Dung2.jpg
Dung2.jpg (379.68 КБ) 279 просмотров
Dung1.jpg
Dung1.jpg (347.17 КБ) 279 просмотров

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1559
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

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

Сообщение Максим Кич » 16 июл 2017, 11:17

altmax писал(а):
15 июл 2017, 12:09
1. Заполняем массив случайными числами 0-100;
А «случайными» — это со встроенного рандома?
Dump the screen? [y/n]

Ответить

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

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