Spielcharakter-Entwicklung
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 86 von 87.
Bei dieser Herausforderung baust du ein Game Character Development-System, das die Leistungsfähigkeit von OOP bei der Modellierung komplexer, interaktiver Entitäten demonstriert.
Entwirf eine Charakterhierarchie, in der eine Basisklasse Character gemeinsame Attribute wie Gesundheit, Name und Stufe definiert. Spezialisierte Klassen wie Warrior, Mage und Archer erweitern diese Basisklasse um einzigartige abilities 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 characters ihre Kampfstile dynamisch wechseln können. Das State-Muster könnte character-Zustände wie normal, vergiftet oder betäubt verwalten, die das Verhalten beeinflussen.
Denke über Komposition für Ausrüstungssysteme nach, in denen characters Waffen und Rüstungen „haben“, anstatt von ihnen zu erben. Verwende Aufzählungen für character-Klassen oder Schadensarten und wende Kapselung an, um Statistiken vor ungültigen Änderungen zu schützen.
Aufgabe
EinfachLass uns ein Game-Character-Development-System entwickeln, das die Leistungsfähigkeit von OOP bei der Modellierung komplexer, interaktiver Spieleinheiten zeigt! Du erstellst eine Charakterhierarchie mit verschiedenen Kampfstilen, besonderen Fähigkeiten und einem Zustandssystem, das beeinflusst, wie sich characters verhalten.
Du organisierst deinen Code über sieben Dateien:
DamageType.java: Erstelle ein Enum, das verschiedene Schadensarten im Spiel repräsentiert. Füge die WertePHYSICAL,MAGICALundRANGEDhinzu. Ergänze ein privates Felddescription(String), einen Konstruktor, der es setzt, und einen Getter. Physischer Schaden soll die Beschreibung "brute force" haben, magischer Schaden "arcane energy" und Fernkampfschaden "precision strike".Attackable.java: Erstelle ein Interface, das combat-Fähigkeiten definiert. Deklariere die Methodeattack(Character target), die einen String zurückgibt, der den Angriff beschreibt, sowiegetDamageType(), die einen DamageType zurückgibt.Healable.java: Erstelle ein Interface für Fähigkeiten zur Wiederherstellung. Deklariere eine Methodeheal(int amount), die einen String zurückgibt, der die Heilungsaktion beschreibt.Character.java: Erstelle eine abstrakte Basisklasse für alle Spielcharaktere. Füge private Felder fürname(String),health(int),maxHealth(int) undlevel(int) hinzu. Der Konstruktor erhält name, maxHealth und level und setzt health zunächst auf maxHealth. Füge Getter für alle Felder hinzu. Ergänze eine geschützte MethodesetHealth(int health), 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 erhält name, maxHealth, level und strength. ImplementieregetCharacterClass()so, dass"Warrior"zurückgegeben wird. ImplementieregetDamageType()so, dassPHYSICALzurückgegeben wird. Implementiereattack(Character target)so, dass Schaden in Höhe von strength plus level verursacht, die takeDamage-Methode des Ziels aufgerufen und"[name] strikes with [damageType description] for [damage] damage!"gefolgt von einem Zeilenumbruch und dem takeDamage-Ergebnis 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 erhält name, maxHealth, level, intelligence und mana. ImplementieregetCharacterClass()so, dass"Mage"zurückgegeben wird. ImplementieregetDamageType()so, dassMAGICALzurückgegeben wird. Implementiereattack(Character target)so, dass Schaden in Höhe von intelligence mal 2 verursacht wird, und verwende dasselbe Format wie bei Warrior. Implementiereheal(int amount), um health wiederherzustellen (mithilfe von setHealth), und gib"[name] channels healing magic! Health: [health]/[maxHealth]"zurück.Main.java: Erwecke dein Spielsystem zum Leben! Du erhältst einen durch Kommas getrennten Befehlsstring:CREATE_WARRIOR:name:maxHealth:level:strengthCREATE_MAGE:name:maxHealth:level:intelligence:manaATTACK:attackerName:targetNameHEAL:mageName:amountSTATUS:characterName
Verwalte eine Sammlung von characters. Verarbeite jeden Befehl und gib Folgendes aus:
- CREATE_WARRIOR/CREATE_MAGE:
[name] the [characterClass] joins the battle! - ATTACK: Gib das Angriffsergebnis aus (den von der attack-Methode zurückgegebenen String).
- HEAL: Gib das Heilergebnis aus oder
[name] cannot heal, wenn der character kein Mage ist. - STATUS:
[name] ([characterClass]) - Level [level] - Health: [health]/[maxHealth] - [Alive/Defeated]
Gib nach allen Befehlen
--- Battle Summary ---aus, gefolgt vom Status jedes characters.
Du erhältst eine Eingabe: den durch Kommas getrennten Befehlsstring.
Bei der Eingabe CREATE_WARRIOR:Thorin:100:5:15,CREATE_MAGE:Gandalf:80:7:12:50,ATTACK:Thorin:Gandalf,HEAL:Gandalf:25,STATUS:Gandalf würde deine Ausgabe beispielsweise so aussehen:
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), Polymorphismus (verschiedene Charaktertypen einheitlich behandeln) und Kapselung (geschützte health-Verwaltung) 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 this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - ZahlungssystemÜbe selbstständig: Online-Java-Compiler