Найти в Дзене
Дебри c++, мой опыт

Рандомная генерация карты, создание рогалика на C++

Сверху - графическое представление элементов будущей карты.

Лазурные прямоугольники, покрытые сеткой соединяются желтыми линиями.

Как можно догататься - прямоугольники описывают пространство будущей комнаты, в масштабе 1 к 1. Что значит что высота и ширина прямоугольника, по меркам наложеннной сетки будет равна ширине и высоте будующей комнаты в тайтлах.

Алгоритм содания прямоугольников и расположения их в пространстве миксимально прост. Берется рандомная точка в пространстве и под ней строится прямоугольник. Ширина и высота прямоугольника выбираются также случайно в интервале между заданой минимальной и максимальной. Далее проверяется нет ли пересечений у этого прямоугольника с уже расположенными на карте. Если прямоугольник не пересекается ни с одним из уже имеющихся он добавляется в массив(становится местным), и если на карте уже есть нужное количество прямоугольников алгритм заканчивается если нет, то продолжается. Если же прямоугольник пересекается, т.е. не влезает в карту, то о нем благополучно забывают, а цикл продолжается пока не влезет нужное количество прямоугольников.

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

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

На картинке выше линии наглядно показывают какие комнаты(у нас прямоугольники) нужно соединить коридорами.

Соединения выбираются по нескольким критериям, но основных два.

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

Второе - коридоры не должны пересекать друг друга и комнаты.

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

Вобщем представте как выглядела бы карта если все комнаты были бы соединены со всеми, что не противоречит первому условию. Получилась бы неплохая пентограмма или восьмиконечная звезда.

Или вот это

-2

Таким образом при проектировании связей комнат, я руководствовался этими соображениями.

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

Следующий этап - получение информации о расположениях дверей и выстраивания алгоритма построения коридоров.

Сейчас как раз работаю над этим.

В общем это начало моего нового блога. Здесь буду освещать свое продвижение в создании рогалика на c++.

Пишите комментарии, говорите, что стоит добавить, а что наобарот удалить, задавайте вопросы на все с удовльствием отвечу.

Наука
7 млн интересуются