Система игровых персонажей
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 109 из 110.
Задание
ЛегкоДавайте создадим систему игровых персонажей, которая объединит все концепции ООП, которые вы освоили! Вы создадите различные классы персонажей с уникальными способностями, характеристиками и боевой механикой — моделируя то, как персонажи могут работать в реальной игре.
Ваша система будет организована в шести файлах:
character.dart: Создайте абстрактный классCharacter, который послужит основой для всех типов персонажей. У каждого персонажа естьname(String), приватное поле_health(int),attackPower(int) иdefense(int). Включите геттер для здоровья и следующие методы:takeDamage(int damage)— уменьшает здоровье наdamage - defense(минимум 1 единица урона, здоровье не может быть меньше 0). Выводитname takes X damage! Health: Ybool 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(). Затем симулируйте боевую последовательность:- Выведите сообщение об атаке Thorin
- Gandalf получает 30 урона
- Gandalf произносит заклинание
Healing Light(стоит 25 маны) - Gandalf лечится на 20 HP
- Выведите сообщение об атаке Gandalf
- Thorin получает 40 урона
- Выведите сообщение об атаке Legolas
- Выведите, жив ли каждый персонаж, в формате:
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"
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy17Финальные испытания
Платформа онлайн-обученияБанковская системаСистема игровых персонажейСервис аренды транспорта3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий