Menu
Coddy logo textTech

Spielfiguren-System

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 109 von 110.

challenge icon

Aufgabe

Einfach

Lass 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 Klasse Character, die als Grundlage für alle Charaktertypen dient. Jeder Charakter hat einen name (String), ein privates Feld _health (int), attackPower (int) und defense (int). Füge einen Getter für die Gesundheit und diese Methoden hinzu:
    • takeDamage(int damage) – reduziert die Gesundheit um damage - defense (mindestens 1 Schaden wird erlitten, die Gesundheit kann nicht unter 0 sinken). Gibt name takes X damage! Health: Y aus.
    • 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.
    Überschreibe toString(), um name [Class] - HP: health, ATK: attackPower, DEF: defense zurückzugeben, wobei Class aus runtimeType stammt.
  • abilities.dart: Erstelle zwei Mixins, die Spezialfähigkeiten bereitstellen:
    • CanHeal – stellt eine Methode heal(int amount) bereit. Da Mixins nicht direkt auf private Felder zugreifen können, sollte dieses Mixin eine abstrakte Methode void restoreHealth(int amount) definieren, die die Charakterklasse implementiert. Die Methode heal() ruft restoreHealth(amount) auf und gibt name heals for amount HP! aus.
    • CanCastSpells – stellt int mana (Standardwert 100) und eine Methode castSpell(String spellName, int manaCost) bereit, die das Mana reduziert, falls ausreichend vorhanden, name casts spellName! ausgibt und true zurückgibt. Bei unzureichendem Mana wird Not enough mana! ausgegeben und false zurückgegeben.
  • warrior.dart: Erstelle eine Klasse Warrior, die Character erweitert. Krieger sind Tanks mit hoher Verteidigung. Initialisiere sie mit 150 Gesundheit, 20 Angriffskraft und 15 Verteidigung. Implementiere attack() so, dass name swings a mighty sword! zurückgegeben wird.
  • mage.dart: Erstelle eine Klasse Mage, die Character erweitert und die Mixins CanCastSpells sowie CanHeal verwendet. Magier sind zerbrechlich, aber mächtig. Initialisiere sie mit 80 Gesundheit, 35 Angriffskraft und 5 Verteidigung. Implementiere attack() so, dass name hurls a fireball! zurückgegeben wird. Implementiere restoreHealth(int amount), um die Gesundheit zu erhöhen (begrenzt auf maximal 80).
  • archer.dart: Erstelle eine Klasse Archer, die Character erweitert. Bogenschützen sind ausgeglichene Kämpfer. Initialisiere sie mit 100 Gesundheit, 25 Angriffskraft und 10 Verteidigung. Implementiere attack() so, dass name fires a precise arrow! zurückgegeben wird.
  • main.dart: Demonstriere dein Charaktersystem, indem du von jedem Charaktertyp einen erstellst: einen Krieger namens Thorin, einen Magier namens Gandalf und einen Bogenschützen namens Legolas. Gib jeden Charakter mit toString() aus. Simuliere dann eine 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 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: true

Probier 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