Мне удалось получить достаточно хорошо выглядящие уровни, используя следующий алгоритм, основанный на квадратной сетке:
Сначала создайте набор комнат. Случайные параметры будут определять размеры комнат и их количество. Адаптивный алгоритм может даже определить некоторые зоны, которые сделаны из больших коридоров, а другие - из очень маленьких комнат.
Затем вам нужно убедиться, что все комнаты связаны друг с другом. Для этого запустите поисковик, чтобы вырыть коридоры (скажем, A *) между каждой парой комнат, придавая произвольно выбранный вес существующим пространствам (комнатам или другим коридорам) по сравнению с пространством, еще не вырезанным (стены). Если разница в весе невелика, то рытье новых коридоров будет достаточно дешевым, и алгоритм создаст много коридоров между комнатами с множеством возможностей перехода из одного места в другое. Если разница в весе велика, тогда алгоритм предпочтет пройти через существующие комнаты и коридоры, делая пути более извилистыми и с меньшим количеством вариантов для достижения определенного места назначения.
Это позволяет из небольшого числа параметров создавать очень разные по виду уровни, из редких массивных залов с небольшими коридорами, связывающими их, в лабиринт из тесно связанных друг с другом камер.
Вот пример сгенерированного уровня.
Основываясь на этом алгоритме, вы можете добавить отделку стен, которая зависит от зоны, сделать коридоры меньше или больше, сделать специальные комнаты и так далее.