Spielcharaktersystem
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 109 von 110.
Aufgabe
EinfachLass uns ein Spiel-Charakter-System bauen, das alle OOP-Konzepte vereint, die du bereits meisterst! Du wirst verschiedene Charakterklassen mit einzigartigen Fähigkeiten, Werten und Kampfmechaniken erstellen – so wie Charaktere in einem echten Spiel funktionieren könnten.
Dein System wird über sechs Dateien organisiert sein:
character.dart: Erstelle eine abstrakte KlasseCharacter, die als Grundlage für alle Charaktertypen dient. Jeder Charakter hat einenname(String), ein privates Feld_health(int),attackPower(int) unddefense(int). Füge einen Getter für die Gesundheit und diese Methoden hinzu:takeDamage(int damage)– reduziert die Gesundheit umdamage - defense(mindestens 1 Schaden wird erlitten, die Gesundheit kann nicht unter 0 sinken). Gibtname takes X damage! Health: Yaus.bool isAlive()– gibt true zurück, wenn die Gesundheit größer als 0 ist.- Eine abstrakte Methode
String attack(), die Subklassen für ihren einzigartigen Angriffsstil implementieren.
toString(), umname [Class] - HP: health, ATK: attackPower, DEF: defensezurückzugeben, wobei Class ausruntimeTypestammt.abilities.dart: Erstelle zwei Mixins, die Spezialfähigkeiten bereitstellen:CanHeal– stellt eine Methodeheal(int amount)bereit. Da Mixins nicht direkt auf private Felder zugreifen können, sollte dieses Mixin eine abstrakte Methodevoid restoreHealth(int amount)definieren, die die Charakterklasse implementiert. Die Methodeheal()ruftrestoreHealth(amount)auf und gibtname heals for amount HP!aus.CanCastSpells– stelltint mana(Standardwert 100) und eine MethodecastSpell(String spellName, int manaCost)bereit, die das Mana reduziert, falls ausreichend vorhanden,name casts spellName!ausgibt und true zurückgibt. Bei unzureichendem Mana wirdNot enough mana!ausgegeben und false zurückgegeben.
warrior.dart: Erstelle eine KlasseWarrior, dieCharactererweitert. Krieger sind Tanks mit hoher Verteidigung. Initialisiere sie mit 150 Gesundheit, 20 Angriffskraft und 15 Verteidigung. Implementiereattack()so, dassname swings a mighty sword!zurückgegeben wird.mage.dart: Erstelle eine KlasseMage, dieCharactererweitert und die MixinsCanCastSpellssowieCanHealverwendet. Magier sind zerbrechlich, aber mächtig. Initialisiere sie mit 80 Gesundheit, 35 Angriffskraft und 5 Verteidigung. Implementiereattack()so, dassname hurls a fireball!zurückgegeben wird. ImplementiererestoreHealth(int amount), um die Gesundheit zu erhöhen (begrenzt auf maximal 80).archer.dart: Erstelle eine KlasseArcher, dieCharactererweitert. Bogenschützen sind ausgeglichene Kämpfer. Initialisiere sie mit 100 Gesundheit, 25 Angriffskraft und 10 Verteidigung. Implementiereattack()so, dassname fires a precise arrow!zurückgegeben wird.main.dart: Demonstriere dein Charaktersystem, indem du von jedem Charaktertyp einen erstellst: einen Krieger namensThorin, einen Magier namensGandalfund einen Bogenschützen namensLegolas. Gib jeden Charakter mittoString()aus. Simuliere dann eine Kampfsequenz:- Gib Thorins Angriffsnachricht aus
- Gandalf erleidet 30 Schaden
- Gandalf wirkt
Healing Light(kostet 25 Mana) - Gandalf heilt sich um 20 HP
- Gib Gandalfs Angriffsnachricht aus
- Thorin erleidet 40 Schaden
- Gib Legolas' Angriffsnachricht aus
- Gib für jeden Charakter aus, ob er noch am Leben ist, im Format:
name alive: true/false
Erwartete Ausgabe:
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: trueProbier es selbst
import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';
void main() {
// TODO: Erstelle einen Warrior namens "Thorin"
// TODO: Erstelle einen Mage namens "Gandalf"
// TODO: Erstelle einen Archer namens "Legolas"
// TODO: Gib jeden Charakter mit toString() aus
// TODO: Simuliere die Kampfsequenz:
// 1. Gib Thorins Angriffsnachricht aus
// 2. Gandalf erleidet 30 Schaden
// 3. Gandalf wirkt "Healing Light" (kostet 25 mana)
// 4. Gandalf heilt sich um 20 HP
// 5. Gib Gandalfs Angriffsnachricht aus
// 6. Thorin erleidet 40 Schaden
// 7. Gib Legolas' Angriffsnachricht aus
// 8. Gib aus, ob jeder Charakter am Leben ist: "name alive: true/false"
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler