В Pacman призраки самостоятельно выбирают пути для поиска pacman?

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

Одним из вариантов, о котором я подумал, были темы. Все 4 призрака бегут в своих собственных потоках и каким-то образом находят положение Пакмана. Но, кажется, слишком много работать с четырьмя потоками, и синхронизация будет сложной. Кроме того, Google написал pacman в Javascript, который не поддерживает потоки, поэтому это можно сделать без потоков, и должен быть более простой способ.

Моя вторая мысль была обработчиками событий. Я просто связал событие 'directionChanged', которое pacman сработает, с 4 обработчиками событий, по одному для каждого призрака. Каждый призрак затем решает, какой путь выбрать, чтобы добраться до Пакмана. Это, я думаю, более вероятно, что происходит. Но это может замедлиться, если обработчики событий выполняются синхронно, потому что пути должны вычисляться последовательно, а четвертому призраку потребуется время, чтобы изменить направление, и это может создать видимое отставание (вероятно). Кроме того, призраки запускают событие сами, когда попадают в стену, а их обработчики изменяют направление призраков. Но учитывая частоту, с которой pacman меняет направление и четыре призрака отвечают, обработчики событий также кажутся слишком много.

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

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

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

7
задан genesis 22 September 2011 в 15:44
поделиться

3 ответа

Вы сильно над этим задумываетесь.

По стандартам видеоигр потоки и обработчики событий ужасно медленные. Многопоточные игровые движки - относительно новое изобретение, буквально спустя десятилетия после того, как был выпущен Pacman. Скудная логика Pacman будет происходить внутри одного довольно жесткого цикла, что-то вроде этого очень упрощенного псевдокода:

while (!pacman_dead) {
  foreach ghost {
    if (ghost has hit a wall) {
      if (pacman to left) turn left
      if (pacman to right) turn right
    } else {
      go straight
      if (ghost touched pacman) {
        pacman_dead = true
      }
    }
  }

  handle_input();
  move_pacman();
  draw_screen();      
}

Это довольно распространенный шаблон в играх, и он дает видимость совпадения. Обычно игра запускается в единственном цикле, который продвигает состояние игры на небольшое расстояние между перерисовками экрана. Вот почему производительность по-прежнему очень важна при разработке игр: ваша игра должна перебирать каждый внутриигровой объект, который должен что-то делать или принимать какое-то решение (противники, управляемые ИИ, движущиеся платформы, простые анимации и т. Д. ) и обновлять свое состояние не менее 30 раз в секунду.

6
ответ дан 6 December 2019 в 09:17
поделиться

Здесь много полезной информации о том, как работает pacman , включая несколько подробных описаний поведения призраков.

** Обратите внимание, что я нашел эту информацию в Алгоритме поиска пути для Pacman некоторое время назад.

РЕДАКТИРОВАТЬ:

В этом блоге сообщение есть еще больше информации о призраках.

13
ответ дан 6 December 2019 в 09:17
поделиться

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

Вот реализация , которую вы могли бы проверить. :)

1
ответ дан 6 December 2019 в 09:17
поделиться