Алгоритм поиска пути для 2 пакманов - PullRequest
3 голосов
/ 23 июня 2010

Я пытаюсь реализовать Pacman.Он работает нормально, но пока призраки не используют поиск пути, а вместо этого просто выбирают случайным образом на каждом соединении пути, какой путь выбрать.Таким образом, вы можете себе представить, что Пакману не так уж сложно выиграть игру;)

Итак, я прочитал немного об алгоритмах поиска пути в Pacman, и здесь, на SO, я нашел действительно хороший ответ: Pathfinding Algorithm для Pacman

Ответы относятся к http://home.comcast.net/~jpittman2/pacman/pacmandossier.html#Chapter%204

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

Есть мысли о том, как изменить алгоритм, чтобы призраки были более или менее одинаково справедливы для обоих игроков?

Ответы [ 5 ]

5 голосов
/ 23 июня 2010

Я думаю, что самая простая стратегия - заставить каждого призрака преследовать ближайшего к нему игрока.Близость может быть рассчитана с использованием расстояния Манхэттена (в вопросе о поиске пути была ссылка на него), евклидова расстояния или длины пути до игроков.Последний вариант означает, что вам придется вычислять пути к обоим игрокам.Попробуйте все эти варианты и выберите один на свой вкус.

Кроме того, на заметку.Все люди, отвечающие на вопрос поиска пути , не упомянули алгоритм Дейкстры , который даже медленнее, чем BFS :), но позволяет искать все кратчайшие пути только один раз.То есть, если вы реализуете A * или BFS и у вас есть n призраков, вы будете делать не менее n запросов поиска пути.С Dijkstra вы можете сделать это только один раз, начиная с игрока.Но все зависит.Если ваше игровое поле слишком велико, Дейкстра - не лучший выбор.Попробуйте, поэкспериментируйте и, возможно, вам это подойдет.

3 голосов
/ 23 июня 2010

(не смотрел, но) Я предполагаю, что все алгоритмы-призраки основывают свое поведение на взаимных позициях призрака и «игрока» - ну, просто пусть каждый призрак передумает, какой из двух игроковон использует в качестве «игрока» в своем алгоритме, очень часто.

Определение того, что означает «1003 * точно », так часто * означает, что здесь возникнет вопрос для тестирования игры - если он будет включенфиксированный график «В зависимости от призрака» Варьируется в зависимости от относительной близости двух игроков • В случайном порядке - по форме / Пуассону / другому распределению?

Есть, как вы можете видеть, много возможностей. Имейте в виду, что выхочу избежать как «слишком хорошего» поведения, так и «слишком глупого» поведения ...

2 голосов
/ 23 июня 2010

Если вы можете запросить расстояние и направление к любому Пакману от любого одного Призрака, а также количество призраков (и каких призраков) в настоящее время преследуют любого Пакмана, вы сможете создать довольно хороший и простой ИИ с немного творчества.

1 голос
/ 24 июня 2010

Я не знаю, совпадает ли это с вашим представлением о «справедливости», но я думаю, что хотелось бы предотвратить случай, когда один игрок оказался ближе ко всем 4 призракам, и поэтому они в конечном итоге сгруппировались наего и следуя за ним вокруг, никогда больше не преследовать другого игрока.Это было бы возможным результатом правила, согласно которому призрак всегда следует за ближайшим игроком.

Вы можете сначала выделить достаточно 2 призраков для игрока 1 и 2 других призрака для игрока 2, а затем заставить их преследовать своихцели (и переназначение это время от времени).Хотя, если бы я был призраком в реальном мире, мне было бы все равно, если бы все мои друзья и я собирались на одном пакмане.

Вместо BFS или Dijkstra, я бы использовал поиск сначала в глубину до глубины 3или 4, используя декартово расстояние между вашим призраком и Пакманом на листьях этого дерева поиска и выбирая значение лучшего листа до корня.Для небольшого взгляда было бы быстрее и проще кодировать по сравнению с BFS и Dijkstra.Поиск с ограниченной глубиной должен дать вам довольно разумное поведение для ваших призраков, при условии, что ваша игровая доска не имеет спиральных коридоров, где количество ходов, необходимых для выхода из спирали, больше 3 или 4. Это также означает, что время выполнения алгоритма неувеличивайтесь с увеличением и увеличением досок, как это делают BFS и Dijkstra, опять же при условии, что у вас нет спиральных коридоров.

1 голос
/ 23 июня 2010

Я думаю, что вы держите алгоритмы поиска пути, описанные на этой веб-странице , которую вы упомянули. Это сделает игру более реалистичной и оригинальной. Тогда единственная проблема - определить, сколько призраков преследует конкретного Пакмана. Я думаю, что это поведение должно включать сценарии, в которых все призраки гоняются за одним игроком. Таким образом, необходим алгоритм, чтобы определить, преследуют ли 1, 2, 3 или 4 призрака игрока. Алгоритм может быть основан на разнице очков между игроками. Таким образом, игрок в лидерах будет преследоваться большим количеством призраков. Алгоритм, вероятно, должен учитывать количество жизней, оставленных игроку. Таким образом, если у игрока в лидере меньше жизней, алгоритм должен отложить увеличение количества призраков, преследующих игрока в лидере. Частота изменения количества призраков, преследующих игрока, также не должна происходить слишком часто. Если призрак меняет игрока, которого преследуют слишком сильно, то призрак, похоже, тоже не будет преследовать. Как и на упомянутой веб-странице, для получения хорошего поведения потребуются некоторые эксперименты. Я думаю, что вначале важно сохранять простоту, потому что иногда можно добиться сложного поведения, используя несколько простых правил. Удачи, и я хотел бы увидеть, что вы придумали. Пожалуйста, оставьте ссылку, когда закончите!

...