Home > Informatik > Stufe EF > Abenteuerspiel

Die Klasse Gegenstand

Einleitung - Gegenstand

Vorüberlegungen

Die Klasse Gegenstand ist für alle irgenwie gearteten Gegenstände des Spiels verantwortlich. Sowohl alle möglichen Waffen wie Verteidigungs- und Rüstungsgegenstände, aber auch Heil- und Zaubertränke sollen durch die Klasse Gegenstand abgebildet werden. Eine graphische Darstellung der Gegenstände ist zu diesem Zeitpunkt des Spiels noch nicht geplant und wird auch in diesem kleinen Kurs nicht realisiert. Das wäre dann eine Zusatzaufgabe für besonders engagierte Schüler(innen).

Attribute

Für den Anfang begnügen wir uns mit sehr wenigen Eigenschaften. Ein Gegenstand hat natürlich einen Namen. In richtigen Adventuregames haben Gegenstände teils ganz exotische Namen wie "grausames Schwert des Gemetzels" oder noch doller. Ich könnte ja jetzt mal mein Diablo III starten und nachgucken, habe dazu aber keine Lust. Das Laden dauert immer so lange.

Ein Gegenstand hat auch immer einen Wert. Dieser Wert ist zum Beispiel dann wichtig, wenn der Gegenstand gekauft oder verkauft werden soll. Andererseits hatten wir in unseren Vorüberlegungen keine Händler eingeplant, bei denen der Held Gegenstände kaufen/verkaufen kann, darum ist das Attribut wert vielleicht nicht ganz so wichtig. Aber egal, wir planen es erstmal mit ein, genauso wie das Attribut name.

Der Held, den wir durch den Dungeon steuern, hat auch bestimmte Werte. In richtigen Spielen wird das immer stark übertrieben, da gibt es manchmal über 20 Eigenschaften, die zu Beginn des Spiels ausgewürfelt und/oder vom Benutzer verändert werden können. Wir wollen uns hier auf wenige Eigenschaften beschränken, schließlich handelt es sich um ein Unterrichtsprojekt und nicht um eine Programmierarbeit, an denen man nächtelang sitzt. Engagierte Schüler(innen) können das ja gern machen, aber seit an den meisten Schulen auch Nachmittags bis 16 oder 17 Uhr unterrichtet wird, haben die meisten Schüler(innen) dazu überhaupt keine Zeit mehr.

Zwei wichtige Eigenschaften des Helden sind der Angriffswert und der Verteidigungswert. Diese beiden Werte hängen stark von der angelegten Ausrüstung ab. Darum sollte auch jeder Gegenstand einen Angriffswert und einen Verteidigungswert haben.

Durch das häufige Benutzen verlieren viele Gegenstände ihre Haltbarkeit. Das wäre dann das nächste Attribut der Klasse Gegenstand. Am Anfang hat die Haltbarkeit den Wert 100 (also 100 Prozent), durch Kämpfe kann ein Gegenstand beschädigt werden, und darunter leidet dann die Haltbarkeit oder der Zustand.

Nun geht es endlich los

Bei solchen Großprojekten stellt sich immer die Frage: Wie fängt man am besten an? Und zu dieser Frage gibt es mehr als zwei Antworten. Es kommt immer auf den persönlichen Programmierstil an, und ob man alleine arbeitet oder in einem Team. Können die großen Aufgaben in kleine Teilaufgaben zerlegt werden, die vielleicht von verschiedenen Team-Mitgliedern bearbeitet werden? Dann sind enge Absprachen zwischen den Mitgliedern notwendig, wie die einzelnen Klassen heißen, welche Methoden sie zur Verfügung stellen und wie die Parameter der Methoden genau aussehen. In Schulbüchern macht sich dieses Top-Down-Paradigma immer gut, in der Schulpraxis lässt es sich aber meistens nicht so gut verwirklichen. Ich persönlich neige eher zu dem Bottom-Up-Paradigma. Erst mal kleine Klassen entwickeln und absolut fehlerfrei machen, bevor man diese Klassen dann in ein größeres Projekt integriert. So habe ich es eigentlich schon immer gemacht, und meine Schüler kommen damit auch sehr gut zurecht, also bleiben wir mal bei diesem Vorgehen.

public class Gegenstand
{
    private String name;
    private double goldwert, angriffswert, verteidigungswert, zustand;
    
    public Gegenstand(String n, double g, double a, double v)
    {
        name              = n;
        goldwert          = g;
        angriffswert      = a;
        verteidigungswert = v;
        zustand           = 100;
    }
    
    public void println()
    {
       System.out.print  (name+"\t\t");
       if (name.length() < 25) System.out.print("\t");
       System.out.print  ("G: "+goldwert+" A: "+angriffswert);
       System.out.println(" V: "+ verteidigungswert+" Z: "+zustand);
    }
Aufgabe für Schüler, die noch Probleme mit Java haben

Erläutern Sie, welche Aufgabe hier der Konstruktor erfüllt, und welche Bedeutung die vier Parameter dabei haben.

Aufgabe für Experten:

Die Ausgabe der println-Methode ist noch nicht optimal. Informieren Sie sich über die formatierte Ausgabe von double-Zahlen und gestalten Sie die Ausgabe so, dass es noch besser aussieht.

Testklasse

Damit man sich nicht ständig bei jedem Testlauf vier Parameter ausdenken muss, sollte man sich eine kleine Testklasse schreiben, welche diese Tests durchführt. BlueJ selbst bietet sogar solche Testunits an, aber mir persönlich ist dieses Verfahren zu kompliziert, ich schreibe mir immer meine eigenen Testklassen, zum Beispiel diese:

public class Test
{
    Gegenstand schwert, schild, trank;
    
    public Test()
    {
       schwert = new Gegenstand("Saurons Schwert des Gemetzels",150,78,3);
       schild  = new Gegenstand("Herrn Frodos Geheimnis",123,8,30);
       trank   = new Gegenstand("Sams Eierpunsch des Vergessens",10,0,-5);
       
       schwert.println();
       schild.println();
       trank.println();
    }
}
Aufgabe für alle Schüler:

Schreiben Sie eine Methode

public void beschaedigen(double prozent)

welche den Gegenstand um die angegebene Prozentzahl beschädigt.

Angenommen, ein Schwert mit dem Zustand 100 (also völlig neu und unbeschädigt) wird durch einen Kampf um 30% beschädigt. 30 Prozent von 100 sind 30, also müssen vom Zustand 30 abgezogen werden. Der neue Zustand ist dann 70.

Wird dieses Schwert mit dem Zustand 70 dann beim nächsten Kampf um 50% geschädigt, müssen 50% von 70 abgezogen werden, also 35. Danach hat das Schwert dann den Zustand 35. Im dritten Kampf wird das Schwert nochmals um 20% geschädigt. Jetzt müssen wir 20% von 35 abziehen, das sind 7. Also hat das Schwert nur noch den Zustand 28.

Übrigens leiden die anderen Attribute auch unter der Beschädigung. Ein Schwert mit dem Zustand 28 hat natürlich auch nur noch 28% des ursprünglichen Angriffswertes, Verteidigungswertes und Goldwertes.

Aufgabe für alle Schüler:

Schreiben Sie jetzt eine Methode

public void reparieren()

welche den Gegenstand wieder auf die ursprünglichen Werte setzt.

Angenommen, unser Schwert hat jetzt einen Zustand von 28. Mit welchem Faktor müssen wir die 28 multiplizieren, damit wir wieder auf 100 kommen? Ganz einfach, mit 100/28. Mit diesem Faktor müssen wir dann den Zustand und die anderen Attribute multiplizieren.