Spielfiguren-System
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 this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor