Comments 35
Я бы не отказался от продолжения!
Интересны хорошие алгоритмы генерации карт с комнатами.
И карты с произвольными дорогами и областями(не квадратными), но доступными к прохождению из любого «ходимого» куска карты к любому.
Алгоритмы генерации помещений, боюсь, немного выходят за рамки цикла, но, при возможности, я с радостью о них напишу. Единственное, что подойдет для таких целей, я думаю, алгоритм рекурсивного деления, который при должной настройке способен создавать планы помещений.
Насчет карт с произвольными дорогами… Тут сложнее. Прежде, чем увлечься лабиринтами, я замышлял написать свой генератор процедурных городов, со всеми правилами строительства: выбором роста города и дорог (прямые дороги, радиальные, хаотичные...), выбором различных городских занятий (туристический город/промышленный), от которых бы зависели типы и размеры районов, и всё в таком духе. К сожалению, пока до реализации такого не дошло, но, может быть, ради Хабра что-нибудь да напишу.

Также видел алгоритмы по генерации карт в туториалах по Юнити (ссылка). Если примерно, то алгоритм выглядит так:
1) Берём двумерный массив и рандомом заполняем его(в туториале использовалась переменная — % заполнения — генерим число от 0 до 100 и если оно меньше % заполнения, то ставим тут стенку)
2) Делаем несколько итераций «сглаживания» (берём каждую клетку, если это стенка если её окружает < N стенок то делаем её пустой. Если это не стена, но её окружает < M стенок, то делаем стенку). В итоге «одинокие» стенки и «дырки» пропадают. Повторяем эту процедуру X — раз. (N, M и X — то же переменные, с которыми можно играться и от них будет сильно зависить результат)
3) Делаем два лист листов: один — коллекция областей(область — коллекция клеток) в которых стены, второй — коллекция областей без стен. Таким образом у нас есть N — комнат, которые мы теперь можем просто соединить между собой или просто сдвинуть.
Играясь с переменными будет получаться совершенно разный результат. Тут ещё стоит учитывать что «сглаживание» увеличивает разрыв между пустыми клетками и клетками со стенами. В моём случае в 45-48% заполнения получались большие пустые области с несколькими комнатками, а в случае 52-55% — много небольших-средних комнатушек.
Спасибо за статью!
Помнится, в детстве развлекался тем, что рисовал подобные лабиринты на бумаге, а потом пытался пройти их, используя карманный микроскоп с небольшим увеличением (до чего только не дойдёшь, когда нет компьютера). Вот тогда бы мне точно пригодился Sidewinder!

Очень странная расстановка стен, непонятно от чего зависящая. Лабиринт явно не идеальный, так как имеет циклы, судя по всему, с более вертикальным смещением.
YouTube-видео через тег <oembed>...</oembed>
вставляется в статьи
https://www.youtube.com/watch?v=tVDl2Tj_vmw
ps
через oembed не хочет
Обязательно пишите!
Мне очень интересно, вылезет ли где-то алгоритм на графе, который я придумывал буквально незадолго до первой статьи на эту тему на Хабре (таки надо его запрограммировать :) )
Графы чем хороши — так это тем, что построение лабиринта в принципе отвязано от его геометрии. Долой квадратность!
Очень ждал подобную статью. Информативная и понятная. Жду продолжения.
Я так понял Вы хотите пройтись по следующим распространенным алгоритмам:
- Алгоритм бинарного дерева (есть)
- Алгоритм Эллера (есть)
- Алгоритм Прима
- Алгоритм Олдоса-Бродера
- Алгоритм Уилсона
- Алгоритм Крускала
- Алгоритм рекурсивного деления
- Алгоритм рекурсивного поиска с возвратом?
Кстати, могу ошибаться, но алгоритм «Sidewinder это Алгоритм Эллера, он же Simple algorithms (когда в памяти храниться текущая и предыдущая строки лабиринта).
А так в вашем списке не хватает еще 2-3 алгоритмов:
Алгоритм Уилсона,
Алгоритм HuntandKill,
Алгоритм растущего дерева (по сути, рекурсивный поиск с возвратом при одном из вариантов реализации)
Эллер манипулирует неограниченным количнством одновременно, в том числе и объединяя некоторые из них
Как раз таки наоборот, я вычитал здесь, что алгоритм Эллера особенный, и хоть он похож на алгоритм Крускала, но весь его "сахар" в том, что не обязательно держать в памяти весь лабиринт, а достаточно размерности строки.
Эллер работает с ограниченным количеством множеств, вплоть до размерности строки.
То есть, если у Вас строка состоит из десяти клеток, то, теоретически, Эллер может работать с 10 отдельными множествами и не объединить ни одного. Sidewinder же всегда работает исключительно с одним.
Классические алгоритмы генерации лабиринтов. Часть 1: вступление