System postaci w grze
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 109 z 110.
Wyzwanie
ŁatwyZbudujmy system postaci do gry, który łączy wszystkie opanowane przez Ciebie koncepcje OOP! Utworzysz różne klasy postaci o unikalnych umiejętnościach, statystykach i mechanikach walki — modelując to, jak postacie mogłyby działać w prawdziwej grze.
Twój system będzie zorganizowany w sześciu plikach:
character.dart: Utwórz abstrakcyjną klasęCharacter, która będzie podstawą wszystkich typów postaci. Każda postać maname(String), prywatne pole_health(int),attackPower(int) orazdefense(int). Dodaj getter dla zdrowia i następujące metody:takeDamage(int damage)— zmniejsza zdrowie odamage - defense(otrzymane obrażenia wynoszą co najmniej 1, a zdrowie nie może spaść poniżej 0). Wyświetlaname takes X damage! Health: Ybool isAlive()— zwraca true, jeśli zdrowie jest większe od 0- Abstrakcyjna metoda
String attack(), którą podklasy implementują, aby określić swój unikalny styl ataku
toString(), aby zwracałaname [Class] - HP: health, ATK: attackPower, DEF: defense, gdzie Class pochodzi zruntimeType.abilities.dart: Utwórz dwa miksy zapewniające specjalne umiejętności:CanHeal— udostępnia metodęheal(int amount). Ponieważ miksy nie mogą bezpośrednio uzyskiwać dostępu do pól prywatnych, ten miks powinien definiować abstrakcyjną metodęvoid restoreHealth(int amount), którą implementuje klasa postaci. Metodaheal()wywołujerestoreHealth(amount)i wyświetlaname heals for amount HP!CanCastSpells— udostępniaint mana(domyślnie 100) oraz metodęcastSpell(String spellName, int manaCost), która zmniejsza manę, jeśli jest jej wystarczająco dużo, wyświetlaname casts spellName!i zwraca true. Jeśli many jest za mało, wyświetlaNot enough mana!i zwraca false.
warrior.dart: Utwórz klasęWarriorrozszerzającąCharacter. Wojownicy są tankami o wysokiej obronie. Zainicjuj postać z 150 punktami zdrowia, 20 punktami siły ataku i 15 punktami obrony. Zaimplementujattack(), aby zwracałaname swings a mighty sword!mage.dart: Utwórz klasęMagerozszerzającąCharacteri używającą miksówCanCastSpellsorazCanHeal. Magowie są delikatni, ale potężni. Zainicjuj postać z 80 punktami zdrowia, 35 punktami siły ataku i 5 punktami obrony. Zaimplementujattack(), aby zwracałaname hurls a fireball!. ZaimplementujrestoreHealth(int amount), aby zwiększała zdrowie (maksymalnie do 80).archer.dart: Utwórz klasęArcherrozszerzającąCharacter. Łucznicy to wszechstronni wojownicy. Zainicjuj postać z 100 punktami zdrowia, 25 punktami siły ataku i 10 punktami obrony. Zaimplementujattack(), aby zwracałaname fires a precise arrow!main.dart: Zademonstruj działanie systemu postaci, tworząc po jednej postaci każdego typu: Wojownika o imieniuThorin, Maga o imieniuGandalfi Łucznika o imieniuLegolas. Wyświetl każdą postać za pomocątoString(). Następnie zasymuluj przebieg walki:- Wyświetl komunikat o ataku Thorina
- Gandalf otrzymuje 30 punktów obrażeń
- Gandalf rzuca zaklęcie
Healing Light(kosztuje 25 punktów many) - Gandalf leczy się o 20 punktów HP
- Wyświetl komunikat o ataku Gandalfa
- Thorin otrzymuje 40 punktów obrażeń
- Wyświetl komunikat o ataku Legolasa
- Wyświetl, czy każda postać żyje, w formacie:
name alive: true/false
Oczekiwany wynik:
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: trueSpróbuj swoich sił
import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';
void main() {
// TODO: Utwórz postać Warrior o imieniu "Thorin"
// TODO: Utwórz postać Mage o imieniu "Gandalf"
// TODO: Utwórz postać Archer o imieniu "Legolas"
// TODO: Wypisz każdą postać, używając toString()
// TODO: Zasymuluj przebieg walki:
// 1. Wypisz komunikat o ataku Thorina
// 2. Gandalf otrzymuje 30 obrażeń
// 3. Gandalf rzuca zaklęcie "Healing Light" (kosztuje 25 punktów many)
// 4. Gandalf odzyskuje 20 HP
// 5. Wypisz komunikat o ataku Gandalfa
// 6. Thorin otrzymuje 40 obrażeń
// 7. Wypisz komunikat o ataku Legolasa
// 8. Wypisz, czy każda postać żyje: "name alive: true/false"
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online