Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Erstellen 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 Werte PHYSICAL, MAGICAL und RANGED hinzu. Füge ein privates Feld description (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 Methoden attack(Character target), die einen String zurückgibt, der den Angriff beschreibt, und getDamageType(), die einen DamageType zurückgibt.
  • Healable.java: Erstelle ein Interface für Wiederherstellungsfähigkeiten. Deklariere eine Methode heal(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ür name (String), health (int), maxHealth (int) und level (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 Methode setHealth(int health) hinzu, die sicherstellt, dass health zwischen 0 und maxHealth bleibt. Erstelle eine Methode takeDamage(int damage), die health reduziert und "[name] takes [damage] damage! Health: [health]/[maxHealth]" zurückgibt. Füge eine Methode isAlive() hinzu, die true zurückgibt, wenn health größer als 0 ist. Deklariere eine abstrakte Methode getCharacterClass(), die einen String zurückgibt.
  • Warrior.java: Erstelle eine Klasse, die Character erweitert und Attackable implementiert. Füge ein privates Feld strength (int) hinzu. Der Konstruktor übernimmt name, maxHealth, level und strength. Implementiere getCharacterClass(), sodass "Warrior" zurückgegeben wird. Implementiere getDamageType(), sodass PHYSICAL zurückgegeben wird. Implementiere attack(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 Felder intelligence (int) und mana (int) hinzu. Der Konstruktor übernimmt name, maxHealth, level, intelligence und mana. Implementiere getCharacterClass(), sodass "Mage" zurückgegeben wird. Implementiere getDamageType(), sodass MAGICAL zurückgegeben wird. Implementiere attack(Character target), sodass Schaden in Höhe von intelligence mal 2 verursacht wird, und verwende dasselbe Format wie bei Warrior. Implementiere heal(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:strength
    • CREATE_MAGE:name:maxHealth:level:intelligence:mana
    • ATTACK:attackerName:targetName
    • HEAL:mageName:amount
    • STATUS: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 - Alive

Diese 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
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Java-Compiler