Цель задания — продемонстрировать навыки проектирования ПО. Не беспокойтесь о производительности, использовании потоков или подключении библиотек. Мы не ожидаем детерминированного результата работы, это усложнило бы задачу. Время выполнения не ограничено, но ожидается, что оно займет не более 6–8 часов.
- Простой, аккуратный код, по которому легко понять, как он работает.
- Четкие зоны ответственности каждой сущности в проекте.
- Архитектуру, позволяющую легко добавлять новые сущности и механики взаимодействия.
- Представьте, что после вас придут 10 джуниор-разработчиков, которые будут одновременно добавлять новые фичи.
Создайте пошаговую симуляцию битвы юнитов на карте для экспериментов с механиками.
Можно создать карту размером W×H клеток и разместить на ней N юнитов.
- Юниты могут быть разного типа с разными действиями и характеристиками.
- Каждый юнит может выполнить одно действие за ход.
- Юниты действуют в порядке их создания.
- Одну клетку может занимать только один юнит.
- У всех юнитов есть уникальный идентификатор Id (целое число)
- У большинства юнитов есть характеристика HP (Health Points).
- Если HP ≤ 0, юнит исчезает на следующий ход и больше не действует.
- Некоторые юниты могут перемещаться:
- За ход могут переместиться в любую из восьми соседних клеток.
- Если не могут достичь цели за один ход, продолжают двигаться к ней в следующих ходах.
Симуляция заканчивается, когда нет юнитов, способных действовать в следующем ходу, или на карте остается только один юнит.
Перед началом разработки подготовьте архитектурное описание проекта
-
DESIGN.md или любой другой формат
- Одним документом опишите:
- модули/подсистемы и их ответственность;
- применяемые паттерны проектирования;
- как будет расширяться функциональность;
- порядок обработки команд/событий за ход;
- аргументацию выбранных решений.
- Одним документом опишите:
-
Диаграмма (UML, Mermaid, PlantUML — любая)
- На диаграмме отразите:
- модули/подсистемы и их ответственность;
- классы и их ответственность;
- связи между классами;
- паттерны проектирования
- Вынесите в отдельные файлы
/docs/architecture_diagram_*.*.
- На диаграмме отразите:
-
Требования к архитектурному описанию
- Разработчик уровня как минимум junior может взять это описание и реализовать по нему задачу
-
Порядок сдачи
- Сначала отправьте архитектурное описание на ревью.
- После апрува приступайте к полной реализации симуляции.
- Характеристики: HP, Strength
- Ближний бой: Бьет одного случайного юнита в соседней клетке, нанося ему Strength единиц урона.
- Если некого бить, перемещается.
- Характеристики: HP, Agility, Strength, Range
- Дальний бой: Стреляет в случайного юнита на расстоянии от 2 до Range клеток, нанося ему Agility единиц урона. Может стрелять только если в соседних клетках нет других юнитов.
- Ближний бой: Если стрелять не может, бьет одного случайного юнита в соседней клетке, нанося ему Strength единиц урона.
- Если некого бить, перемещается.
При запуске приложение получает путь к файлу со сценарием симуляции, где описаны команды для создания карты и юнитов, а также перемещения юнитов по карте. Приложение должно выводить все происходящие события в stdout.
Так как на карте нет препятствий, сложные алгоритмы поиска пути не требуются.
CREATE_MAP W H— Создает карту размеромW×H. Эта команда начинает любой сценарий.SPAWN_SWORDSMAN I X Y H S— Создает мечника с идентификаторомIв точкеX,Yс характеристиками здоровьяHи силыS.SPAWN_HUNTER I X Y H A S R— Создает охотника с идентификаторомIв точкеX,Yс характеристиками здоровьяH, ловкостиA, силыSи дальностиR.MARCH I X Y— Приказывает юнитуIпереместиться в точкуX,Y.
MAP_CREATED— Создание карты.MARCH_STARTED,MARCH_ENDED— Начало и конец перемещения юнита.UNIT_SPAWNED,UNIT_DIED— Создание и смерть юнита.UNIT_MOVED— Перемещение юнита на клетку.UNIT_ATTACKED— Атака одного юнита на другого.
Код парсера команд и вывода событий в лог уже содержится в проекте. Если необходимо, его можно менять. Формат ввода и вывода менять нельзя.
Пример сценария находится в файле commands_example.txt. Пример лога событий находится в файле main.cpp.
При разработке учитывайте планы по добавлению новых юнитов, действий и характеристик.
Эта функциональность не является частью задания, а лишь подсказывает направление при проектировании.
- Характеристики: HP, Power
- Дальний бой: Стреляет в случайного юнита на расстоянии от 2 до 5 клеток, нанося ему Power единиц урона.
- Не может перемещаться.
- Характеристики: HP, Spirit
- Лечение: Восстанавливает Spirit единиц здоровья одному случайному юниту в радиусе 2 клеток.
- Если некого лечить, перемещается.
- Характеристики: HP, Agility
- Летающий юнит:
- Не занимает клетку на карте.
- Может перемещаться на 2 клетки за ход.
- Не может быть атакован ближнем боем.
- Может быть атакован в дальнем бою, минимальная и максимальная дистанция атаки "стрелка" на ворона снижена на 1.
- Ближний бой: Бьет одного случайного юнита в соседних клетках, нанося ему Agility единиц урона.
- Если некого бить, перемещается.
- Характеристики: Power
- Если в радиусе 2х клеток есть юнит - взрывается в следующем ходу, нанося всем юнитам в радиусе 3х клеток Power единиц урона.
- После взрыва исчезает.
- Не может перемещаться.
- Не может быть атакована.
- Не занимает клетку на карте.
- ОС: Ubuntu
- Компилятор: clang 15+
- Стандарт: C++17 или новее
- Система сборки: cmake (в проекте должен быть CMakeLists.txt)
- Задание необходимо опубликовать в любом публичном гит-репозитории (GitHub, Bitbucket и т.д.).
В процессе выполнения задания вы можете присылать любые вопросы.