Цель задания — продемонстрировать навыки проектирования ПО.
- Не беспокойтесь о производительности, использовании потоков или подключении библиотек.
- Мы не ожидаем детерминированного результата работы — это лишь усложнило бы задачу.
- Время выполнения не ограничено, но предполагается, что работа займёт не более 6–8 часов.
- Понятный и аккуратный код с прозрачной логикой работы.
- Чёткое разграничение зон ответственности между сущностями проекта.
- Расширяемую архитектуру, которая позволяет легко добавлять новые сущности и механики взаимодействия
- Представьте, что после вас придут 10 младших разработчиков, которые будут одновременно добавлять новые функции.
- Ознакомьтесь с README.MD в директориях Core и Feature — они помогут лучше понять цели задачи.
- Заметки в документе KNOWN_ISSUES.md - где вы оставите известные вам недостатки и сомнения по вашему решению, к примеру из-за нехватки времени.
Создайте пошаговую симуляцию боевых столкновений юнитов на карте для тестирования игровых механик.
На карте размером W×H клеток можно размещать юнитов.
- Юниты различаются по типам, действиям и характеристикам.
- Каждому юниту присвоен уникальный идентификатор Id (целое число)
- За один ход каждый юнит может выполнить одно действие.
- Юниты совершают действия в порядке их создания.
- Юнит всегда размещен по каким то координатам на карте.
- Юнит может занимать клетку, не позволяя другим на нее встать.
- Большинство юнитов имеет характеристику HP (Health Points).
- При HP ≤ 0 юнит выполняет свои действия в текущем ходу и исчезает перед началом следующего.
- Часть юнитов обладает способностью перемещения:
- Они могут переместиться в любую из восьми прилегающих клеток за ход.
- Если цель недостижима за один ход, они продолжают движение к ней в последующих ходах.
- Статичные юниты должны оставаться неподвижными при любых условиях.
Симуляция заканчивается, когда нет юнитов, способных действовать в следующем ходу, или на карте остается только один юнит.
- Характеристики: 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.
- Не подключать внешние 3rd-party зависимости, только стандартная библиотека
- Вы можете поменять проект как угодно для достижения цели, даже не используя предоставленную структуру и код
- это не является ни плюсом ни минусом, мы предоставили структуру и код, желая упростить задачу, сэкономить вам время.
- ОС: Ubuntu
- Компилятор: clang 15+
- Стандарт: C++17 или новее
- Система сборки: cmake (в проекте должен быть CMakeLists.txt)
- Задание необходимо опубликовать в любом публичном гит-репозитории (GitHub, Bitbucket и т.д.).
В процессе выполнения задания вы можете присылать любые вопросы.
При проектировании учитывайте планы по добавлению новых юнитов, действий и характеристик.
Возможность создания таких Юнитов с таким поведением не трогая код в Core является важным критерием.
Эту функциональность не нужно реализовывать в коде, это подсказка для расширяемости.
- Характеристики: HP, Power
- Действия
- Прицельный выстрел: Стреляет в случайного юнита на расстоянии от 2 до 5 клеток, нанося ему Power единиц урона.
- Не может перемещаться.
- Характеристики: HP, Spirit
- Действия
- Малое исцеление: Восстанавливает Spirit единиц здоровья одному случайному юниту в радиусе 2 клеток.
- Если некого лечить, перемещается.
- Характеристики: HP, Agility
- Летающий юнит:
- Не занимает клетку на карте.
- Может перемещаться на 2 клетки за ход.
- Не может быть атакован ближнем боем.
- Может быть атакован в дальнем бою, минимальная и максимальная дистанция атаки "стрелка" на ворона снижена на 1.
- Действия
- Удар когтем: Бьет одного случайного юнита в соседних клетках, нанося ему Agility единиц урона.
- Если некого бить, перемещается.
- Характеристики: Power
- Не может быть атакована.
- Не занимает клетку на карте.
- Действия
- Если в радиусе 2х клеток есть юнит - взрывается в следующем ходу, нанося всем юнитам в радиусе 3х клеток Power единиц урона.
- После взрыва исчезает.
- Не может перемещаться.