Переводы → Алгоритм поведения призраков в игре Pac-Man

Это перевод статьи Chad Birch, оригинал которой доступен здесь: Understanding Pac-Man Ghost Behavior

Мне кажется, что начать этот блог нужно той темой, которая вдохновила меня на создание этого блога. Не так давно я наткнулся на Джейми Питмановское "Досье Pac-Man'а", который является смехотворно-детальным объяснением механики Pac-Man. Мне показалость это абсолютно увлекательным, поэтому этот блог - моя попытка обнаружить и совокупить такую же детализированную информацию о других играх (хотя и в маленьком кусочках). В дань величайшей игре, я начну с Pac-Man, в частности, с ИИ призраков. Это очень интересная тема и, надеюсь, мое объяснение будет немного более доступно, чем Джеймовское в связи с тем, что я сосредоточу внимание лишь на поведении призраков.

О игре

“Все доступные в то время компьютерные игры были лишь насильственного типа, вроде военных игр и космических захватчиков. Не существовало ни одной игры, играя в которую мог насладиться каждый, и особенно ничего не было создано для женщин. Я хотел придумать "смешную" игру, которой могли наслаждаться и женщины”
- Тору Иватани, создатель Pac-Man
Pac-Man является одной из наиболее культовых видео-игр всех времен и большинство людей (говоря людей, я подразумеваю не геймеров тоже) по крайней мере слышали о ней. Смысл игры очень прост - игрок находится в лабиринте, наполненном продуктами питания, которые изображены в виде гранул и точек, и кушает все это, чтобы перейти на следующий уровень. Это задача осложняется четырьмя призраками, которые преследуют Pac-Man'а в лабиринте. Если Pac-Man встречается с призраком, то игрок теряет жизнь, а Pac-Man и призраки возвращаются на исходные позиции. К счастью, съеденные гранулы так и остаются съеденными. В противовес простого избегания призраков, единственным вариантом защиты есть четыре большие "энерджайзерные" гранулы, которые расположены в углах лабиринта. Поедание этих гранул ненадолго заставляет призраков обратиться в бегство, а на ранних уровнях игры, Pac-Man может даже съесть призраков ради получения бонусных очков и просто удовольствия. Съеденный призрак уничтожается не навсегда, а возвращается в начальную позицию для нового преследования игрока. Кроме поедания гранул и призраков есть еще один источник очков - две вишенки, которые появляются после поедания 70 (первая вишенка) и 170 (вторая вишенка) гранул.


Каждый уровень игры использует тот же лабиринт, содержащий 240 гранул и 4 энерджайзера. Туннели слева и справа от экрана выступают в качестве телепорта и могут использоваться как игроком, так и призраками. Поскольку лабиринт один и тот же, уровни отличаются скоростью Pac-Man'а, а также поведением и скоростью призраков. После достижения 21-го уровня не происходит никаких изменений в игровой механик, поэтому все уровни после 21-го полностью одинаковы.

Общие элементы поведения призраков

“Существует не так много развлечений в игре о приеме пищи, поэтому мы решили создать врагов, чтобы придать игре немного остроты. Игрок должен бороться с врагами, чтобы получить пищу. И каждый из врагов имеет свой собственный характер. Врагами выступают четыре маленьких призрачных монстра, каждый из которым имеет разный цвет - голубой, желтый, розовый и красный. Я использовал четыре разных цвета, в основном, чтобы удовлетворить женщин, которые будут играть - я думал, им понравятся эта прелестная раскраска”
- Тору Иватани, создатель Pac-Man

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

Дом призраков

Когда игрок начинает играть, он не сразу подвергается атаке сразу четырьмя призраками. Как показано на рисунке с первоначальным игровым положением, только один призрак появляется в лабиринте, все остальные сидят в маленьком замкнутом пространстве, названном "домом призраков". Призраки будут возвращаться в этот дом только в случае начала нового уровня, смерти Pac-Man'а или в том случае, когда Пак-Ман съест их. В других случаях дом призраков недоступен ни для игрока, ни для призраков. Призраки всегда движутся влево после покидания дома, хотя иногда меняют направление сразу из-за эффекта, который будет описан позже

Условия, определяющие момент, когда три призрака, оставшихся в доме, могут покинуть его, очень сложны. Из-за этого я считаю их выходящими за рамки данной статьи, в особенности из-за того, что они становятся менее актуальными после прохождения нескольких уровней. Если вы заинтересованы в чтении этих правил (а также заинтересованы в их использовании), то "Досье Pac-Man'а" вас ждет.

Клетки-цели

Большая часть дизайна и механики игры вращается вокруг идеи разбиении игрового экрана на клетки. Клеткой в этом контексте является квадрат 8х8 пикселей на экране. Разрешение экрана игры составляет 224х228 пикселей, что в итоге дает нам экран размером 28х36 клеток, большая часть которых недоступны для Пак-Мана и призраков. Примером действия клеток, является то, что призрак поймавший Пак-Мана, находится с ним в одной и той же клетке. Кроме того, каждая гранула находится в центре собственной клетки. Нужно отметить, что размеры Пак-Мана и призраков несколько больше, чем 8х8, поэтому на экране они никогда не содержатся в одной клетке. Поэтому считается, что игрок/призрак находится в той клетке, которая содержит его центральную точку. Это очень важно для бегства от призраков, поскольку Пак-Ман будет пойман только в том случае, если центральные точки Пак-Мана и призрака будут находиться в одной клетке.

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

Типы поведения призраков

Призраки всегда находятся в одном из трех возможных типов: Охота, Брожение и Бегство. "Нормальным" типом призрака является Охота и это тот тип поведения, в котором они пребывают практически все время. В режиме Охота все призраки используют позицию Пак-Мана как фактор в выборе целевой клетки, хотя для каждого призрака позиция игрока имеет разную важность. В режиме Брожение каждый призрак имеет фиксированную целевую клетку, которая находится за пределами выбранного угла лабиринта. Это заставляет призраков перемещаться из угла в угол, когда они не в режиме Охоты. Наиболее уникальным типом поведения является режим Бегство, в котором призраки не имеют целевой клетки. Вместо этого они случайно (или псевдослучайный, если вам будет угодно) на каждом перекрестке выбирают куда повернуть. Кроме того, призраки в этом режиме темно-синего цвета, двигаются более медленно и могут быть съедены Пак-Маном. К сожалению, длительность режима Бегство на каждом уровне сокращается, пока совсем не пропадет на 19 уровнем.

“Чтобы придать игре некоторое напряжение, я хотел чтобы монстры окружили Пак-Мана в определенный момент игры. Но я чувствовал, что это будет несколько стрессовым моментом игры для человека вроде Пак-Мана, за которым постоянно охотятся и который постоянно окружен. Поэтому я сделал так, чтобы атаки монстров были в виде волн. Они атакуют, а затем отступают. Пройдет время, призраки перегруппируются, пойдут в атаку и рассеяться по карте вновь. Это смотрелось более натурально чем постоянные атаки”
- Тору Иватани, создатель Pac-Man

Смена режимов Охоты и Брожение происходит по фиксированному таймеру, что вызывает волновой эффект, описанный Иватани. Этот таймер сбрасывается при старте нового уровня и смерти Пак-Мана. Таймер также приостанавливается когда призраки находятся в режиме Бегства. Когда режим Бегства заканчивается, призраки возвращаются в свое предыдущее состояние и таймер продолжает отсчет. Призраки начинают в режиме Брожение, после чего определенны четыре волны Брожение/Охоты. После этого призраки переходят в режим Охоты на неопределенное время (пока таймер будет сбрасываться). Продолжительность этих волн (фаз) для первого уровня:

  1. Брожение - 7 секунд, после Охота - 20 секунд
  2. Брожение - 7 секунд, после Охота - 20 секунд
  3. Брожение - 5 секунд, после Охота - 20 секунд
  4. Брожение - 5 секунд, после переключение в режим охоты навсегда

Продолжительность этих фаз меняется частично на уровне 2 и на уровне 5. На 2-м уровне, третий режим охоты увеличивается до 1033 секунд (17 минут и 13 секунд) и последующий режим Брожение продолжается только 1/60 секунды перед тем, как призраки переключатся в постоянный режим Охоты. На уровне 5 дополнительно уменьшается время первых двух режимов Брожение до 5 секунд и увеличивает третий режим Охоты на 4 секунды (всего 1037 секунд или 17:17). Что касается 1/60-секундного режима Брожение, может показаться, что переключение режимов игры на такое маленькое время не имеет смысл, но на самом деле есть причина, которая будет описана вскоре

Базовые правила движения призраков

Следующим шагом является понимание того, как именно призраки пытаются достичь целевых клеток. ИИ призраков очень просто и "близорук", что делает сложное поведение призраков еще более впечатляющим. Призраки планируют только один будущий шаг. Всякий раз, когда призрак стает на новую клетку, он смотрит на клетки впереди и принимает решение, куда пойдет дальше. Это решение имеет очень важное ограничение: призрак никогда не может изменить направление движения. Т.е, призрак, войдя на клетку с левой стороны, не может пойти обратно влево. Смысл этого ограничения в том, что если призрак движется по тоннелю, где все клетки имеют два выхода (влево и вправо/вверх и вниз), то он всегда будет продолжать двигаться в одном направлении.

Однако, существует исключение из этого правила, которое проявляется при переходе из режима Охоты или Брожение в любой другом режиме: призраки вынуждены менять направление сразу после перехода на следующую клетку. Эта принудительная инструкция будет перезаписывать любое решение, которое призрак сделал ранее о направлении движения. Это неплохо действует как уведомление игрока, что игрок поменял тип поведения, так как это единственная возможность призрака поменять направление. Заметьте, что когда призрак покидает режим Бегства, он не меняет своего направления, но это неважно, поскольку он меняет свой цвет с темно-синего на обычный. Поэтому 1/60-секундный режим Брожение на каждом уровне (кроме первого) заставляет каждого призрака менять направление своего движения, даже если их целевая клетка остается той же самой. Эта принудительная смена направления применяется даже к призракам в "доме", поэтому призрак, который только вошел в лабиринт, может изменить обычное направление движения (как вы помните, призрак вышедший из дома, движется налево) и пойти направо.

На рисунке выше изображено упрощенное представление лабиринта. Решения о изменении направления движения принимаются только на "перекрестках", которые показаны зеленым цветом.

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

Так как рассматривается только расстояние по прямой до целевой клетки, то может произойти так, что первоначальный выбор клетки по прямой ближе, но общий путь длиннее. Пример показан на рисунке справа, где расстояние по прямой меньше у клетки слева и это для призрака является лучшим выбором. Однако это приведет к общей длине пути в 26 клеток, тогда как при выборе направления вправо, длина могла бы быть 8 клеток.

Последним частным случаем являются "перекрестки", помеченные желтым на упрощенном рисунке лабиринта. Конкретно эти пересечения имеют дополнительное ограничение - призрак не может выбрать направление вверх. Если они войдут с правой/левой стороны, то они всегда пойдут в том же направлении, в каком и ишли, за исключением смены режимов. Так же, это ограничение не работает в режиме Бегства и испуганные призраки могут пойти вверх, поскольку решения в этом режиме принимаются случайно. Если за Пак-Маном гонится призрак, то игрок может получить некоторое преимущество, поворачивая вверх, так как призраки будут вынуждены пройти больший путь.

Индивидуальные личности призраков

“Это сердце игры. Я хотел, чтобы каждый призрачный враг имел индивидуальный характер и свои собственные движение, поэтому они не были все в погоне за Пак-Маном в одном ряде, что было бы утомительным и глупым”
- Тору Иватани, создатель Pac-Man
Как уже упоминалось ранее, различие между призраками заключается только в методах выбора целевых клеток в режимах Бегства и Брожение. Сначала рассмотрим более простой вариант поведения - в режиме Брожение, а затем перейдем к режиму Охоты.

Режим Брожение

В этом режиме каждый призрак имеет зафиксированную целевую клетку, расположенную за пределами углов лабиринта. Когда начинается этот режим, каждый призрак бредет к целевому углу и пытается достичь заданной точки. Но поскольку целевые клетки недоступны, а призраки не могут развернуться и пойти в обратном направлении, то фактически они входят в петлю, где крутились бы бесконечно, если бы оставались в этом режиме всегда. Но на практике, режим Брожение длится очень мало и призраки не успевают даже дойти до угла. На схеме справа изображены целевые клетки и петли, по которым должны ходить призраки.

Красный призрак

Красный призрак начинает вне "дома" и обычно он рассматривается как первая угроза, тем более с учетом того факта, что он начинает преследовать Пак-Мана практически сразу. Его зовут «Блинки» и в игре его личность описана как «тень» (shadow). На японском, его личность названа ???? (oikake), что переводиться как "преследователь" или "охотник". Описание Блинки на обоих языках очень точное, так как целью этого призрака является текущая клетка с Пак-Маном. Это означает, что красный призрак преследует Пак-Мана всегда, пока не выберет неэффективный путь (например, если игрок свернет вверх на желтом "перекрестке"). Хотя Блинки имеет простой метод выбора цели, но этот призрак имеет одну особенность, которой нету у других призраков: в двух заданных точках на каждом уровне (в зависимости от оставшегося количества точек), его скорость увеличивается на 5% и его поведение в режиме Брожение меняется. Время изменения скорости разное на каждом уровне, а изменение скорости происходит все раньше и раньше на каждом последующем уровне.

В результате изменения поведения Блинки в режиме Брожения, призрак все равно гонится за Пак-Маном, поэтому Блинки находится в режиме Охоты практически постоянно, хотя он и будет вынужден сменить направление при смене режима поведения. В этом состоянии Блинки называют как “Cruise Elroy”, хотя никто и даже Джейми Питман не знает происхождение этого термина. Если Пак-Ман умирает, когда Блинки находится в данном режиме, то Блинки возвращается к нормальному поведению до тех пор, пока другие призраки не вышли из "дома".

Розовый призрак

Начинает в "доме", но выходит из него практически сразу, даже на первом уровне. Имя - "Пинки". Описание личности - быстрый (speedy). На японском - ???? (machibuse, сидящий в засаде). Японский вариант описания более соответствует реальности, так как призрак выбирает целевую клетку там, куда Пак-Ман сейчас направляется (а именно: вперед на четыре клетки по направлению игрока). Так как целевая клетка находится вперед от пэкмана на четыре точки, то тут есть важное последствие: если Пак-Ман и Пинки шли навстречу, то целевая клетка могла оказаться сзади от призрака и он был вынужден сделать поворот и пройти более длинный путь (см. картинку слева)

К сожалению, из-за ошибки переполнения в коде, если Пак-Ман направлялся вверх, то целевая клетка устанавливалась на четыре клетки вверх и на четыре влево. Если вам интересны технические детали то есть замечательное объяснение от Дона Ходжеса. Ниже показана картинка с такой багой:

Голубой призрак


Имя - Инки. Описание личности - застенчивый, робкий. На японском - ???? (kimagure, капризный, причудливый). Это единственный призрак, который использует положение не только Пак-Мана, а еще и Блинки. Метод выбора цели можно описать так: выбрать вторую клетку перед Пак-Маном (тут тоже может произойти переполнение при движении вверх - тогда выбирается вторая клетка слева), взять вектор от Блинки до выбранной клетки и удвоить его.
Как результат, цель Инки может сильно отличаться от положения Пак-Мана и будет находиться только если Блинки в непосредственной близости от Пак-Мана (прим. переводчика: Наиболее близко целевая клетка и клетка с Пак-Маном будут только тогда, когда ПакМан и Блинки идут друг на друга. Ну и с учетом ошибки переполнения: если ПакМан идет вверх, а Блинки где-то возле второй клетки слева от Пак-Мана).

Желтый призрак

Имя: Клайд. Описание личности: тюремщик. На японском: ??? (otoboke, притворяться, что игнорируешь). Как обычно, японский вариант описания куда более точен, поскольку метод выбора цели Клайда можно описать как "делающий своей дело" (прим. переводчика: в корне не согласен). Уникальная особенность Клайда - это два разных режима преследования, зависящих от расстояния до ПакМана. Если расстояние больше 8 клеток, то он использует в качестве цели клетку с ПакМаном (как Блинки), а если меньше 8 клеток, то в качестве целевой клетки Клайд выбирает ту же клетку, что при режиме Брожение.

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

Заключение

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

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

Источники:
  • The Pac-Man Dossier, Jamey Pittman - практически единственный источник, который пригодится вам для собственных исследований. Честно говоря, большая часть это статьи является перефразированием The Pac-Man Dossier. Настоятельно рекомендую к прочтению, если вам понравилась эта статья.
  • Pac-Man’s Ghost Behaviour Analyzed and Fixed, Don Hodges - объяснение бага в поведении Пинки и Инки.
  • Все цитаты Тору Иватани были украдены с интервью в книге "Programmers at Work", написанной Susan M. Lammers. Полное интервью доступно здесь: Pac-Man Museum

1 комментарий:

Анонимный 17 апреля 2011 г. в 05:51 #

Я конечно, мало, что смыслю в посте, но постараюсь осилить.

Понравился сайт! Все красиво сделано.