Перед вами прототип пошаговой боевой системы с юнитами на клеточной карте. Необходимо спроектировать расширяемую архитектуру и продемонстрировать её гибкость, добавив нового юнита с уникальными механиками.
- Карта представляет собой прямоугольную сетку размером W×H клеток.
- Каждый юнит имеет уникальный целочисленный идентификатор.
- Один ход соответствует одному действию одного юнита.
- Юниты действуют в порядке их создания.
- Некоторые юниты могут перемещаться:
- за один ход юнит может перейти в любую из 8 соседних клеток, если она свободна;
- если цель недостижима за один ход, юнит продолжает движение к ней в последующих ходах.
- Некоторые юниты могут атаковать, уменьшая количество HP у цели:
- при достижении 0 HP юнит умирает;
- после смерти юнит больше не действует и освобождает занимаемую клетку.
- Симуляция завершается, когда не остаётся юнитов, способных совершать действия.
При запуске приложение получает путь к файлу со сценарием симуляции. Сценарий содержит команды для создания карты, юнитов и их перемещения.
Прототип содержит реализацию одного игрового юнита — мечника.
- Ближняя атака: атакует случайного юнита в соседней клетке, нанося урон, равный
Strength. - Способность: с вероятностью
Chance / 1000вместо обычной атаки применяет «Рваные раны», наносяRendingурона. - Поведение: если цель для атаки отсутствует, перемещается.
Спроектировать и реализовать расширяемую архитектуру, затем продемонстрировать ее работу на примере нового юнита.
- Дальняя атака: стреляет в случайного юнита на расстоянии от 2 до
Rangeклеток, нанося урон, равныйAgility. Атака возможна только при отсутствии других юнитов в соседних клетках. - Ближняя атака: если дальняя атака невозможна, атакует случайного юнита в соседней клетке, нанося урон, равный
Strength. - Способность: с вероятностью
Chance / 1000вместо обычной дальней атаки применяет отравленные стрелы, нанося в суммеPoisonурона за пять ходов. Урон от яда удваивается в тот ход, когда отравленный юнит получает эффект «Рваные раны». - Урон от яда засчитывается как урон охотника, наложившего эффект.
- Поведение: если цель для атаки отсутствует, перемещается.
Формат входных и выходных данных изменять нельзя. Событие атаки должно содержать суммарный урон, который нанес один юнит другому. Все остальное — на ваше усмотрение. Вы можете не сохранять текущий код из папки Game.
Спроектируйте архитектуру, которая позволит легко добавлять новые сущности и механики взаимодействия. Представьте, что над проектом одновременно работают 20 джуниор-разработчиков — каждый добавляет юнитов с уникальными способностями.
Разделите свой код на две папки: Core и Features.
В Core — движок симуляции, в Features — реализация конкретных механик мечника и охотника.
Не беспокойтесь о производительности или многопоточности.
При разработке учитывайте планы по добавлению новых юнитов, действий и характеристик. Эта функциональность не входит в задание — она лишь указывает направление.
- Дальняя атака: стреляет в случайного юнита на расстоянии от 2 до
Rangeклеток, нанося урон, равныйSpirit. - Способность: с вероятностью
Chance / 1000призывает огненную стену из 3 клеток на 5 ходов. Стена не блокирует движение и наноситFirewallурона за ход каждому юниту, находящемуся на ней. - Поведение: если цель для атаки отсутствует, перемещается.
- Дальняя атака: стреляет в случайного юнита на расстоянии от 2 до
Rangeклеток, нанося урон, равныйPower. - Поведение: не перемещается, неуязвима, занимает 2×2 клетки.
- Летающий юнит:
- Не занимает клетку на карте.
- Может перемещаться на 2 клетки за ход.
- Не может быть атакован в ближнем бою.
- Минимальная и максимальная дистанция дальней атаки на ворона снижена на 1.
- Ближняя атака: атакует случайного юнита в соседней клетке, нанося
Strengthурона. - Поведение: если цель для атаки отсутствует, перемещается.
- Система сборки CMake (проект должен содержать файл CMakeLists.txt).
- Опубликуйте задание в любом публичном Git-репозитории (GitHub, Bitbucket и т. д.).
Примечание: Если какой-то аспект механики не описан в задании, реализуйте его на свое усмотрение.
Если у вас возникнут вопросы при выполнении задания, присылайте их.