Pacman: как глаза находят свой путь назад к дыре монстра?

Я нашел много ссылок на AI фантомов в Pacman, но ни один из них не упомянул, как глаза находят свой путь назад к центральной фантомной дыре после того, как фантом ест Pacman.

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

Действительно ли там кто-либо лучше/или лучшее решение? Возможно, универсальный, который работает с проектами другого уровня?

320
задан smci 30 August 2013 в 13:48
поделиться

15 ответов

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

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

РЕДАКТИРОВАТЬ (11 августа 2010 г.): Меня только что направили на очень подробную страницу в системе Pacman: Досье Pac-Man , и, поскольку у меня есть принятый ответ здесь, я чувствовал, что должен обновить Это. В статье, кажется, не рассматривается акт возвращения в дом монстров явно, но в ней говорится, что прямой поиск пути в Pac-Man - это случай следующего:

  • продолжайте движение к следующему перекрестку (хотя это, по сути, особый случай: «когда предоставляется выбор, выберите направление, которое не требует изменения вашего направления, как показано на следующем шаге);
  • на перекрестке посмотрите на соседние квадраты выхода, кроме того, из которого вы только что пришли ;
  • выбор ближайшего к цели. Если около цели в равной степени находятся несколько человек, выберите первое допустимое направление в следующем порядке: вверх, влево, вниз, вправо.
150
ответ дан 23 November 2019 в 00:59
поделиться

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

1
ответ дан 23 November 2019 в 00:59
поделиться

Это проблема поиска пути. Популярный алгоритм см. в http://wiki.gamedev.net/index.php/A*.

3
ответ дан 23 November 2019 в 00:59
поделиться

Вам следует взглянуть на алгоритм поиска пути, например Алгоритм Дийсктры или алгоритм A * . Вот в чем ваша проблема: проблема с графиком / путём.

18
ответ дан 23 November 2019 в 00:59
поделиться

Зная, что пути pacman не случайны (т.е. каждый конкретный уровень 0-255, чернильный, мигающий, мизинец и клид будет работать точно так же для этого уровня).

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

1
ответ дан 23 November 2019 в 00:59
поделиться

Любое простое решение, которое работает, является обслуживаемым, надежным и достаточно хорошо работает, является хорошим решением. Мне кажется, вы уже нашли хорошее решение ...

Решение для поиска пути, вероятно, будет более сложным, чем ваше текущее решение, и, следовательно, с большей вероятностью потребует отладки. Вероятно, тоже будет медленнее.

ИМО, если он не сломан, не чините его.

ИЗМЕНИТЬ

ИМО, если лабиринт исправлен, то ваше текущее решение - это хороший / элегантный код. Не делайте ошибку, приравнивая «хороший» или «элегантный» к «умному». Простой код также может быть «хорошим» и «элегантным».

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

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

18
ответ дан 23 November 2019 в 00:59
поделиться

Вот аналог и псевдокод идеи заливки ammoQ.

queue q
enqueue q, ghost_origin
set visited

while q has squares
   p <= dequeue q
   for each square s adjacent to p
      if ( s not in visited ) then
         add s to visited
         s.returndirection <= direction from s to p
         enqueue q, s
      end if
   next
 next

Идея состоит в том, что это поиск в ширину, поэтому каждый раз, когда вы встречаетесь с новым соседним квадратом s, лучший путь лежит через p. Я верю, что это О (Н).

2
ответ дан 23 November 2019 в 00:59
поделиться

В качестве альтернативы более традиционным алгоритмам поиска пути, вы можете взглянуть на (соответствующее название!) Pac-Man Scent Antiobject pattern.

При запуске лабиринта можно распространить вокруг него запах монстров и заставить глаза следовать за ним до дома.

Как только запах будет установлен, затраты времени на выполнение будут очень низкими.


Edit: к сожалению, статья из википедии была удалена, так что WayBack Machine в помощь...

42
ответ дан 23 November 2019 в 00:59
поделиться

Думаю, ваше решение подходит для проблемы, проще, чем это, состоит в том, чтобы сделать новую версию более «реалистичной», где призрачные глаза могут проходить сквозь стены =)

2
ответ дан 23 November 2019 в 00:59
поделиться

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

5
ответ дан 23 November 2019 в 00:59
поделиться

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

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

14
ответ дан 23 November 2019 в 00:59
поделиться

Я мало что знаю о том, как вы реализовали свою игру, но вы могли бы сделать следующее:

  1. Определить расположение глаз относительно ворот. т.е. осталось наверху? Прямо внизу?
  2. Затем переместите глаза в одном из двух направлений (например, заставьте его двигаться влево, если он находится справа от ворот, и ниже ворот) и проверьте, есть ли стены и мешают вам это сделать.
  3. Если есть стены, которые мешают вам сделать это, заставьте его двигаться в противоположном направлении (например, если координаты глаз относительно булавки - правый север, а в данный момент он двигался влево, но в
  4. Не забывайте проверять каждый раз передвижение, чтобы проверять, где находятся глаза по отношению к воротам, и проверять, нет ли координаты широты, т. е.это только над воротами.
  5. В случае, если это только над воротами, двигайтесь вниз, если есть стена, двигайтесь влево или вправо и продолжайте делать это число 1–4, пока глаза не окажутся в логове.
  6. Я никогда не видел тупика в Pacman, этот код не учитывает тупики.
  7. Кроме того, в моем псевдокоде я включил решение, когда глаза будут «качаться» между стеной, проходящей через начало координат.

Какой-то псевдокод:

   x = getRelativeOppositeLatitudinalCoord()
   y
   origX = x
    while(eyesNotInPen())
       x = getRelativeOppositeLatitudinalCoordofGate()
       y = getRelativeOppositeLongitudinalCoordofGate()
       if (getRelativeOppositeLatitudinalCoordofGate() == 0 && move(y) == false/*assume zero is neither left or right of the the gate and false means wall is in the way */)
            while (move(y) == false)
                 move(origX)
                 x = getRelativeOppositeLatitudinalCoordofGate()
        else if (move(x) == false) {
            move(y)
    endWhile
2
ответ дан 23 November 2019 в 00:59
поделиться

Я решил эту проблему для общих уровней таким образом: Перед началом уровня я делаю своего рода "заливку" из отверстия монстра; каждая плитка лабиринта, которая не является стеной, получает число, которое говорит, как далеко она находится от отверстия. Поэтому, когда глаза находятся на плитке с расстоянием 68, они смотрят, какая из соседних плиток находится на расстоянии 67.

85
ответ дан 23 November 2019 в 00:59
поделиться

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

Значения могут быть предварительно вычислены с помощью любого доступного алгоритма.

3
ответ дан 23 November 2019 в 00:59
поделиться

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

2
ответ дан 23 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: