Я только начал новый проект, в котором я хотел бы, чтобы игровой мир состоял из процедурно сгенерированных локаций, связанных телепортами. После небольшого исследования я обнаружил, что это можно назвать «теорией графов» или «чертовски сложным», в зависимости от того, кто это обсуждает. К сожалению, я нашел очень мало информации о генерации графов; большинство инструментов, которые я видел, направлены на изучение существующих графиков.
Предполагая, что я правильно определил терминологию, мои требования таковы:
- просто - ни в одном месте (вершине) не должно быть телепорта (ребра), который соединяется обратно с самим собой, и при этом две вершины не должны иметь нескольких ребер, соединяющих их
- подключен - должна быть возможность перемещаться между любыми двумя вершинами в графе (хотя я не предвижу необходимости когда-либо находить путь; достаточно просто знать, что игрок может найти одну из них, если он выберет, достаточно)
- циклический - между любыми двумя вершинами должно быть несколько путей
- ненаправленный - все края могут перемещаться в любом направлении
- бесконечный - если игрок желает этого, он должен иметь возможность путешествовать бесконечно, с продолжением генерации графа по мере приближения к
его самымнеизведанным вершинам - локально конечный - степень вершины никогда не должна изменяться после того, как игрок посетил ее
- стабильно помечен - каждая вершина представляет местоположение, которое само будет процедурно генерироваться из начального числа; одно и то же семя должно быть назначено вершине независимо от того, по какому пути туда ходил игрок или насколько велик график, когда он это делает.
У меня были некоторые идеи (которые я еще не пытался реализовать) относительно использования локальных максимумов двумерного перлин-шума в качестве вершин (входные данные x и y могли бы использоваться в качестве его метки), но это кажется неуклюжим и слишком сложным.
Есть ли лучший способ для создания такого графика? Я занимаюсь разработкой на Python 2.6 с использованием Panda3D и numpy, и, конечно, хотел бы посмотреть на включение других библиотек, если они помогут с этой проблемой!
редактировать
Я думаю, что плохо справился с объяснением некоторых моих требований, так что пришло время иллюстрации! Надеюсь, это прояснит ситуацию.
Под стабильными метками я подразумеваю, например, то, что игрок А должен иметь возможность исследовать и находить, помимо прочего, циклический путь к их исходному месту и гору, похожую на кошку. Его игра теперь выглядит примерно так (вершины нумеруются с начальным и реберным порядком, в котором игрок проходил их). Он начал с вершины 8329 (зеленый), а гора Happycat - в вершине 6745 (синий).
Хороший друг Игрока A Игрок B - фанат кошек, поэтому он хочет показать это ей. Он дает ей корневое семя для своего мира и направления по более короткому маршруту на интересующую гору. Ее игра теперь должна выглядеть так:
Проблема, с которой я в настоящее время сталкиваюсь больше всего, заключается в том, «Как создать те же семена для Игрока B, если ее исследование не пошло по тому же пути?» Вот что привело меня к идее использования шума Перлина - пока используется один и тот же начальный корень, максимумы не будут двигаться, поэтому их координаты могут использоваться в качестве стабильных начальных вершин.