Skip to content
This repository has been archived by the owner on Mar 3, 2020. It is now read-only.

Pocoder/arduino-pacman

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

59 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Документация

Введение

Данный проект существует с одной-единственной целью - сдать зачет по проге.
Результатом проекта является законченная игра (Pacman), реализованная на языке С++ и работающая на Arduino с сенсорным дисплеем.

Путь разработки тернист:

  1. Определить правила игры
  2. Обдумать архитектуру
  3. Реализовать логику
  4. Разобраться с дисплеем (возможно, разузнать о каких-то библиотеках)
  5. Что-то докрутить, дооптимизоровать, если придется
  6. Выполнить дополнительные требования к проекту

Приступим.

Что же в нашем распоряжении

Arduino Uno 2 Кб ОЗУ, 1 Кб EEPROM, 32 Кб флеш-память
Дисплей сенсорный 2,4 TFT LCD 240x320

1. Правила

Ссылка на игру

В общем

Игра состоит из 256 уровней, основу геймплея состовляет поедание точек и игры в кошки-мышки с призраками

Формат

Разрешение дисплея позволяет использовать каноническое разрешение: 224×288, весь экран делится на 4 части по диагоналям, что реализует перемещение влево, вправо, вниз, вверх.

GUI

  • Main menu: сверху "PACMAN", в центре бегающие призраки, снизу "PLAY GAME
  • В начале и после смерти "GET READY" в лабиринте под центральной клеткой.
  • После последней смерти "GAME OVER" в лабиринте под центральной клеткой.
  • сверху "PACMAN", в центре "YOUR SCORE :" VALUE, снизу "PLAY AGAIN?"

В игре

  • Score - снизу в левом углу
  • Lives - снизу в центре
  • Иконка текущего фрукта - снизу справа

Геймплей

3 жизни, 0 поинтов

В начале каждого уровня призраки находятся в недоступной Пакману прямоугольной комнате в середине уровня, из которой они со временем освобождаются. Если привидение дотронется до Пакмана, то его жизнь теряется, призраки и Пакман возвращаются на исходную позицию, но при этом прогресс собранных точек сохраняется. Если при столкновении с призраком у Пакмана не осталось дополнительных жизней, то игра заканчивается. После съедения всех точек начинается новый уровень в том же лабиринте. По бокам лабиринта находятся два входа в один туннель, при вхождении в который Пакман и призраки выходят с другой стороны лабиринта. На каждом уровне в месте ниже зоны призраков дважды за раунд появляются бонусы, называемые фруктами. Первый фрукт появляется после съедения Пакманом 70 точек, второй — после съедения 170. За съедение бонуса даётся от 100 до 5000 очков в зависимости от того, какого уровня достиг игрок. Бонус находится на экране примерно 9 секунд, после чего исчезает. Фрукты отображаются под лабиринтом внизу экрана. До 21-го уровня скорость Пакмана при обычном движении выше скорости призраков, но с 21-го призраки в режиме погони двигаются быстрее главного героя. Поедание точек замедляет Пакмана примерно на 10 % от его скорости, что позволяет призракам на всех уровнях догнать героя. После съедения энерджайзера, пока призраки напуганы, скорость Пакмана увеличивается, а движение призраков замедляется. С 5 по 20 уровень Пакман и без того двигается с максимальной скоростью, и при съедении энерджайзера он не становится быстрее. Когда призраки проходят через боковой туннель, то их скорость уменьшается почти наполовину.

Поведение призраков


Алгоритм Призраки имеют три разные запрограммированные модели поведения: преследование (англ. chase), рассеивание (англ. scatter) и испуг (англ. frightened). Для движения призраков в первых двух режимах игра использует разделение игрового экрана на квадраты. В аркадной версии один такой квадрат имеет размер 8×8 пикселей при разрешении экрана 224×288. В режимах рассеивания и преследования у призраков есть определённый квадрат, который они пытаются достичь. При рассеивании привидения стремятся к квадратам, которые находятся за пределами лабиринта ближе к его углам. Например, красный призрак стремится к правому верхнему углу. В режиме испуга призраки не имеют целевой точки и выбирают поворот в лабиринте при помощи генератора псевдослучайных чисел. Расчёт целевой точки при преследовании исключителен для каждого призрака, что придаёт им уникальное поведение:

  • Красный призрак Шэдоу (англ. Shadow) по прозвищу Блинки (англ. Blinky). В режиме преследования использует как цель ту клетку, в которой находится Пакман. Блинки, в отличие от других привидений, увеличивает свою скорость преследования относительно первоначальной дважды за уровень в зависимости от количества съеденных точек. Если точек осталось мало, то он меняет целевую клетку в режиме рассеивания на квадрат, в котором находится Пакман, и так гоняется за героем в двух режимах.

  • Розовый призрак Спиди (англ. Speedy) по прозвищу Пинки (англ. Pinky). В качестве цели при преследовании использует точку, находящуюся на четыре клетки впереди Пакмана. Однако из-за ошибки переполнения при движении Пакмана вверх Пинки использует в качестве цели квадрат, находящийся на четыре клетки вверх и на четыре влево от Пакмана.

  • Голубой призрак Башфул (англ. Bashful) по прозвищу Инки (англ. Inky). Использует самый сложный алгоритм преследования: для определения направления движения строится отрезок, один из концов которого определяется положением Блинки, а середина находится на 2 клетки перед Пакманом. Второй конец отрезка — искомая целевая точка. Получившуюся точку сложно предсказать, поэтому Инки считается самым опасным привидением. Из-за ошибки переполнения, аналогичной в поведении Пинки, во время движения Пакмана вверх целевая клетка Инки это две клетки вверх и две влево от Пакмана.

  • Оранжевый призрак Поки (англ. Pockey) по прозвищу Клайд (англ. Clyde). Если Клайд находится дальше 8 клеток от Пакманa, то он использует в качестве цели самого Пакманa, как Блинки. Если же Пакман ближе 8 клеток, то Клайд стремится к левому нижнему углу, как при рассеивании.

Пока призраки находятся в одном из режимов, сменить направление движения они могут только во время поворота в лабиринте, но в момент смены одного режима на другой привидения способны сменить направление движения на противоположное. Исключение составляет переход от испуга к другим режимам. Из закрытой зоны в начале уровня призраки выбираются, находясь в режиме рассеивания, позже сменяя его на преследование. Затем в течение раунда привидения могут начать рассеиваться ещё три раза. При потере Пакманом жизни счётчик рассеивания сбрасывается. В зависимости от уровня время этого режима может длиться от 1⁄60 до 7 секунд. Время преследования до следующего рассеивания может продолжаться на разных уровнях от 30 до 1037 секунд. Когда все четыре рассеивания истекают, призраки преследуют Пакмана без остановки. Если призраки испуганы, таймер других режимов приостанавливается.

Единственный призрак, который в начале каждого уровня или после потери Пакманом жизни стартует сразу вне зоны призраков, — Блинки. За ним в строгом порядке выходят Пинки, затем Инки и последним Клайд. В течение первых трёх уровней привидения выходят после съедения Пакманом определённого количества точек. Например, на первом уровне Пинки покидает зону после 30 точек, а Инки после 60-ти. После потери Пакманом жизни этот счётчик сбрасывается и запускается новый, но с меньшим количеством точек. С четвёртого уровня и до конца игры все призраки сразу покидают зону после старта уровня. Есть также таймер, который позволяет призракам покинуть свою зону, если Пакман определённое время не ест точки. Например, если на первом уровне Пакман, не съев 30 точек, застынет на месте, Пинки отправится в погоню за ним через четыре секунды после этого. Каждая съеденная точка сбрасывает этот таймер до нуля

2. Архитектура

Всем заправляет класс GameManager, в котором хранится текущеее состояние приложения (enum class State{LOADING, ENTERING_NAME,MENU,SETTINGS,RECORDS,IN_GAME,GAME_OVER};), он управляет состояниями с помощью метода update, который в свою очередь вызывает один из методов

  • void load(); //заставка игры
  • void enterName(); //переходит в ввод имени
  • void openMenu(); //переходит в меню
  • void startGame(); //начинает новую игру
  • void openSettengs(); //открывает настройки
  • void openRecords(); //открывает топ игроков
  • void gameOver(); //заканчиывает игру

Для разделения ввода, вывода и логики служат классы InputManager и OutputManager, в которых хранятся ссылки на объекты, управляющие выводом и вводом, в GameManager хранятся ссылки на данные классы.

3. Логика

Непосредственно за логику игры отвечает класс Game

4. Дисплей

Используются библиотеки : Adafruit_GFX(https://github.com/adafruit/Adafruit-GFX-Library), MCUFRIEND_kbv(https://github.com/prenticedavid/MCUFRIEND_kbv), TouchScreen(https://github.com/adafruit/Adafruit_TouchScreen)

Настройки калибруются с помощью специального примеры из библиотеки MCUFRIEND_kbv, также не обойтись без метода map

5. Оптимизация

6. Дополнительные требования

  1. Заставка при старте
  2. Ввод имени игрока
  3. Меню
  4. Настройки
  5. Таблица рекордов

About

University project

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages