sw-battle-test-c

Interesting test task in C instead of C++
git clone git://bsandro.tech/sw-battle-test-c
Log | Files | Refs | README

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     - Не может перемещаться.