В Пакмане призраки самостоятельно выбирают пути для поиска Пакмана? - PullRequest
7 голосов
/ 21 августа 2010

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

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

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 21 августа 2010

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

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

EDIT:

Этот блог post содержит еще больше информации о призраках.

6 голосов
/ 21 августа 2010

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

Потоки и обработчики событий ужасно медленны по стандартам видеоигр.Многопоточные игровые движки - относительно новое изобретение, буквально через десятилетия после выпуска 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 раз в секунду.

1 голос
/ 21 августа 2010

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

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

...