Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lass 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 Werte PHYSICAL, MAGICAL und RANGED hinzu. Ergänze ein privates Feld description (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 Methode attack(Character target), die einen String zurückgibt, der den Angriff beschreibt, sowie getDamageType(), die einen DamageType zurückgibt.
  • Healable.java: Erstelle ein Interface für Fähigkeiten zur Wiederherstellung. Deklariere eine Methode heal(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ür name (String), health (int), maxHealth (int) und level (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 Methode setHealth(int health), 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 erhält name, maxHealth, level und strength. Implementiere getCharacterClass() so, dass "Warrior" zurückgegeben wird. Implementiere getDamageType() so, dass PHYSICAL zurückgegeben wird. Implementiere attack(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 Felder intelligence (int) und mana (int) hinzu. Der Konstruktor erhält name, maxHealth, level, intelligence und mana. Implementiere getCharacterClass() so, dass "Mage" zurückgegeben wird. Implementiere getDamageType() so, dass MAGICAL zurückgegeben wird. Implementiere attack(Character target) so, dass Schaden in Höhe von intelligence mal 2 verursacht wird, und verwende dasselbe Format wie bei Warrior. Implementiere heal(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:strength
    • CREATE_MAGE:name:maxHealth:level:intelligence:mana
    • ATTACK:attackerName:targetName
    • HEAL:mageName:amount
    • STATUS: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 - Alive

Diese 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
    }
}
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