Мне нужны советы для генерации roguelike "подземелья"
Предполагается, что он "случайным образом" генерирует туннели на сетке 79x20, которая содержит несколько "комнат". Я создал несколько функций, которые по существу рисуют один туннель. Я создал функцию, которая случайным образом выбирает число и, в зависимости от этого числа, создает сеть туннелей, вызывая смесь этих функций, которые создают один путь.
Ребята, думаете ли вы, что я должен попытаться взять подземелье, которое я могу теперь создать, и попытаться удалить лишние туннели ('#'), которые не нужны? Или я должен попытаться взять сгенерированные комнаты и найти способ сделать туннели из одной комнаты в другую?
Подробности:
Требования также используют mt() для генерации "комнат" в сетке 79x20. Каждая комната должна содержать не менее 16 "плиток" (помеченных как "."). Каждое подземелье должно генерироваться случайным образом. Каждый уровень подземелья должен содержать не менее 200 комнатных плиток. Эта часть заняла у меня несколько часов, но я не выглядел слишком плохо. Я установил функции, чтобы разделить сетку на 4 секции, а затем случайным образом разместил "комнаты" не менее 16 плиток в каждой секции. Затем я сделал функцию для прохождения 2D-вектора символов и подсчета '.' символы. Если оно меньше 200, я вызываю другую функцию, которая очищает всю сетку и восстанавливает туннели / комнаты.
1 ответ
Прежде всего - взбодриться! Весь смысл жизни в том, чтобы делать ошибки, потому что вы не можете учиться, если не испытываете то, что не работает из первых рук. Когда я начинал сочинять музыку, я не знал, что делать, мне пришлось делать все то, что НЕ РАБОТАЛО в первую очередь, прежде чем я смог добраться куда-либо.:)
Что еще более важно, это нормально делать вещи, которые сосут. Мы все делаем вещи, которые отстой. Когда вы столкнулись с тем, что сделали что-то плохое, выясните, что вы сделали не так, чтобы вы знали на будущее, что делать лучше. Все мои старые песни ужасны, это не значит, что я ужасен, на самом деле совсем наоборот - это закладывает кирпичи на пути моего личного прогресса. Если я не сделаю вещи, которые отстой, я застряну - я не смогу ничего сделать, и поэтому я не поправлюсь!
Столкнувшись с трудной проблемой, не имеющей тривиального решения, такой как процедурная генерация карт, я перехожу к тому, как работают существующие реализации.
Например, Brogue имеет простой алгоритм генерации подземелий, который работает довольно хорошо:
http://brogue.wikia.com/wiki/Level_Generation
По сути, вы начинаете с комнаты, выбираете случайные края комнат / коридоров и пытаетесь создать коридор, заканчивающийся в новой комнате в этом направлении, сдаваясь и пробуя новое случайное место, если оно что-то перекрывает. Он пытается достаточно раз, чтобы уровень был плотно заполнен комнатами и коридорами. Однако этот дизайн генерирует древовидную структуру без петель, поэтому он добавляет дополнительные коридоры для обеспечения цикличности.
Исходный код Брога доступен здесь:
https://sites.google.com/site/broguegame/
(Тем не менее, обратите внимание, что генератор уровней изменился в 1.7.2, так что я думаю, что вики устарела)
Roguebasin также имеет много статей, которые дают советы по программированию для сложных частей roguelikes:
http://www.roguebasin.roguelikedevelopment.org/index.php?title=Dungeon-Building_Algorithm