Adventuregame Folge 4

Der Rucksack des Helden

Wenn Sie die Folge 6 zum Thema Arrayliste bearbeitet haben, sind Sie auch bereit für die nächste Adventure-Folge. Heute wollen wir näher mit dem Helden und seinen Gegenständen beschäftigen.

Die Klasse Gegenstand sollte inzwischen über folgende Attribute und Methoden verfügen (falls nicht, ergänzen Sie die Klasse bitte entsprechend):

  • bezeichnung
  • angriffswert
  • verteidigungswert
  • goldwert
  • gewicht
  • zustand
  • bild

  • Gegenstand()
  • anzeigen()
  • beschaedigen(int prozent)
  • reparieren()
  • int reparaturKosten()
  • int gibTyp()
  • boolean istWaffe()
  • boolean istSchild()
  • boolean istRuestung()

Wir wollen nun eine neue Klasse Inventar entwickeln, die folgendes leisten soll:

Speicherung bzw. Verwaltung von mehreren Gegenständen. Stellen Sie sich z.B. einen Rucksack vor, den der Held sich auf den Rücken geschnallt hat. In diesen Rucksack (ein Objekt der Klasse Inventar) passen mehrere Gegenstände hinein, die der Held unterwegs aufgesammelt hat. Allerdings hat der Held nur eine bestimmte Stärke (ein neues Attribut für die Klasse Held), von der wiederum abhängt, wie schwer der Rucksack des Helden sein darf.

Die Klasse Inventar

Die Klasse Inventar kommt aber nicht nur beim Rucksack des Helden zur Anwendung. Auch Monster können mehrere Gegenstände mit sich herumschleppen, daher können wir sie ebenfalls mit einer Art Rucksack ausstatten. Unterwegs kann der Held auch mal auf eine Schatztruhe stoßen, die mehrere Gegenstände enthält. Und vielleicht kann sich der Held auch mal einen Schrank besorgen, in dem er Gegenstände, die er im Augenblick nicht herumtragen will, verstauen kann. Für all diese Zwecke können wir die gleiche Klasse Inventar einsetzen.

Attribute der Klasse Inventar

Die wichtigste Eigenschaft der Klasse Inventar besteht sicherlich in der Liste von Gegenständen, aus denen sich das Inventar zusammensetzt. Man könnte hier einen eigenen Array für 10, 20 oder mehr Objekte der Klasse Gegenstand programmieren oder - einfacher - auf eine ArrayList zurückgreifen. Der einzige Nachteil bei einer ArrayList ist das erforderliche Typecasting, wenn wir auf konkrete Gegenstände zurückgreifen wollen. Ein zweites Attribut der Klasse Inventar ist sicherlich das Gesamtgewicht aller enthaltenen Gegenstände. Bei einer Schatztruhe oder einem Schrank spielt diese Eigenschaft keine Rolle, wohl aber bei einem Rucksack.

Methoden der Klasse Inventar

Die beiden wichtigsten Methoden sind sicherlich diejenigen, mit denen wir einen Gegenstand in den Rucksack hineinpacken bzw. wieder herausholen. Die Methodenköpfe könnten dann so aussehen:

public void einpacken(Gegenstand neu)
public Gegenstand auspacken(String bezeichnung)

Der einpacken()-Methode übergeben wir ein Objekt der Klasse Gegenstand als Parameter. Wie und wo die Methode dann das Objekt in der ArrayList unterbringt, braucht uns an dieser Stelle nicht zu interessieren, es handelt sich hier um eine "interne Angelegenheit" der Methode. Wichtig ist, dass die Methode funktioniert so dass sich der Gegenstand nach Aufruf der Methode im Rucksack befindet - es sei denn, der Rucksack ist bereits voll, was bei der Implementation über eine ArrayList aber eher unwahrscheinlich ist.

Der auspacken()-Methode können wir keinen Parameter vom Typ Gegenstand übergeben, das wäre Unsinn. Wir übergeben stattdessen die Bezeichnung des Gegenstandes, den wir aus dem Inventar herausholen wollen, z.B. "Excalibur" oder "Glamdring". Als Rückgabeparameter der Funktion erhalten wir allerdings einen vollwertigen Gegenstand, genauer gesagt, ein Objekt der Klasse Gegenstand.

1 So sieht das UML-Diagramm des gegenwärtigen Spielstandes aus

Übung 4.1 (3 Punkte)

Erzeugen Sie erst einmal die neue Klasse Inventar und implementieren Sie eine einpacken()-Methode (1 Punkt) und eine anzeigen()-Methode (1 Punkt).

Wenn Sie sich für eine Direkt-Implementierung mit einem selbstgemachten Array von Gegenstands-Objekten entscheiden (siehe Referenz Arrays von Objekten), ist die anzeigen()-Methode recht einfach zu programmieren, da Sie kein Typecasting einsetzen müssen. Auch die einpacken()-Methode ist mit einem Array recht einfach zu programmieren.

Statten Sie dann Ihren Helden mit einem Inventar-Objekt rucksack aus, initialisieren Sie rucksack im Konstruktor des Helden, und ergänzen Sie die Klasse Held um eine Methode einpacken(), welche den Helden veranlasst, einen Gegenstand aufzunehmen und in seinen Rucksack zu legen.

Testen Sie dann die neuen Funktionen der Klasse Held in der Applet-Klasse Spiel. Wenn Sie sehen wollen, wie ein Testapplet aussieht, so klicken Sie bitte hier.

Übung 4.2 (2 oder 4 Punkte)

Programmieren Sie nun die auspacken()-Methode für die Klassen Inventar und Held. Die Köpfe beider Methoden sehen so aus:

public Gegenstand auspacken(String bezeichnung)

Testen Sie die beiden Klassen wieder mit Hilfe der Applet-Klasse Spiel. Hier können Sie sich wieder einen Beispiel-Quelltext herunterladen.

Lassen Sie den Helden sieben oder acht Gegenstände aufnehmen und anlegen. Legen Sie dann wahlweise bestimmte Gegenstände ab und überprüfen Sie den Rucksack. Lassen Sie auch Gegenstände ablegen, die gar nicht im Rucksack vorhanden sind. Es darf hier zu keiner Fehlermeldung kommen.

Falls Sie das Inventar mit Hilfe einer ArrayList implementiert haben, erhalten Sie für das Auspacken nur 2 Punkte, da Sie hier einfach mit dem Remove-Befehl arbeiten können. Haben Sie dagegen einen eigenen Array programmiert, so erhalten Sie 4 Punkte für das Auspacken, da hier die Gegenstände rechts neben dem zu entfernenden Gegenstand um je eine Position nach links rücken müssen.

Übung 4.3 (2 Punkte)

Wir hatten in Folge 2 des Abenteuerspiels bereits eine anlegen()- und ablegen()-Methode für den Helden programmiert. Die beiden Methoden bezogen sich auf die drei Attribute waffe, schild und ruestung des Helden. Jetzt hat der Held einen zusätzlichen Rucksack, der weitere Waffen, Schilder, Rüstungen und andere Gegenstände fassen kann. Mit einpacken()- und auspacken() kann man Gegenstände in den Rucksack hineinlegen bzw. wieder herausholen.

Programmieren Sie nun zwei Methoden

public void ausRucksackAnlegen(String bezeichnung)
public void inRucksackAblegen(int typ)

Mit der ersten Methode holt sich der Held eine Waffe, einen Schild oder eine Rüstung aus dem Rucksack und legt sie oder ihn an, und mit der zweiten Methode nimmt der Held seine Waffe, seinen Schild oder seine Rüstung, legt sie ab und packt sie in den Rucksack. Beide Methoden sind "Einzeiler", wenn Sie beim Programmieren geschickt vorgehen, daher gibt es auch nur je einen Punkt für jede Methode.

Übung 4.4 (2 Punkte + 1)

Sie sollen jetzt für den Helden eine verletzen()-Methode schreiben, die die Lebenspunkte des Helden um einen bestimmten Prozentsatz zurücksetzt und gleichzeitig die Waffe, den Schild und die Rüstung sowie den gesamten Rucksack des Helden beschädigt. Für die Klasse Inventar müssen Sie dazu erst noch eine beschaedigen()-Methode schreiben, da Sie auf die Gegenstände des Inventars nicht direkt zugreifen dürfen.

Da Sie im Grunde nichts Neues programmieren müssen, sondern nur bereits bekannten Quelltext neu zusammenstellen müssen, gibt es recht wenige Punkte für diese Aufgabe.

Für eine Methode heilen(), die alle Werte des Helden, seine Ausrüstung und die Gegenstände in seinem Rucksack wieder auf die alten Werte zurücksetzt (die Sie natürlich nicht zwischenspeichern dürfen - sonst gibt's keine Punkte), erhalten Sie einen weiteren Punkt.

Aufgabe 4.5 (4 Punkte)

Jetzt wird es etwas komplizierter. Der Held bekommt ein neues Attribut: staerke. Die Stärke des Helden entscheidet darüber, wieviel kg der Rucksack fassen darf. Dabei gilt eine ganz einfache Beziehung zwischen Stärke und maximalem Gewicht des Rucksacks: Die Stärke des Helden geht von 1 bis 10, entsprechend kann der Held einen 10 kg bis 100 kg schweren Rucksack tragen. Hat der Held - z.B. nach einer Beschädigung - eine Stärke von 4, so kann er einen 40 kg schweren Rucksack mit sich herumschleppen.

Die Klasse Inventar muss dazu natürlich entsprechend ergänzt werden, ebenso wie die Gegenstände jetzt unbedingt ein Attribut gewicht haben müssen. Denken Sie auch daran, dass sie dem Rucksack bei der Initialisierung mitteilen müssen, wie groß sein Maximalgewicht sein darf. Eine Methode zur Ermittlung des aktuellen Gesamtgewichts des Inventars wäre auch sehr sinnvoll

Aufgabe 4.6 (4 Punkte)

Diese Aufgabe können Sie erst lösen, wenn Sie das reguläre Kapitel 14 durchgearbeitet haben.

Organisieren Sie die Klasse Inventar nach dem Stack-Prinzip!

Diese HTML-Seite wurde erstellt von Ulrich Helmich am 4. Februar 2006





IMPRESSUM