Необходимо создать консольное приложение, которое реализует простой текстовый квест. Пользователь будет взаимодействовать с игрой через текстовые команды в терминале.
1. Начало игры:
Пользователь запускает скрипт, после чего игра выводит вступительный текст с описанием начальной ситуации и списком действий.
2. Выбор действий:
На каждом этапе пользователю предлагается выбор из нескольких действий. Например, могут быть такие действия:
- Направо
- Налево
- Осмотреться (получить список всех предметов, с которыми можно взаимодействовать)
3. Реализация логики игры:
В зависимости от выбора пользователя, игра должна выводить различные текстовые описания и предоставлять новые выборы. Можно учесть несколько ветвлений сценария, чтобы пользователю было интересно исследовать разные пути.
4. Конец игры:
Игра может завершиться несколькими способами (например, победа, поражение или нейтральный конец). Важно, чтобы игра отслеживала статус пользователя и корректно завершала сессию.
Пример готового текстового квеста:
Квест «Вампиры! (часть 1)». Этот пример в веб формате, можно поиграть, чтобы получить представление о текстовых квестах.
-
Код должен быть написан на TypeScript. Использовать фреймворки и внешние библиотеки не требуется. Разрешено использование только стандартных возможностей среды выполнения Node.js (например, для чтения/записи файлов, взаимодействия с консолью и выполнения скрипта). Основной упор сделайте на использование TypeScript для строгой типизации каждого этапа игры, чтобы структура оставалась понятной и легко поддерживалась.
-
Нужно использовать паттерн Model-View-Controller (MVC) и объектно-ориентированное пограммирование (ООП).
-
Каждое действие в игре должно быть представлено в виде объекта с описанием и результатом. Например, переходы между шагами игры должны быть легко управляемы через объекты.
-
Состояние игры не должно содержать информацию о конкретных сценариях. Вместо этого, используйте отдельные объекты для каждого сценария. Это обеспечит лёгкость в добавлении новых сценариев без значительных изменений кода.
-
Новые сценарии должны добавляться без необходимости вносить изменения в основную логику игры. Структура кода должна позволять просто подключать новые элементы или ветки.
-
Задание не требует сохранения прогресса или взаимодействия с базами данных. Однако ваш код должен быть спроектирован так, чтобы в будущем можно было легко добавить эти функции.
-
Нужно протестировать логику игры.
-
Файл README.md должен содержать краткое описание проекта и инструкцию по запуску и тестированию проекта.
К заданию прилагается сценарий игры "Таинственный лес". Можно полностью опираться на него или можно использовать его как пример для создания своего (небольшого) сценарий.
Нужно написать юнит тесты, чтобы убедиться в правильности логики работы игры. Основной функционал, который нужно протестировать:
-
Игра должна корректно изменять своё состояние в зависимости от действий игрока.
Пример: Проверьте, что при выборе действия "Направо" состояние игры меняется с "Начало" на "Поворот направо".
-
Действия игрока должны выполняться корректно, возвращать правильное описание и вести к правильному следующему шагу.
Пример: Создайте действие "Переход через мост" и проверьте, что его выполнение возвращает правильное сообщение и ведет к шагу "Конец".
-
Игра должна правильно отображать информацию для игрока, включая доступные действия и результаты их выполнения.
Пример: Проверьте, что при выполнении действия "Перейти через мост" представление выводит сообщение "Мост обрушился под вами".
-
В случае ошибочного ввода от игрока игра должна отображать сообщение об ошибке и список доступных действий.
Пример: Проверьте, что при некорректном выборе действия выводится сообщение об ошибке и разрешенные действия.
Для написания проекта могут понадобится следующие теоретические знания:
1. Паттерн MVC (Model-View-Controller):
Это основной паттерн, который применяется в проекте. Он разделяет приложение на три части: модель (состояние игры), представление (то, как информация показывается пользователю) и контроллер (логика обработки действий пользователя). Это упрощает сопровождение и расширение приложения.
2. Паттерн State (Состояние):
Игра управляется состоянием, которое хранит текущий шаг и сценарий. В зависимости от выбора действия игроком состояние игры изменяется, и это влияет на последующие действия.
3. Паттерн Command (Команда):
Каждое действие игрока в виде объектов можно рассматривать как реализацию паттерна Command. Эти действия представляют команды, которые игрок выполняет, и они инкапсулируют логику выполнения (например, переход на следующий шаг).