Mortal Kombat

Реализуйте класс Fighter со следующими полями (все поля private):

  • health_points — целое число определяющее максимальный уровень здоровья бойца.
  • health — количество жизни у бойца. Начальное значение определяется как: 100+health_points*100;
  • force_points — целое число определяющее силу удара бойца.
  • defence_points — целое число определяющее уровень защиты бойца.
  • agility_points — целое число определяющее способность бойца увернуться от удара.
  • critical_points — целое число определяющее способность бойца наносить двойной урон.
  • points — свободные очки характеристик.

Также реализуйте в классе Fighter следующие методы:

  • Публичный конструктор без параметров. Значения полей: health = 100; health_points = force_points = critical_points = defence_points = agility_points = 0; points = 10;
  • Публичный конструктор с параметрами. Значения полей: health_points, force_points, critical_points, defence_points, agility_points передать через параметры конструктора. points = 0, health — рассчитать согласно формуле;
  • bool add_health_points(int points); — публичный метод увеличивающий health_points на points очков, при этом число свободных очков уменьшается на это же количество. Если параметр points больше чем число свободных очков, ничего не происходит. При успешном увеличении характеристики возвращается true, иначе false.
  • bool add_force_points(int points); — публичный метод аналогичный предыдущему, только применительно к force_points.
  • bool add_defence_points(int points); — публичный метод аналогичный предыдущему, только применительно к defence_points.
  • bool add_agility_points(int points); — публичный метод аналогичный предыдущему, только применительно к agility_points.
  • bool add_critical_points(int points); — публичный метод аналогичный предыдущему, только применительно к critical_points.
  • double force(); — приватный метод, определяющий базовый урон наносимый бойцом по не защищённой цели. Определяется как: 1 + force_points;
  • bool critical(); — приватный метод, определяющий будет ли нанесён противнику двойной урон. Алгоритм расчёта:
    • генерируется случайное число;
    • делим его на максимально возможное, чтобы привести к диапазону [0…1];
    • если получившееся число больше 1/(1+(critical_points/4)^4), то персонаж наносит двойной урон и метод возвращает true, иначе false.
  • double attack(); — публичный метод, рассчитывающий полный урон, которой мог бы нанести боец по не защищённому противнику. Определяется как: force*(1+critical);
  • double defence(); — приватный метод, определяющий во сколько раз будет снижен урон получаемый бойцом. Определяется как: 1/(1+(defence_points/4)^4);
  • bool agility(); — приватный метод, определяющий удалось ли персонажу увернуться от удара. Алгоритм расчёта:
    • генерируется случайное число;
    • делим его на максимально возможное, чтобы привести к диапазону [0…1];
    • если получившееся число больше 1/(1+(agility_points/4)^4), то персонаж увернулся и метод возвращает true, иначе false.
  • double damage(double dmg); — публичный метод определяющий какой реальный урон получит боец, в случае если полный урон, наносимый противником, будет равен dmg. Реальный урон определяется как: (1-agility)*defence*dmg. Это число вычитается из health бойца и возвращается как результат работы метода;
  • bool is_dead(); — публичный метод. Возвращающий true если здоровье бойца <= нулю, иначе возвращается false.

Реализуйте консольное приложение, работающее согласно следующему описанию:

  1. Стартовый экран предлагает выбрать режим битвы: бот с ботом, игрок с ботом, игрок с игроком;
  2. Задаются характеристики бойцов:
    • для каждого бойца-игрока характеристики вводятся пользователем(-ами) в порядке указанном в Формате ввода. Ограничений на суммарное число очков нет. Обязательно использовать конструктор с параметрами;
    • для каждого бойца-бота характеристики генерируются случайным образом. Обязательно использовать конструктор без параметров и методы add_xxxx_points. Как вариант можно рандомно выбирать характеристику и увеличивать её на единицу, пока add_xxxx_points не вернёт false;
  3. Бойцы по очереди наносят друг другу удары до тех пор пока у одного из них не кончится health. Нужно использовать метод attack для расчёта урона атакующего бойца и метод damage для расчёта реально полученного урона защищающимся бойцом.
  4. Каждый удар сопровождается выводом сообщения, которое показывает сколько урона получил боец.
  5. На экране появляется сообщение объявляющее победителя.

Формат ввода
На стартовом экране вводится целое число: 1 — бот с ботом, 2 — игрок с ботом, 3 — игрок с игроком. Для каждого бойца-игрока пользователем(-ами) вводятся параметры (целое не отрицательное число) через пробел, в порядке: health_points, force_points, critical_points, defence_points, agility_points; Для ботов ввода нет. Проверять вводимые данные не требуется.

Формат вывода
На стартовом экране выводится меню выбора режима боя. В процессе боя, после каждого удара бойца выводится сообщение в формате(на примере 2х ботов): «Вot 1 received damage of 20 units». После боя выводится сообщение с «именем» победителя: «Bot 1 winner».

Пример 1

ВводВывод
1Select the battle mode:
1 — Bot and Bot
2 — Bot and User
3 — User and User

Вot 1 received damage of 20 units
Вot 2 received damage of 30 units
Вot 1 received damage of 0 units
Вot 2 received damage of 40 units
Вot 1 received damage of 20 units
Вot 2 received damage of 40 units
Bot 1 winner
Scroll Up