1. Die Klasse Gegenstand
Für ein Abenteuerspiel wurde eine Klasse Gegenstand entwickelt. Bei einem solchen Gegenstand kann es sich beispielsweise um ein Schwert oder eine andere Waffe, einen Helm, einen Brustpanzer, einen Heiltrank oder Ähnliches handeln, wie es in Abenteuerspielen üblich ist.
1.1 Erster Entwurf
Hier sehen Sie einen ersten Entwurf der Klasse Gegenstand – natürlich noch nicht vollständig, aber für unsere Zwecke reicht er zunächst aus.
public class Gegenstand
{
String name;
int angriffswert, verteidigungswert, goldwert, zustand;
public Gegenstand(String n, int a, int v, int g)
{
name = n;
angriffswert = a;
verteidigungswert = v;
goldwert = g;
zustand = 100; // Prozent
}
public void anzeigen()
{
System.out.println("Bezeichnung:" + "\t\t" + name);
System.out.println("Angriffswert:" + "\t\t" + angriffswert);
System.out.println("Verteidigungswert:" + "\t" + verteidigungswert);
System.out.println("Goldwert:" + "\t\t" + goldwert);
System.out.println("Zustand:" + "\t\t" + zustand + "%");
}
}
In der anzeigen()-Methode wird übrigens reichlich Gebrauch von Tabulatoren gemacht. Wenn Sie in einen Ausgabe-String der Methode System.out.println() die Escape-Sequenz "\t" einfügen, wird an dieser Stelle ein Tabulator ausgegeben. Mithilfe solcher Tabulatoren kann man tabellarische Ausgaben in der Konsole übersichtlicher gestalten als durch das Einfügen mehrerer Leerzeichen.
In diesem Workshop wollen wir ein Array aus Objekten der Klasse Gegenstand implementieren und dieses Array in eine neue Klasse Inventar einbetten. Ein Held hat ja meistens einen Rucksack dabei, in dem er viele Gegenstände aufbewahrt. Die Klasse Inventar soll es ermöglichen, Rucksäcke, Schatzkisten, Schränke und andere "Behälter" zu modellieren, in denen jeweils mehrere Gegenstände aufbewahrt werden können.
2. Die Klasse Inventar
Ein Held hat in einem Abenteuerspiel meistens einen ziemlich großen Rucksack dabei, in den zahlreiche Gegenstände hineinpassen. Meistens steht auch irgendwo eine Schatztruhe oder ein Schrank herum, in denen verschiedene Gegenstände aufbewahrt werden können. Für solche Behälter wie Truhen, Rucksäcke oder Schränke wollen wir eine Klasse Inventar programmieren, die Objekte der Klasse Gegenstand verwaltet.
Hier sehen Sie den Quelltext der ersten Version einer solchen Inventar-Klasse:
public class Inventar
{
Gegenstand[] g;
public Inventar()
{
g = new Gegenstand[12];
g[ 0] = new Gegenstand("Hammer",20,3,567);
g[ 1] = new Gegenstand("Helm",0,13,230);
g[ 2] = new Gegenstand("Stiefel",4,10,177);
g[ 3] = new Gegenstand("Schwert",40,3,1234);
g[ 4] = new Gegenstand("Messer",20,1,12);
g[ 5] = new Gegenstand("Knieschoner",1,10,40);
g[ 6] = new Gegenstand("Schulterpanzer",0,12,564);
g[ 7] = new Gegenstand("Panzerkragen",0,13,120);
g[ 8] = new Gegenstand("Heiltrank",0,0,12);
g[ 9] = new Gegenstand("Krafttrank",4,0,34);
g[10] = new Gegenstand("Taschentuecher",0,0,2);
g[11] = new Gegenstand("Inhalator",4,0,5);
}
public void anzeigen()
{
for (int i=0; i < g.length; i++)
{
g[i].anzeigen();
System.out.println("---------------------------");
}
}
}
Hier sehen Sie die Klasse Inventar mit einem Array, das zwölf Objekte der Klasse Gegenstand enthält.
Als wir im vorherigen Workshop ein Array mit 100 Zufallszahlen erzeugt hatten, konnten wir die Belegung der Arrayelemente mithilfe einer for-Schleife recht schnell erledigen. In der for-Schleife wurde jedem einzelnen Arrayelement eine Zufallszahl zugewiesen; der Schleifenkörper bestand aus nur einer Anweisung.
Bei den zwölf Gegenständen in diesem Objektarray ist das nicht ganz so einfach, denn Namen und Werte der einzelnen Gegenstände können wir nicht so leicht mit einem Zufallsgenerator erzeugen. Wir müssen daher die Gegenstände einzeln erzeugen und dem entsprechenden Arrayelement zuweisen. Und das Ganze 12 mal wiederholen.
Bei der anzeigen()-Methode können wir aber wieder auf das bewährte Verfahren zurückgreifen: Wir setzen eine for-Schleife ein, die nacheinander für jedes Objekt im Array dessen anzeigen()-Methode aufruft. Der Ausdruck g[i] bezeichnet dabei jeweils das aktuell betrachtete Objekt der Klasse Gegenstand.
3. Übungen
Für ein Adventure-Game ist es wichtig, dass man verschiedene Typen von Gegenständen unterscheiden kann. Es ist zum Beispiel nicht gleichgültig, ob ein Gegenstand eine Waffe oder ein Heiltrank ist. Mit einer Waffe kann man angreifen, einen Heiltrank dagegen trinken. Nur wenn der Held ziemlich besoffen ist, greift er vielleicht auch mit der Heiltrankflasche an.
Übung 7.2-1 (4 Punkte)
Erweitern Sie die Klasse Gegenstand um ein Attribut, das den Typ des Gegenstandes speichert. Mögliche Typen sind beispielsweise:
- Waffe
- Schild
- Rüstung
- Trank
- Schmuck
- Sonstiges
Der Typ soll hier zunächst als int-Attribut der Klasse Gegenstand gespeichert werden. Dabei soll die Zahl 1 für eine Waffe, die Zahl 2 für einen Schild, die Zahl 3 für eine Rüstung und so weiter stehen.
g[4] = new Gegenstand("Messer",20,1,12,1);
g[5] = new Gegenstand("Knieschoner",1,10,40,3);
Erweitern Sie dazu den Konstruktor der Klasse Gegenstand um einen zusätzlichen Parameter und speichern Sie dessen Wert in einem neuen Attribut.
Erweitern Sie außerdem die anzeigen()-Methode der Klasse so, dass der Gegenstandstyp mit angezeigt wird, allerdings nicht als Zahl, sondern als passende Bezeichnung, beispielsweise als "Waffe".
Beachten Sie dabei den folgenden Kasten mit wichtigen Hinweisen.
Lösungsvorschlag auf den Seiten für Lehrer(innen) / Nähere Infos dazu
Direkte Initialisierung eines Arrays mit Werten
Ein Array kann auch direkt bei seiner Deklaration erzeugt und gleichzeitig mit Werten belegt werden. Hier ein Beispiel, das sich direkt auf die Übung 7.2-1 bezieht:
String[] typBezeichnung = {"Waffe", "Schild",
"Ruestung", "Trank",
"Schmuck", "Sonstiges"};
Auf diese Weise entsteht ein Array aus sechs Elementen des Datentyps String. Das Arrayelement mit dem Index 0 enthält den Wert "Waffe", das Arrayelement mit dem Index 1 den Wert "Schild" und so weiter.
In unserer Aufgabe werden die Gegenstandstypen allerdings mit den Zahlen 1 bis 6 codiert, während die Indizes des Arrays bei 0 beginnen. Deshalb muss beim Zugriff auf das Array vom Typwert 1 abgezogen werden. Enthält beispielsweise die Variable typ den Wert 3, kann die zugehörige Bezeichnung so ausgegeben werden:
System.out.println("Typ = " + typBezeichnung[typ - 1]);
In diesem Fall wird
Typ = Ruestung
in die Konsole geschrieben.
Übung 7.2-2 (4 Punkte)
Erweitern Sie die anzeigen()-Methode der Klasse Inventar um einen Parameter, mit dem Sie bestimmen können, welcher Typ von Gegenständen angezeigt werden soll.
anzeigen(1);
Mit diesem Methodenaufruf werden zum Beispiel nur die Waffen des Inventars angezeigt.
Lösungsvorschlag auf den Seiten für Lehrer(innen) / Nähere Infos dazu
Übung 7.2-3 (4 Punkte)
Erweitern Sie die Klasse Inventar um eine Methode, die es ermöglicht, einen weiteren Gegenstand hinzuzufügen:
public void hinzufuegen(Gegenstand neu)
Ändern Sie dazu zunächst die Größe des Arrays auf 20 Elemente. Die bisher vorhandenen zwölf Gegenstände sollen weiterhin beim Erzeugen eines Inventars angelegt werden; die restlichen acht Arrayelemente enthalten zunächst den Wert null.
Die Methode soll den neuen Gegenstand im ersten noch freien Arrayelement speichern. Wenn bereits alle 20 Arrayelemente mit Gegenständen belegt sind, soll nichts weiter geschehen. Eine Fehlermeldung wird von der Methode nicht ausgegeben.
Lösungsvorschlag auf den Seiten für Lehrer(innen) / Nähere Infos dazu
Übung 7.2-4 (4 Punkte)
Erweitern Sie die Klasse Inventar um eine sondierende Methode, welche die Goldwerte aller im Inventar vorhandenen Gegenstände addiert und den Gesamtwert zurückliefert.
public int gibGesamtwert()
Beachten Sie, dass nach der Erweiterung aus Übung 7.2-3 nicht mehr alle Arrayelemente zwingend ein Objekt enthalten.
Lösungsvorschlag auf den Seiten für Lehrer(innen) / Nähere Infos dazu
Übung 7.2-5 (6 Punkte)
Erweitern Sie das Projekt um eine Klasse Held. Ein Held soll einen Namen und Lebenspunkte besitzen. Außerdem sollen sein Angriffswert und sein Verteidigungswert gespeichert oder aus seiner Ausrüstung ermittelt werden.
Die Lebenspunkte sollen beim Erzeugen eines Helden folgendermaßen festgelegt werden:
Lebenspunkte = 80 + Zufallszahl zwischen 1 und 20
Ein Held, der in die weite Welt zieht, muss natürlich auch eine Ausrüstung mit sich führen. Dazu besitzt er einen Rucksack, in dem seine Gegenstände aufbewahrt werden.
Objekte der Klasse Held besitzen daher ein Attribut:
Inventar rucksack;
Die Ausrüstung des Helden soll aus zwei Waffen, einem Schild sowie drei weiteren Gegenständen bestehen, die nicht vom Typ "Waffe" oder "Schild" sind.
Der Angriffswert des Helden ergibt sich aus der Summe der Angriffswerte seiner beiden Waffen. Der Verteidigungswert ergibt sich aus dem Verteidigungswert des Schildes und den Verteidigungswerten aller Gegenstände vom Typ "Rüstung".
Schreiben Sie anschließend eine Methode für die Klasse Held, welche die Daten des Helden anzeigt und seine gesamte Ausrüstung auflistet.
Lösungsvorschlag auf den Seiten für Lehrer(innen) / Nähere Infos dazu
Das war es erst einmal mit dem kleinen Adventure-Game. In den folgenden Abschnitten dieses Kurses werde ich gelegentlich auf diese Thematik zurückkommen.
Zunächst wollen wir aber genauer verstehen, wie ein Objektarray aufgebaut ist und funktioniert. Dazu gibt es zwei Folgeseiten. Die erste Folgeseite beschäftigt sich mit den unbedingt wichtigen Grundlagen. Die zweite Folgeseite ist eher für die Experten unter Ihnen gedacht, die eine Klausur im Fach Informatik schreiben oder Informatik im Abitur wählen wollen.
Seitenanfang -
Weiter mit Objekt-Arrays verstehen...