АиП · Техническое задание · 5 мин чтения

ASCII-лабиринт «Минотавр»

Что должна уметь игра «Минотавр»: как в неё играть, что видит игрок, как устроена игра вдвоём по сети и что считается готовым результатом.

Уровней
7
Игроков
1 или 2 по сети
Интерфейс
Консоль, ASCII
Язык
Python 3.10+

Что это за игра

«Минотавр» — пошаговая игра в консоли с ASCII-графикой. Игрок проходит семь лабиринтов подряд: в каждом нужно найти ключ, дойти до выхода и не попасться монстрам. Играть можно одному или вдвоём по сети.

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

Как играть

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

Пример уровня.

Что есть на карте

СимволОбъектЧто делает
PИгрокХодит на одну клетку за ход или пропускает ход
PНапарникЕсть только в сетевой игре; та же буква, другой цвет
+ - |СтенаНепроходима
.ПроходПо нему можно ходить
KКлючНужен, чтобы открыть выход
EВыходОткрывается, только когда ключ найден
HОхотникХодит каждый ход и идёт к игроку самым коротким путём. Пока ключ не найден, старается перехватить игрока по дороге к ключу
WБродягаХодит каждый ход и бродит по лабиринту. Заметив игрока рядом, гонится за ним, а потеряв из виду, идёт туда, где видел его последний раз
MМинотаврФинальный босс 7-го уровня: прыгает через стены и после прыжка отдыхает
!Метка прыжкаКуда Минотавр приземлится на следующем ходу
*ЗаморозкаМонстры стоят 3 хода
^ФакелИгрок видит дальше до конца уровня
?КомпасПоказывает следующие 8 клеток пути к ключу, а после ключа — к выходу

Управление

КлавишаДействие
W A S DШаг вверх, влево, вниз, вправо
ПробелПропустить ход
HСправка
PПауза: продолжить, сохранить, выйти в меню

Правила

  1. Шаг в стену не тратит ход: игрок остаётся на месте и видит подсказку.
  2. Выход открывается только после того, как найден ключ.
  3. Уровень пройден, когда игрок с ключом дошёл до выхода. Пройден седьмой уровень — игра выиграна.
  4. Игрок проигрывает, если оказался в одной клетке с монстром или они поменялись клетками за один ход.
  5. Бонусы подбираются, когда игрок встаёт на их клетку.
  6. В игре вдвоём пойманный игрок выбывает до конца уровня и возвращается на следующем. Уровень пройден, когда до выхода дошли все оставшиеся игроки; игра проиграна, только когда пойманы оба.

Что видит игрок

Свет
Клетки рядом с игроком: видны и карта, и монстры, и предметы.
Полутень
Клетки чуть дальше: видна только карта, монстров не видно.
Тень
Всё остальное: не видно ничего.

Карта, которую игрок уже видел, остаётся на экране серым. Факел расширяет освещённую область до конца уровня.

Уровни

Семь уровней, каждый следующий больше и опаснее. На каждом есть ключ и выход; число монстров и бонусов такое:

УровеньРазмерОхотниковБродягМинотаврБонусов
17 × 901—1
29 × 1110—1
311 × 1311—2
413 × 1512—2
515 × 1721—3
619 × 2122—3
721 × 232214

Уровень можно не генерировать, а загрузить из файла. Игра проверяет файл и сообщает, если уровень составлен неверно: например, выход замурован или два предмета стоят в одной клетке.

Финальный босс

На седьмом уровне вместо одного охотника игрока ждёт Минотавр. Он не ходит по коридорам, а прыгает через стены, повторяя три фазы:

  1. 01ПрицелМинотавр выбирает ближайшего игрока и отмечает ! область 3 × 3 вокруг него. Метку видно даже в тени, а игрок получает предупреждение. У него есть один ход, чтобы уйти из области.
  2. 02ПрыжокМинотавр перелетает через стены в центр области, но не дальше 6 клеток. Кто остался в области, пойман.
  3. 03Отдых3 хода Минотавр стоит на месте. Это окно, чтобы проскочить мимо него к ключу или выходу. Заморозка продлевает отдых.

Очки и рекорды

Очки считаются по ходам: чем быстрее пройден уровень, тем больше очков. За каждый подобранный бонус начисляется ещё 20.

\text{очки} = 100 + \max(0,\, 300 - \text{ходы}) + 20 \cdot \text{бонусы}
Очки за один пройденный уровень.

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

Экраны и сохранения

  1. Главное меню: новая игра, продолжить, игра по сети, рекорды, справка, выход.
  2. Справка: что означают символы и как управлять.
  3. Пауза: продолжить, сохранить, выйти в меню.
  4. Экраны проигрыша и победы с итоговыми очками.
  5. Партию можно сохранить посреди уровня и потом продолжить с того же места.

Игра по сети

Двое игроков подключаются к общему серверу и проходят лабиринты вместе. Сервер работает постоянно, игрокам не нужно ничего настраивать у себя, кроме адреса сервера.

  1. Лобби: после подключения игрок видит, кто ещё в сети, может написать в общий чат и начать игру с другим игроком.
  2. Ходы по очереди: сначала ходит первый игрок, затем второй, затем монстры.
  3. Чат в игре: во время партии игроки могут переписываться.
  4. Ключ достаточно найти одному. Пойманный игрок выбывает до конца уровня и возвращается на следующем; уровень пройден, когда до выхода дошли все оставшиеся. Партия идёт, пока не пойманы оба. Очки общие.
  5. Если один из игроков отключился, второй видит сообщение об этом, а партия не теряется.

Запуск

Игра запускается из консоли. При запуске можно указать:

  1. папку, где лежат сохранения;
  2. файл таблицы рекордов;
  3. файл уровня, чтобы сыграть его вместо случайного;
  4. зерно генерации (seed), чтобы получить те же лабиринты;
  5. адрес сервера для игры по сети.

Если ничего не указано, используются папки и файлы рядом с игрой.

Требования к результату

  1. Работает в Windows и Linux на Python 3.10 и новее.
  2. Все сторонние библиотеки ставятся одной командой из requirements.txt.
  3. Любая ошибка — неверный файл, обрыв связи, неверный ввод — показывается понятным сообщением, игра не падает.
  4. Код покрыт автоматическими тестами и документацией, к игре есть руководство пользователя.