Я пытаюсь случайным образом сгенерировать ориентированный граф, чтобы сделать игру-головоломку, похожую на ледяные скользящие головоломки от Pokemon.
По сути, это то, что я хочу иметь возможность генерировать случайным образом: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .
Мне нужно иметь возможность ограничить размер графика в измерениях X и Y. В примере, приведенном в ссылке, он будет ограничен сеткой 8x4.
Проблема, с которой я сталкиваюсь, заключается не в том, чтобы случайным образом генерировать граф, а в том, чтобы генерировать случайным образом граф, который я могу правильно отобразить в 2-мерном пространстве, поскольку мне нужно что-то (например, камень) на противоположной стороне узла, чтобы сделать его визуально имеет смысл, когда вы перестаете скользить. Проблема в том, что иногда порода оказывается на пути между двумя другими узлами или, возможно, на другом узле, что приводит к поломке всего графа.
Обсудив проблему с несколькими знакомыми людьми, мы пришли к нескольким выводам, которые могут привести к решению.
- Включая препятствия в сетке как часть графика при его построении.
- Начните с полностью заполненной сетки и просто нарисуйте случайный путь и удалите блоки, которые заставят этот путь работать.
Тогда возникает проблема выяснения, какие из них следует удалить, чтобы избежать введения более короткого пути. Мы также думали, что алгоритм динамического программирования может быть полезным, хотя никто из нас не слишком опытен в создании алгоритмов динамического программирования из ничего. Любые идеи или ссылки о том, как эта проблема официально называется (если это проблема с официальным графом), были бы наиболее полезными.
Вот несколько примеров того, чего я достиг на данный момент, просто разместив блоки в случайном порядке и сгенерировав график навигации из выбранного начала / конца. Идея (как описано в предыдущей ссылке) заключается в том, что вы начинаете с зеленого S и хотите добраться до зеленого F. Вы делаете это, перемещаясь вверх / вниз / влево / вправо и продолжаете двигаться в выбранном направлении, пока не нажмете стены. На этих рисунках серый - это стена, белый - это пол, а фиолетовая линия - это минимальная длина от начала до конца, а черные линии и серые точки представляют возможные пути.
Вот несколько плохих примеров случайно сгенерированных графов:
Вот несколько хороших примеров случайно сгенерированных (или откорректированных вручную) графиков:
Я также, кажется, заметил, что более сложные из них, когда на самом деле играют в эту головоломку, это те, которые имеют множество узлов высокой степени вдоль минимального пути.