README.md (10581B)
1 # **Цель** 2 3 Цель задания — **продемонстрировать навыки проектирования ПО.** 4 5 - Не беспокойтесь о производительности, использовании потоков или подключении библиотек. 6 - Мы не ожидаем детерминированного результата работы — это лишь усложнило бы задачу. 7 - Время выполнения не ограничено, но предполагается, что работа займёт не более 6–8 часов. 8 9 ## **Что мы хотим увидеть:** 10 11 1. Понятный и аккуратный код с прозрачной логикой работы. 12 2. Чёткое разграничение зон ответственности между сущностями проекта. 13 3. Расширяемую архитектуру, которая позволяет легко добавлять новые сущности и механики взаимодействия 14 - Представьте, что после вас придут 10 младших разработчиков, которые будут одновременно добавлять новые функции. 15 - Ознакомьтесь с README.MD в директориях Core и Feature — они помогут лучше понять цели задачи. 16 4. Заметки в документе KNOWN_ISSUES.md - где вы оставите известные вам недостатки и сомнения по вашему решению, к 17 примеру из-за нехватки времени. 18 19 # **Задача** 20 21 Создайте пошаговую симуляцию боевых столкновений юнитов на карте для тестирования игровых механик. 22 23 На карте размером W×H клеток можно размещать юнитов. 24 25 - Юниты различаются по типам, **действиям** и **характеристикам**. 26 - Каждому юниту присвоен уникальный идентификатор **Id** (целое число) 27 - За один ход каждый юнит может выполнить одно действие. 28 - Юниты совершают действия в порядке их создания. 29 - Юнит всегда размещен по каким то координатам на карте. 30 - Юнит может занимать клетку, не позволяя другим на нее встать. 31 - Большинство юнитов имеет характеристику **HP** (Health Points). 32 - При **HP** ≤ 0 юнит выполняет свои действия в текущем ходу и исчезает перед началом следующего. 33 - Часть юнитов обладает способностью перемещения: 34 - Они могут переместиться в любую из восьми прилегающих клеток за ход. 35 - Если цель недостижима за один ход, они продолжают движение к ней в последующих ходах. 36 - Статичные юниты должны оставаться неподвижными при любых условиях. 37 38 Симуляция заканчивается, когда нет юнитов, способных действовать в следующем ходу, или на карте остается только один 39 юнит. 40 41 ## Юниты, которых нужно реализовать: 42 43 ### Мечник 44 45 - **Характеристики:** HP, Strength 46 - Действия 47 - **Сокрушающий удар:** Бьет одного случайного юнита в соседней клетке, нанося ему **Strength** единиц урона. 48 - Если некого бить, перемещается. 49 50 ### Охотник 51 52 - **Характеристики:** HP, Agility, Strength, Range 53 - Действия 54 - **Стремительный выстрел:** Стреляет в случайного юнита на расстоянии от 2 до **Range** клеток, нанося ему 55 **Agility** единиц урона. Может стрелять только если в соседних клетках нет других юнитов. 56 - **Удар из тени:** Если стрелять не может, бьет одного случайного юнита в соседней клетке, нанося ему **Strength** 57 единиц урона. 58 - Если некого бить, перемещается. 59 60 # Приложение 61 62 При запуске приложение получает путь к файлу со сценарием симуляции, где описаны **команды** для создания карты и 63 юнитов, а также перемещения юнитов по карте. Приложение должно выводить все происходящие события в **stdout**. 64 65 Так как на карте нет препятствий, сложные алгоритмы поиска пути не требуются. 66 67 ## Команды 68 69 - `CREATE_MAP W H` — Создает карту размером `W`×`H`. Эта команда начинает любой сценарий. 70 - `SPAWN_SWORDSMAN I X Y H S` — Создает мечника с идентификатором `I` в точке `X`,`Y` с характеристиками здоровья `H` и 71 силы `S`. 72 - `SPAWN_HUNTER I X Y H A S R` — Создает охотника с идентификатором `I` в точке `X`,`Y` с характеристиками здоровья `H`, 73 ловкости `A`, силы `S` и дальности `R`. 74 - `MARCH I X Y` — Приказывает юниту `I` переместиться в точку `X`,`Y`. 75 76 ## События 77 78 - `MAP_CREATED` — Создание карты. 79 - `MARCH_STARTED`, `MARCH_ENDED` — Начало и конец перемещения юнита. 80 - `UNIT_SPAWNED`, `UNIT_DIED` — Создание и смерть юнита. 81 - `UNIT_MOVED` — Перемещение юнита на клетку. 82 - `UNIT_ATTACKED` — Атака одного юнита на другого. 83 84 Код парсера команд и вывода событий в лог уже содержится в проекте. Если необходимо, его можно менять. Формат ввода и 85 вывода менять нельзя. 86 87 Пример сценария находится в файле _commands_example.txt_. Пример лога событий находится в файле _main.cpp_. 88 89 # Ограничения 90 91 - Не подключать внешние 3rd-party зависимости, только стандартная библиотека 92 - Вы можете поменять проект как угодно для достижения цели, даже не используя предоставленную структуру и код 93 - это не является ни плюсом ни минусом, мы предоставили структуру и код, желая упростить задачу, сэкономить вам 94 время. 95 96 # Технические требования 97 98 - **ОС:** Ubuntu 99 - **Компилятор:** clang 15+ 100 - **Стандарт:** C++17 или новее 101 - **Система сборки:** cmake (в проекте должен быть CMakeLists.txt) 102 - Задание необходимо опубликовать в любом публичном гит-репозитории (GitHub, Bitbucket и т.д.). 103 104 _В процессе выполнения задания вы можете присылать любые вопросы._ 105 106 # Планы на расширения 107 108 При проектировании учитывайте планы по добавлению новых юнитов, действий и характеристик. 109 110 Возможность создания таких Юнитов с таким поведением не трогая код в Core является важным критерием. 111 112 Эту функциональность не нужно реализовывать в коде, это подсказка для расширяемости. 113 114 ## Башня 115 116 - **Характеристики:** HP, Power 117 - Действия 118 - **Прицельный выстрел:** Стреляет в случайного юнита на расстоянии от 2 до 5 клеток, нанося ему **Power** единиц 119 урона. 120 - Не может перемещаться. 121 122 ## Лекарь 123 124 - **Характеристики:** HP, Spirit 125 - Действия 126 - **Малое исцеление:** Восстанавливает **Spirit** единиц здоровья одному случайному юниту в радиусе 2 клеток. 127 - Если некого лечить, перемещается. 128 129 ## Ворон 130 131 - **Характеристики:** HP, Agility 132 - **Летающий юнит:** 133 - Не занимает клетку на карте. 134 - Может перемещаться на 2 клетки за ход. 135 - Не может быть атакован ближнем боем. 136 - Может быть атакован в дальнем бою, минимальная и максимальная дистанция атаки "стрелка" на ворона снижена на 1. 137 - Действия 138 - **Удар когтем:** Бьет одного случайного юнита в соседних клетках, нанося ему **Agility** единиц урона. 139 - Если некого бить, перемещается. 140 141 ## Мина 142 143 - **Характеристики:** Power 144 - Не может быть атакована. 145 - Не занимает клетку на карте. 146 - Действия 147 - Если в радиусе 2х клеток есть юнит - взрывается в следующем ходу, нанося всем юнитам в радиусе 3х клеток **Power** 148 единиц урона. 149 - После взрыва исчезает. 150 - Не может перемещаться.