Menu
Coddy logo textTech

Система игровых персонажей

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 109 из 110.

challenge icon

Задание

Легко

Давайте создадим систему игровых персонажей, которая объединит все концепции ООП, которые вы освоили! Вы создадите различные классы персонажей с уникальными способностями, характеристиками и боевой механикой — моделируя то, как персонажи могут работать в реальной игре.

Ваша система будет организована в шести файлах:

  • character.dart: Создайте абстрактный класс Character, который послужит основой для всех типов персонажей. У каждого персонажа есть name (String), приватное поле _health (int), attackPower (int) и defense (int). Включите геттер для здоровья и следующие методы:
    • takeDamage(int damage) — уменьшает здоровье на damage - defense (минимум 1 единица урона, здоровье не может быть меньше 0). Выводит name takes X damage! Health: Y
    • bool isAlive() — возвращает true, если здоровье больше 0
    • Абстрактный метод String attack(), который подклассы реализуют для своего уникального стиля атаки
    Переопределите toString(), чтобы он возвращал name [Class] - HP: health, ATK: attackPower, DEF: defense, где Class берется из runtimeType.
  • abilities.dart: Создайте два миксина (mixins), предоставляющих специальные способности:
    • CanHeal — предоставляет метод heal(int amount). Поскольку миксины не могут напрямую обращаться к приватным полям, этот миксин должен определять абстрактный метод void restoreHealth(int amount), который реализует класс персонажа. Метод heal() вызывает restoreHealth(amount) и выводит name heals for amount HP!
    • CanCastSpells — предоставляет int mana (по умолчанию 100) и метод castSpell(String spellName, int manaCost), который уменьшает ману, если её достаточно, выводит name casts spellName! и возвращает true. Если маны недостаточно, выводит Not enough mana! и возвращает false.
  • warrior.dart: Создайте класс Warrior, наследующий Character. Воины — это «танки» с высокой защитой. Инициализируйте со 150 единицами здоровья, 20 силой атаки и 15 защитой. Реализуйте attack(), чтобы он возвращал name swings a mighty sword!
  • mage.dart: Создайте класс Mage, наследующий Character и использующий миксины CanCastSpells и CanHeal. Маги хрупкие, но могущественные. Инициализируйте с 80 единицами здоровья, 35 силой атаки и 5 защитой. Реализуйте attack(), чтобы он возвращал name hurls a fireball!. Реализуйте restoreHealth(int amount) для увеличения здоровья (максимум 80).
  • archer.dart: Создайте класс Archer, наследующий Character. Лучники — сбалансированные бойцы. Инициализируйте со 100 единицами здоровья, 25 силой атаки и 10 защитой. Реализуйте attack(), чтобы он возвращал name fires a precise arrow!
  • main.dart: Продемонстрируйте свою систему персонажей, создав по одному персонажу каждого типа: воина по имени Thorin, мага по имени Gandalf и лучника по имени Legolas. Выведите каждого персонажа, используя toString(). Затем симулируйте боевую последовательность:
    1. Выведите сообщение об атаке Thorin
    2. Gandalf получает 30 урона
    3. Gandalf произносит заклинание Healing Light (стоит 25 маны)
    4. Gandalf лечится на 20 HP
    5. Выведите сообщение об атаке Gandalf
    6. Thorin получает 40 урона
    7. Выведите сообщение об атаке Legolas
    8. Выведите, жив ли каждый персонаж, в формате: name alive: true/false

Ожидаемый вывод:

Thorin [Warrior] - HP: 150, ATK: 20, DEF: 15
Gandalf [Mage] - HP: 80, ATK: 35, DEF: 5
Legolas [Archer] - HP: 100, ATK: 25, DEF: 10
Thorin swings a mighty sword!
Gandalf takes 25 damage! Health: 55
Gandalf casts Healing Light!
Gandalf heals for 20 HP!
Gandalf hurls a fireball!
Thorin takes 25 damage! Health: 125
Legolas fires a precise arrow!
Thorin alive: true
Gandalf alive: true
Legolas alive: true

Попробуйте сами

import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';

void main() {
  // TODO: Создать Warrior по имени "Thorin"

  // TODO: Создать Mage по имени "Gandalf"

  // TODO: Создать Archer по имени "Legolas"

  // TODO: Вывести каждого персонажа, используя toString()

  // TODO: Симулировать последовательность боя:
  // 1. Вывести сообщение об атаке Thorin
  // 2. Gandalf получает 30 единиц урона
  // 3. Gandalf произносит заклинание "Healing Light" (стоит 25 mana)
  // 4. Gandalf восстанавливает 20 HP
  // 5. Вывести сообщение об атаке Gandalf
  // 6. Thorin получает 40 единиц урона
  // 7. Вывести сообщение об атаке Legolas
  // 8. Вывести, жив ли каждый персонаж: "name alive: true/false"
}

Все уроки раздела Объектно-ориентированное программирование

17Финальные испытания

Платформа онлайн-обученияБанковская системаСистема игровых персонажейСервис аренды транспорта