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