Home > Informatik > Stufe EF > Folge 7 (Arrays)

7.2 Objekt-Arrays

Arrays - Objekt-Arrays - verstehen - Held

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 handeln, oder um einen Helm, einen Brustpanzer, einen Heiltrank oder Ähnliches, wie es eben in Abenteuerspielen üblich ist.

Hier ein erster 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 den Ausgabe-String des System.out.println-Befehls den Teilstring "\t" einbauen, so wird an dieser Stelle ein Tabulator eingefügt. Mithilfe solcher Tabulatoren kann man die Darstellung in der Konsole wesentlich übersichtlicher gestalten als mithilfe von Leerzeichen.

In dem diesem Workshop wollen wir einen Array aus Objekten der Klasse Gegenstand implementieren und diesen 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 erzeugen, in denen jeweils mehrere Gegenstände aufbewahrt werden können.

Die Klasse Inventar

Hier zunächst der (provisorische) Quelltext einer solchen 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("Taschentücher",0,0,2);   
       g[11] = new Gegenstand("Inhalator",4,0,5);           
    }
    
    public void anzeigen()
    {
       for (int i=0; i<=11; i++)
       {
          g[i].anzeigen();
          System.out.println("---------------------------");
       }
    }
}

Hier sehen Sie die Klasse Inventar mit zwölf Gegenständen.

Als wir im vorherigen Workshop einen Array mit 100 Zufallszahlen erzeugt hatten, konnten wir das mit Hilfe einer for-Schleife recht schnell erledigen. In der Schleife wurde jedem einzelnen Arrayelement eine Zufallszahl zugeweisen; der Schleifenkörper bestand aus nur einer Anweisung.

Mit den 12 Gegenständen in dem Objektarray ist das nicht ganz so einfach zu erledigen, denn die Namen und Werte der einzelnen Gegenstände können wir nicht so leicht mit einem Zufallsgenerator erzeugen. Wir müssen jeden Gegenstand individuell erstellen, und das Ganze 12 mal.

Bei der anzeigen()-Methode können wir aber wieder auf das bewährte Verfahren zurückgreifen; wir setzen also eine for-Schleife ein, die nacheinander die anzeigen()-Methoden der einzelnen Arrayelemente g[i] aufruft.

Ü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 ist oder ein Heiltrank. Mit einer Waffe kann man angreifen, einen Heiltrank dagegen trinken.

Ü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:

  1. Waffe
  2. Schild
  3. Rüstung
  4. Tränke
  5. Schmuck
  6. Sonstiges

Der Typ soll hier als int-Attribut der Klasse Gegenstand gespeichert werden. Erweitern Sie die Ausgabe-Methode der Klasse so, dass auch der Typ angezeigt wird, allerdings nicht als Zahl, sondern als String wie "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

Einen Array kann man auch direkt bei der Deklaration initialisieren und auch gleich mit Werten füllen. Hier ein Beispiel, das sich direkt auf die Übung 7.2-1 bezieht:

   String[] typBezeichnung = {"Waffe", "Schild", 
                              "Ruestung", "Traenke", 
                              "Schmuck", "Sonstiges"};

Auf diese Weise entsteht ein Array aus sechs String-Werten. Das Arrayelement mit dem Index 0 hat dann den Wert "Waffe", das Arrayelement mit dem Index 1 den Wert "Schild" und so weiter.

Mit einem Befehl wie

System.out.println("Typ = " + typBezeichnung[2]);

wird dann zum Beispiel der String

Typ = Ruestung

in die Konsole geschrieben.

Übung 7.2-2 (4 Punkte)

Erweitern Sie die die anzeigen-Methode der Klasse Inventar um einen Parameter, mit dem Sie bestimmen können, welcher Typ von Gegenständen angezeigt werden soll. Mit

anzeigen(1);

werden zum Beispiel nur alle 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 Inventarum eine Methode, die es ermöglicht, einen weitern Gegenstand hinzuzufügen:

public void hinzufuegen(Gegenstand neu)

Das Inventar soll maximal 20 Gegenstände aufnehmen können.

Lösungsvorschlag auf den Seiten für Lehrer(innen) / Nähere Infos dazu

Übung 7.2-4 (4 Punkte)

Erweitern Sie die Klasse Inventarum eine Methode, die den Gesamtwert (in Gold) des Inventars anzeigt.

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. Der Held soll einen Namen, einen Angriffswert und einen Verteidigungswert haben, außerdem Lebenspunkte. Die Lebenspunkte sollen folgendermaßen festgelegt werden:

Lebenspunkte = 80 + zufälliger Wert zwischen 1 und 20

Ein Held, der in die weite Welt zieht, muss natürlich auch eine Ausrüstung mit sich führen. Dazu gibt es einen Rucksack, in den er alle Gegenstände einpackt.

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 berechnet sich dann aus der Summe der Angriffswerte der beiden Waffen, der Verteidigungswert ist die Summe des Verteidigungswertes des Schildes sowie der Verteidigungswerte aller Rüstungs-Gegenstände.

Schreiben Sie dann eine Methode für die Klasse Held, welche die Attribute des Helden anzeigt sowie die Ausrüstung des Helden auflistet.

Lösungsvorschlag auf den Seiten für Lehrer(innen) / Nähere Infos dazu

Das war es erst mal mit dem kleinen Adventure-Game. In den folgenden Abschnitten dieses Kurses werde ich immer wieder auf diese Thematik zurückkommen, die sich also wie ein roter Faden durch den Kurs ziehen wird. Bevor wir damit weitermachen, wollen wir aber erst einmal verstehen, wie ein Objekt-Array überhaupt 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 wollen oder gar Informatik im Abitur wählen wollen.

Seitenanfang -
Weiter mit Objekt-Arrays verstehen...