Entwicklung einer Spielfigur
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 86 von 87.
Bei dieser Herausforderung erstellst du ein System zur Entwicklung von Spielfiguren, das die Leistungsfähigkeit der OOP bei der Modellierung komplexer, interaktiver Entitäten demonstriert.
Entwirf eine Charakterhierarchie, in der eine Character-Basisklasse gemeinsame Attribute wie Gesundheit, Name und Stufe definiert. Spezialisierte Klassen wie Warrior, Mage und Archer erweitern diese Basis um einzigartige Fähigkeiten und Kampfstile.
Schnittstellen funktionieren hier ganz natürlich: Attackable könnte Kampfmethoden definieren, während Healable Wiederherstellungsfähigkeiten übernimmt. Ein Mage könnte beides implementieren, wohingegen sich ein Warrior ausschließlich auf das Angreifen konzentriert.
Erwäge die Verwendung des Strategy-Musters für verschiedene Angriffsverhalten, sodass Charaktere ihre Kampfstile dynamisch wechseln können. Das State-Muster könnte Charakterzustände wie normale, vergiftete oder betäubte Zustände verwalten, die das Verhalten beeinflussen.
Denke über Komposition für Ausrüstungssysteme nach, bei denen Charaktere Waffen und Rüstungen „haben“, statt von ihnen zu erben. Verwende Enums für Charakterklassen oder Schadensarten und setze Kapselung ein, um die Werte vor ungültigen Änderungen zu schützen.
Aufgabe
EinfachErstellen wir ein Entwicklungs-System für Spielfiguren, das die Leistungsfähigkeit von OOP bei der Modellierung komplexer, interaktiver Spielentitäten veranschaulicht! Du wirst eine Figurenhierarchie mit verschiedenen Kampfstilen, besonderen Fähigkeiten und einem Zustandssystem erstellen, das beeinflusst, wie sich die Figuren verhalten.
Du wirst deinen Code auf sieben Dateien verteilen:
DamageType.java: Erstelle ein Enum, das verschiedene Schadensarten im Spiel repräsentiert. Füge die WertePHYSICAL,MAGICALundRANGEDhinzu. Füge ein privates Felddescription(String), einen Konstruktor, der es festlegt, und einen Getter hinzu. Physischer Schaden sollte die Beschreibung "brute force" haben, magischer Schaden "arcane energy" und Fernkampfschaden "precision strike".Attackable.java: Erstelle ein Interface, das Kampffähigkeiten definiert. Deklariere die Methodenattack(Character target), die einen String zurückgibt, der den Angriff beschreibt, undgetDamageType(), die einen DamageType zurückgibt.Healable.java: Erstelle ein Interface für Wiederherstellungsfähigkeiten. Deklariere eine Methodeheal(int amount), die einen String zurückgibt, der die Heilungsaktion beschreibt.Character.java: Erstelle eine abstrakte Basisklasse für alle Spielfiguren. Füge private Felder fürname(String),health(int),maxHealth(int) undlevel(int) hinzu. Der Konstruktor übernimmt name, maxHealth und level und setzt health zunächst auf maxHealth. Füge Getter für alle Felder hinzu. Füge eine geschützte MethodesetHealth(int health)hinzu, die sicherstellt, dass health zwischen 0 und maxHealth bleibt. Erstelle eine MethodetakeDamage(int damage), die health reduziert und"[name] takes [damage] damage! Health: [health]/[maxHealth]"zurückgibt. Füge eine MethodeisAlive()hinzu, die true zurückgibt, wenn health größer als 0 ist. Deklariere eine abstrakte MethodegetCharacterClass(), die einen String zurückgibt.Warrior.java: Erstelle eine Klasse, die Character erweitert und Attackable implementiert. Füge ein privates Feldstrength(int) hinzu. Der Konstruktor übernimmt name, maxHealth, level und strength. ImplementieregetCharacterClass(), sodass"Warrior"zurückgegeben wird. ImplementieregetDamageType(), sodassPHYSICALzurückgegeben wird. Implementiereattack(Character target), sodass Schaden in Höhe von strength plus level verursacht wird, die takeDamage-Methode des Ziels aufgerufen wird und"[name] strikes with [damageType description] for [damage] damage!"gefolgt von einem Zeilenumbruch und dem Ergebnis von takeDamage zurückgegeben wird.Mage.java: Erstelle eine Klasse, die Character erweitert und sowohl Attackable als auch Healable implementiert. Füge die privaten Felderintelligence(int) undmana(int) hinzu. Der Konstruktor übernimmt name, maxHealth, level, intelligence und mana. ImplementieregetCharacterClass(), sodass"Mage"zurückgegeben wird. ImplementieregetDamageType(), sodassMAGICALzurückgegeben wird. Implementiereattack(Character target), sodass Schaden in Höhe von intelligence mal 2 verursacht wird, und verwende dasselbe Format wie bei Warrior. Implementiereheal(int amount), sodass health wiederhergestellt wird (mithilfe von setHealth) und"[name] channels healing magic! Health: [health]/[maxHealth]"zurückgegeben wird.Main.java: Erwecke dein Spielsystem zum Leben! Du erhältst einen durch Kommas getrennten String mit Befehlen:CREATE_WARRIOR:name:maxHealth:level:strengthCREATE_MAGE:name:maxHealth:level:intelligence:manaATTACK:attackerName:targetNameHEAL:mageName:amountSTATUS:characterName
Verwalte eine Sammlung von Figuren. Verarbeite jeden Befehl und gib Folgendes aus:
- CREATE_WARRIOR/CREATE_MAGE:
[name] the [characterClass] joins the battle! - ATTACK: Gib das Angriffsergebnis aus (den vom Angriff zurückgegebenen String)
- HEAL: Gib das Heilergebnis aus oder
[name] cannot heal, wenn die Figur kein Mage ist - STATUS:
[name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]
Gib nach allen Befehlen
--- Battle Summary ---aus, gefolgt vom Status jeder Figur.
Du erhältst eine Eingabe: den durch Kommas getrennten Befehls-String.
Wenn die Eingabe beispielsweise CREATE_WARRIOR:Thorin:100:5:15,CREATE_MAGE:Gandalf:80:7:12:50,ATTACK:Thorin:Gandalf,HEAL:Gandalf:25,STATUS:Gandalf lautet, wäre deine Ausgabe:
Thorin the Warrior joins the battle!
Gandalf the Mage joins the battle!
Thorin strikes with brute force for 20 damage!
Gandalf takes 20 damage! Health: 60/80
Gandalf channels healing magic! Health: 80/80
Gandalf (Mage) - Level 7 - Health: 80/80 - Alive
--- Battle Summary ---
Thorin (Warrior) - Level 5 - Health: 100/100 - Alive
Gandalf (Mage) - Level 7 - Health: 80/80 - AliveDiese Herausforderung verbindet Vererbung (Character-Hierarchie), die Implementierung mehrerer Interfaces (Mage implementiert sowohl Attackable als auch Healable), Enums mit Methoden (DamageType), Polymorphie (einheitliche Behandlung verschiedener Figurentypen) und Kapselung (geschütztes Gesundheitsmanagement) zu einem fesselnden Spielsystem!
Probier es selbst
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
import java.util.LinkedHashMap;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Verwende eine Collection, um Charaktere zu verwalten (LinkedHashMap bewahrt die Einfügereihenfolge)
// LinkedHashMap<String, Character> characters = new LinkedHashMap<>();
// TODO: Teile die Eingabe anhand von Kommas auf, um einzelne Befehle zu erhalten
// String[] commands = input.split(",");
// TODO: Verarbeite jeden Befehl:
// - CREATE_WARRIOR:name:maxHealth:level:strength
// Print: "[name] the Warrior joins the battle!"
//
// - CREATE_MAGE:name:maxHealth:level:intelligence:mana
// Print: "[name] the Mage joins the battle!"
//
// - ATTACK:attackerName:targetName
// Gib das Angriffsergebnis der attack-Methode aus
//
// - HEAL:mageName:amount
// Gib das Heilungsergebnis aus, oder "[name] cannot heal" falls es kein Mage ist
//
// - STATUS:characterName
// Ausgeben: "[name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]"
// TODO: After all commands, print "--- Battle Summary ---"
// Dann den Status jedes Charakters ausgeben
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler