Erste Schritte Projekt Zuul

Status
Nicht offen für weitere Antworten.
Diese Methode ist ja eine Methode der Klasse Raum. Also wird sie für einen ganz bestimmten Raum aufgerufen, also z.B. keller.gegenstaendeAnzeigen(); Sie gibt dann für genau diesen Raum die Gegenstände aus.
 
Das hilft mir leider nicht wirklich weiter.
Wie schreibe ich dann die Schleife?
Und wie wird die Information über den Gegenstand ausgegeben?

Ich bekomm das alles nicht zusammen hingeschrieben.

Code:
public void gegenstaendeAnzeigen()

{
   for(Gegenstand aktuellerGegenstand: gegenstaende){
    System.out.println(aktuellerGegenstand.keller.gegenstaendeAnzeigen());
}

Code:
public void gegenstaendeAnzeigen()

{
   for(Gegenstand aktuellerGegenstand: gegenstaende){
    System.out.println(aktuellerGegenstand.buero.gegenstaendeAnzeigen());
}

Ist Schwachsinn? Ich brauche mehr Hilfe.
 
Zuletzt bearbeitet:
Du brauchst hier keine Hilfe, du brauchst jemanden der dich mit dir hinsetzt und das Schritt für Schritt durchgeht und nicht hier das online Tutorium.
 
Ich kenne so eine Person leider nicht 🙁

Ein Tip wie ich es richtig machen kann?

Also die Aufgaben bisher habe ich auch ganz gut verstanden,
aber jetzt gibts ein neues Problem.
 
Ja, ok.^^ Ich gebe mir Mühe.
Das sehe ich. Aber mit dem Kopf durch die Wand ist es keine Lernmethode, wenn man sich das "Problemlösen" aneignen möchte.
Welche Schritte muss ich jetzt machen?
Das Verständnis für Programmabläufe aufbauen. Du hängst an dem selben Problem - wie man über eine Collection iteriert und etwas dediziert ausgibt - schon seit 3 Threads.
Wenn dieser Thread wieder 20 Seiten erreicht, dann ist es ein Zeichen für mich, dass das Thema nicht verstanden wurde, in zu große Brocken aufgeteilt wurde oder dieser
Post für privates Tutorium von der Community missbraucht wird.

Nochmal mein Rat zu diesen Aufgaben: Mach dir einen Plan. Setzt dich mit Stift und Papier hin und geh das Schritt für Schritt durch. Male oder formuliere die Vorgehensweisen aus und dann übertrag - nach abgeschlossener Planung - diese dann in Code.
Wenn es Probleme gibt bei der Umsetzung von Code, dann sieh bitte in Tutorials nach - oder besser in deinem Buch mit dem richtigem Kapitel - und versuch es zu verstehen. Erst wenn das sitzt, mach mit dem Coden weiter.

Deine Probleme sehen fast alle immer gleich aus:
Code:
* Iteriere über eine Collection
* Gib eine Eigenschaft des Objekts in der Collection aus
 
Zuletzt bearbeitet:
Ja. Um das zu sagen, muss ich noch nicht mal wissen, aus welcher Klasse die Codeschnipsel kommen (ich rate mal, es ist die Klasse "Raum"). Wie schon seit ca. 1 Jahr, programmierst du nicht, sondern rätst. Nach wie vor kann ich noch nicht mal ein Grundverständnis von objektorientierter Programmierung erkennen.
Fangen wir mal klein an. Welche Informationen bzw. Eigenschaften hat denn so ein Gegenstand, die man ausgeben könnte? Und gibt es schon eine Möglichkeit, an diese Eigenschaften ranzukommen, sprich, gibt es getter?
 
Welche Informationen bzw. Eigenschaften hat denn so ein Gegenstand, die man ausgeben könnte?

Beschreibung und Gewicht, Name könnte man noch hinzufügen.
Damit man über den Namen auf den Gegenstand zugreifen kann, das ist besser als jedes Mal eine
lange Beschreibung eingeben zu müssen.

Aber es soll einfach nur der Name "Buch" bzw. "Computer" ausgegeben werden, wenn der jeweilige Raum
betreten wird bzw. wenn man den Befehl "look" eingibt.
Andere Dinge wären dann eine andere Aufgabe.

Später sollen noch Dinge hinzugefügt werden, sodass man z.B. nur Gegenstände bis zu einem bestimmten
Gewicht aufheben kann etc. . Oder dass man nur soviele Gegenstände tragen kann, wie man
Tragkaft hat. Die Tragkraft wäre dann auch noch ein Attribut des Spielers(es müsste noch ne Klasse Spieler
hinzugefügt werden).
Oder dass man den Befehl "status" eingibt und alle Gegenstände die man gerade hat angezeigt werden
inklusive des Gewichts.
Aber eins nach dem anderen.

edit: Ich finde schon, dass sich diese Aufgabe stark von den anderen unterscheidet. Diesmal sollen nicht einfach alle Artikel oder was auch immer
ausgegeben werden, sondern es gibt unterschiedliche Räume...!
 
Zuletzt bearbeitet:
Schau mal in Kapitel 1.14 rein. Da geht es um eine Studentenverwaltung. Ruf dir mal das Projekt "lab-classes" auf und schau mal, wie das da funktioniert. In diesem Zusammenhang kannst du auch noch mal die Vorteile von BlueJ nachschauen, nämlich wie man eine Instanz erzeugt und eine Methode aufruft und dieser Parameter gibt. Ich könnte das als Bild schicken, werde aber deswegen keine Cloud aufmachen. Wenn du das verstanden hast, ist auch das aktuelle Beispiel keine Problem.
 
hm ich habe das Projekt "lab-classes" gar nicht.
In keinem Kapitel.

edit: mom. bei mir steht es auf Deutsch^^

Code:
for (Student student : studenten) {
            student.ausgeben();
        }
Meinst du diese Stelle? Ne andere Schleife gibt es in dem Projekt nicht.
Ich sehe keinen Zusammenhang zur aktuellen Aufgabe...
 
Zuletzt bearbeitet:
Hast du mal das Projekt inspiziert und mal getestet? Man legt darin eine Anzahl Studenten an mit Namen und Nummer und fügt diese dann Kursen hinzu. Das ist genauso, als ob du Gegenstände zu Räumen hinzufügst.
 
Code:
public void gegenstaendeAnzeigen()

{
   for(Gegenstand aktuellerGegenstand: gegenstaende){
    aktuellerGegenstand.();
}

Ist das bis hierhin richtig?
Es ist nicht das selbe, weil es ja unterschiedliche Räume gibt!

Code:
public void gegenstaendeAnzeigen()

{
   for(Gegenstand aktuellerGegenstand: gegenstaende){
    aktuellerGegenstand.gibBeschreibung();
}
Und jetzt ist das Problem, dass es einen Keller und ein Büro gibt!
Nicht das selbe!
 
Ich finde schon, dass sich diese Aufgabe stark von den anderen unterscheidet.
Das liegt wahrscheinlich daran, dass du nicht imstande bist, einmal gelerntes in einem ähnlichen Zusammenhang anzuwenden. Für dich ist wahrscheinlich eine Iteration über eine ArrayList<Gegenstand> was vollkommen anderes alsdie Iteration über eine ArrayList<Student>.
Diesmal sollen nicht einfach alle Artikel oder was auch immer
ausgegeben werden, sondern es gibt unterschiedliche Räume...
Ja, aber es gibt immer nur einen aktuellen Raum, und mit den darin enthaltten Gegenständen sollst du was machen: drüber iterieren und deren Eigenschaften ausgeben.
Wann fängst du an zu studieren?
 
Nicht dieselbe Instanz, aber dieselbe Klasse.
Verschiedenen Instanzen der Klasse Raum haben alle eine ArrayList<Gegenstand>, über die iteriert werden kann, um die Eigenschaften der Gegenstände auszugeben. Der Unterschied zwischen zwei verschiedenen Raum-Instanzen besteht lediglich darin, was in der Liste drin steht.
 
Code:
public void gegenstaendeAnzeigen()

{
   for(Gegenstand aktuellerGegenstand: gegenstaende){
    aktuellerGegenstand.gibBeschreibung();
}

Bis wohin ist der Code richtig?
 
Darauf habe ich gewartet. Was geschieht denn in der Schleife von Post #121? man kann das so beschreiben: Rufe für alle Objekte in "gegenstaende" die Methode "gibBeschreibung" auf, die in der Klasse "Gegenstand" deklariert ist. Also musst du vielleicht diese Methode dort hereinschreiben. Hättest du meinen Rat beherzigt, hättest du das längst ausprobieren können. Übrigens sollte man auch den Debugger nutzen, damit kann man schön sehen, was das Programm macht. Sollte dir das nichts sagen, der ist im Anhang des Buches erklärt.
 
Ja, es kommt aber noch ne Fehlermeldung.
Ohne die Fehlermeldung könnte ich das wenigstens testen...
ob in der Konsole alles richtig ausgegeben wird.
 
Ja, es kommt aber noch ne Fehlermeldung.
Ohne die Fehlermeldung könnte ich das wenigstens testen...

Das ist mindenstens dein 3.Thread der über 10 Seiten geht. Immer wieder schreibst du "es komm ne Fehlermeldung".
Jedesmal wirst du danach gefragt welche Fehlermeldung denn kommt.
-> Wenn du eine Fehlermeldung bekommst dann poste die Fehlermeldung und den dazugehörigen Code und lass uns nicht immer nachfragen.
 
Du könntest jetzt natürlich den Quellcode aller Klassen posten, damit man sehen kann, was passiert, wenn man "look" eingibt. Mit BlueJ geht es aber glücklicherweise auch anders. Lege zwei Instanzen von Gegenstand an. Erzeuge eine Instanz von Raum. Füge die Gegenstände in den Raum ein. Gibt "gibBeschreibung" das richtige aus? Wenn ja- Wird diese Methode überhaupt aufgerufen,wenn du "look" eingibst?
 
Lege zwei Instanzen von Gegenstand an. Erzeuge eine Instanz von Raum. Füge die Gegenstände in den Raum ein. Gibt "gibBeschreibung" das richtige aus? Wenn ja- Wird diese Methode überhaupt aufgerufen,wenn du "look" eingibst?

Es passiert nichts. Es werden keine Gegenstände angezeigt.

Klasse Spiel:
Code:
/**
*  Dies ist die Hauptklasse der Anwendung "Die Welt von Zuul".
*  "Die Welt von Zuul" ist ein sehr einfaches, textbasiertes
*  Adventure-Game. Ein Spieler kann sich in einer Umgebung bewegen,
*  mehr nicht. Das Spiel sollte auf jeden Fall ausgebaut werden,
*  damit es interessanter wird!
*
*  Zum Spielen muss eine Instanz dieser Klasse erzeugt werden und
*  an ihr die Methode "spielen" aufgerufen werden.
*
*  Diese Instanz dieser Klasse erzeugt und initialisiert alle
*  anderen Objekte der Anwendung: Sie legt alle Räume und einen
*  Parser an und startet das Spiel. Sie wertet auch die Befehle
*  aus, die der Parser liefert und sorgt für ihre Ausführung.
*
* @author  Michael Kölling und David J. Barnes
* @version 31.07.2011
*/

import java.util.ArrayList;

class Spiel
{
    private Parser parser;
    private Raum aktuellerRaum;
    private Gegenstand aktuellerGegenstand;
    private ArrayList<Gegenstand> gegenstaende;
  
    private Gegenstand buch;
    private Gegenstand computer;
  
      
    /**
     * Erzeuge ein Spiel und initialisiere die interne Raumkarte.
     */
    public Spiel()
    {
        raeumeAnlegen();
        parser = new Parser();
      
      
     
    }

    /**
     * Erzeuge alle Räume und verbinde ihre Ausgänge miteinander.
     */
    private void raeumeAnlegen()
    {
        Raum draussen, hoersaal, cafeteria, labor, buero, keller;
    
        // die Räume erzeugen
        draussen = new Raum("vor dem Haupteingang der Universität");
        hoersaal = new Raum("in einem Vorlesungssaal");
        cafeteria = new Raum("in der Cafeteria der Uni");
        labor = new Raum("in einem Rechnerraum");
        buero = new Raum("im Verwaltungsbüro der Informatik");
        keller = new Raum("im Keller");
      
        // die Ausgänge initialisieren
        draussen.setzeAusgang("east", hoersaal);
        draussen.setzeAusgang("south", labor);
        draussen.setzeAusgang("west", cafeteria);

        hoersaal.setzeAusgang("west", draussen);

        cafeteria.setzeAusgang("east", draussen);

        labor.setzeAusgang("north", draussen);
        labor.setzeAusgang("east", buero);

        buero.setzeAusgang("west", labor);
        buero.setzeAusgang("down", keller);
      
        keller.setzeAusgang("up", buero);
      
        //Gegenstände erzeugen
      
        buch = new Gegenstand("Buch", 150);
        computer = new Gegenstand("Computer", 1500);
        keller.addGegenstand(buch);
        buero.addGegenstand(computer);
      
      
      
      
      
        aktuellerRaum = draussen;  // das Spiel startet draussen
    }

    /**
     * Die Hauptmethode zum Spielen. Läuft bis zum Ende des Spiels
     * in einer Schleife.
     */
    public void spielen()
    {          
        willkommenstextAusgeben();

        // Die Hauptschleife. Hier lesen wir wiederholt Befehle ein
        // und führen sie aus, bis das Spiel beendet wird.
              
        boolean beendet = false;
        while (! beendet) {
            Befehl befehl = parser.liefereBefehl();
            beendet = verarbeiteBefehl(befehl);
        }
        System.out.println("Danke für dieses Spiel. Auf Wiedersehen.");
    }
   
    private void umsehen()
    {
        System.out.println(aktuellerRaum.gibLangeBeschreibung());
    }  
  
    private void essen()
    {
        System.out.println(aktuellerRaum.gibEssensBeschreibung());
    }  
  
  
    private void rauminfoAusgeben()
    {
      System.out.println("Sie sind " + aktuellerRaum.gibBeschreibung());
      System.out.print("Ausgänge: ");
      if (aktuellerRaum.gibAusgang("north") != null) {
          System.out.print("north ");
      }
      if(aktuellerRaum.gibAusgang("east") != null) {
          System.out.print("east ");
      }
      if(aktuellerRaum.gibAusgang("south") != null) {
          System.out.print("south ");
      }
      if(aktuellerRaum.gibAusgang("west") != null) {
          System.out.print("west ");
      }
      System.out.println();
    }
      
      
  
    /**
     * Einen Begrüßungstext für den Spieler ausgeben.
     */
    private void willkommenstextAusgeben()
    {
        System.out.println();
        System.out.println("Willkommen zu Zuul!");
        System.out.println("Zuul ist ein neues, unglaublich langweiliges Spiel.");
        System.out.println("Tippen sie 'help', wenn Sie Hilfe brauchen.");
        System.out.println();
        System.out.println(aktuellerRaum.gibLangeBeschreibung());
    }

    /**
     * Verarbeite einen gegebenen Befehl (führe ihn aus).
     * @param befehl Der zu verarbeitende Befehl.
     * @return 'true', wenn der Befehl das Spiel beendet, 'false' sonst.
     */
    private boolean verarbeiteBefehl(Befehl befehl)
    {
        boolean moechteBeenden = false;

        if(befehl.istUnbekannt()) {
            System.out.println("Ich weiss nicht, was Sie meinen...");
            return false;
        }

        String befehlswort = befehl.gibBefehlswort();
        if (befehlswort.equals("help")) {
            hilfstextAusgeben();
        }
        else if (befehlswort.equals("go")) {
            wechsleRaum(befehl);
        }
        else if (befehlswort.equals("look")) {
            umsehen();
        }
        else if (befehlswort.equals("eat")) {
            essen();
        }
        else if (befehlswort.equals("quit")) {
            moechteBeenden = beenden(befehl);
        }
        // ansonsten: Befehl nicht erkannt.
        return moechteBeenden;
    }

    // Implementierung der Benutzerbefehle:

    /**
     * Gib Hilfsinformationen aus.
     * Hier geben wir eine etwas alberne und unklare Beschreibung
     * aus, sowie eine Liste der Befehlswörter.
     */
    private void hilfstextAusgeben()
    {
        System.out.println("Sie haben sich verlaufen. Sie sind allein.");
        System.out.println("Sie irren auf dem Unigelände herum.");
        System.out.println();
        System.out.println("Ihnen stehen folgende Befehle zur Verfügung:");
        parser.zeigeBefehle();
    }

    /**
     * Versuche, in eine Richtung zu gehen. Wenn es einen Ausgang gibt,
     * wechsele in den neuen Raum, ansonsten gib eine Fehlermeldung
     * aus.
     */
    private void wechsleRaum(Befehl befehl)
    {
        if(!befehl.hatZweitesWort()) {
            // Gibt es kein zweites Wort, wissen wir nicht, wohin...
            System.out.println("Wohin möchten Sie gehen?");
            return;
        }

        String richtung = befehl.gibZweitesWort();

        // Wir versuchen, den Raum zu verlassen.
        Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung);

        if (naechsterRaum == null) {
            System.out.println("Dort ist keine Tür!");
        }
        else {
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }

    /**
     * "quit" wurde eingegeben. Überprüfe den Rest des Befehls,
     * ob das Spiel wirklich beendet werden soll.
     * @return 'true', wenn der Befehl das Spiel beendet, 'false' sonst.
     */
    private boolean beenden(Befehl befehl)
    {
        if(befehl.hatZweitesWort()) {
            System.out.println("Was soll beendet werden?");
            return false;
        }
        else {
            return true;  // Das Spiel soll beendet werden.
        }
    }
}

Klasse Raum:
Code:
import java.util.Set;
import java.util.HashMap;
import java.util.ArrayList;

/**
* Diese Klasse modelliert Räume in der Welt von Zuul.
*
* Ein "Raum" repräsentiert einen Ort in der virtuellen Landschaft des
* Spiels. Ein Raum ist mit anderen Räumen über Ausgänge verbunden.
* Für jeden existierenden Ausgang hält ein Raum eine Referenz auf
* den benachbarten Raum.
*
* @author  Michael Kölling und David J. Barnes
* @version 31.07.2011
*/

class Raum
{
    private String beschreibung;
    private HashMap<String, Raum> ausgaenge;        // die Ausgänge dieses Raums
    private Raum aktuellerRaum;
  
    private ArrayList<Gegenstand> gegenstaende;
  
  
  
    /**
     * Erzeuge einen Raum mit einer Beschreibung. Ein Raum
     * hat anfangs keine Ausgänge.
     * @param beschreibung enthält eine Beschreibung in der Form
     *        "in einer Küche" oder "auf einem Sportplatz".
     */
    public Raum(String beschreibung)
    {
        this.beschreibung = beschreibung;
        ausgaenge = new HashMap<String, Raum>();
        gegenstaende = new ArrayList<Gegenstand>();
      
      
    }
  
    public String gibBeschreibung()
    {
    return beschreibung;
    }  
  
    public void gegenstaendeAnzeigen()

    {
    for(Gegenstand aktuellerGegenstand: gegenstaende){
     aktuellerGegenstand.gibBeschreibung();
    }
  }
  
  
  
    public void addGegenstand(Gegenstand gegenstand)
    {
        gegenstaende.add(gegenstand);
      
    } 
 
  
    /**
     * Definiere einen Ausgang für diesen Raum.
     * @param richtung die Richtung, in der der Ausgang liegen soll
     * @param nachbar der Raum, der über diesen Ausgang erreicht wird
     */
    public void setzeAusgang(String richtung, Raum nachbar)
    {
        ausgaenge.put(richtung, nachbar);
    }
  
    
  
    /**
     * @return die kurze Beschreibung dieses Raums (die dem Konstruktor
     * übergeben wurde).
     */
    public String gibKurzbeschreibung()
    {
        return beschreibung;
    }

    /**
     * Liefere eine lange Beschreibung dieses Raums, in der Form:
     *     Sie sind in der Küche.
     *     Ausgänge: nord west
     * @return eine lange Beschreibung dieses Raumes.
     */
    public String gibLangeBeschreibung()
    {
        return "Sie sind " + beschreibung + ".\n" + gibAusgaengeAlsString();
    }
  
   public String gibEssensBeschreibung()
   {
       return "Sie haben nun gegessen und sind nicht mehr hungrig!";
   }  
  
  
    public String gibAusgaengeAlsString2()
    {
   
      
        String ergebnis = "Ausgänge: ";
     if (aktuellerRaum.gibAusgang("north") != null) {
        ergebnis += "north";
     if (aktuellerRaum.gibAusgang("east") != null) {
        ergebnis += "east";
     if (aktuellerRaum.gibAusgang("south") != null) {
        ergebnis += "south";
     if (aktuellerRaum.gibAusgang("west") != null) {
        ergebnis += "west"; 
    }
   }
   }
 
     
      
    }
      return ergebnis;
   }
  
    /**
     * Liefere eine Beschreibung der Ausgänge dieses Raumes,
     * beispielsweise
     * "Ausgänge: north west".
     * @return eine Beschreibung der Ausgänge dieses Raumes.
     */
    private String gibAusgaengeAlsString()
    {
        String ergebnis = "Ausgänge:";
        Set<String> keys = ausgaenge.keySet();
        for(String ausgang : keys)
            ergebnis += " " + ausgang;
        return ergebnis;
    }
    
    public Raum gibAusgang(String richtung)
    {
        return ausgaenge.get(richtung);
    }
  
  
    /**
     * Liefere den Raum, den wir erreichen, wenn wir aus diesem Raum
     * in die angegebene Richtung gehen. Liefere 'null', wenn in
     * dieser Richtung kein Ausgang ist.
     * @param richtung die Richtung, in die gegangen werden soll.
     * @return den Raum in der angegebenen Richtung.
     */
  
}

Klasse Gegenstand:
Code:
/**
* Beschreiben Sie hier die Klasse Gegenstand.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/
public class Gegenstand
{
    // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
    private int x;
  
    private String gegenstandBeschreibung;
  
    private int gegenstandGewicht;
  
    private String beschreibung;

    /**
     * Konstruktor für Objekte der Klasse Gegenstand
     */
    public Gegenstand(String beschreibung, int gewicht)
    {
        this.gegenstandBeschreibung = beschreibung; // Instanzvariable initialisieren
        this.gegenstandGewicht = gewicht;
        x = 0;
    }
   
  
    public String gibBeschreibung()
    {
    return beschreibung;
    }  
  
  
  
     /**
     * Ein Beispiel einer Methode - ersetzen Sie diesen Kommentar mit Ihrem eigenen
     *
     * @param  y    ein Beispielparameter für eine Methode
     * @return        die Summe aus x und y
     */
    public int beispielMethode(int y)
    {
        // tragen Sie hier den Code ein
        return x + y;
    }
}

https://imgur.com/a/J5kJb
Es müsste stehen: Sie sind im Keller. Im Keller ist ein Buch.

Aber die Gegenstände erscheinen nicht.
 
Zuletzt bearbeitet:
1. Deine Methode gibBeschreibung der Gegenstand-Klasse gibt den Wert der Variablen "beschreibung" zurück. Diese Variable wird aber nirgendwo initialisiert, nur die Variable "gegenstandBeschreibung".
2. Selbst wenn aktuellerGegenstand.gibBeschreibung() etwas zurückgeben würde: in deiner gegenstaendeAnzeigen()-Methode der Raum-Klasse machst du mit den Rückgabewerten von aktuellerGegenstand.gibBeschreibung() gar nix. Du iterierst über die Gegenstände, holst die Beschreibung des Gegenstandes, machst damit aber nichts, gehst dann zum nächsten Gegenstand, machst mit dem Rückgabewert wieder nichts, usw. bis alle Gegenstände durchlaufen sind.
3. Selbst wenn aktuellerRaum.gegenstaendeAnzeigen() etwas sinnvolles tun würde, wird diese Methode gar nicht aufgerufen. Die Methode "umsehen" der Spiel-Klasse gibt nach wie vor nur den Rückgabewert von aktuellerRaum.gibLangeBeschreibung() aus.
So, und jetzt bitte wieder deine Standardfrage "Und wie löse ich das Problem ?".
 
1. Die Variable "beschreibung" wird doch initialisiert? Klasse Gegenstand.
Code:
 private String beschreibung;

2.
Wie schreibe ich die Methode gegensteandeAnzeigen() ? In der Klasse Raum.

Code:
public void gegenstaendeAnzeigen()

    {
    for(Gegenstand aktuellerGegenstand: gegenstaende){
     aktuellerGegenstand.gibBeschreibung.keller.gegenstaendeAnzeigen();
    }
  }

Was muss ich machen, damit eben im KELLER etwas ausgegeben wird? Ein Buch?
Das ist so falsch. Was muss in dieser Methode getan werden? Das ist das Hauptproblem!

3. Wie und an welcher Stelle muss ich aktuellerRaum.gegenstaendeAnzeigen() aufrufen,
in der Spiel Klasse?


Code:
private void umsehen()
    {
        System.out.println(aktuellerRaum.gibLangeBeschreibung());
        System.out.println(aktuellerRaum.gegenstaendeAnzeigen());
}


So? Jetzt müsste beim Befehl "look" , Methode umsehen() also, die Methode
gegenstaendeAnzeigen() aus der Klasse Raum aufgerufen werden.
Bleibt das Hauptproblem, wie ich gegenstaendeAnzeigen() schreiben soll!

Sind meine Gedanken so richtig?
 
Zuletzt bearbeitet:
Die Variable "beschreibung" wird doch initialisiert? Klasse Gegenstand.
Nein *riesenseufzer*. Die Variable wird lediglich deklariert. Sie bekommt nie einen Wert.
Sind meine Gedanken so richtig?
Die Gedanken eventuell, aber für den resultierenden Code gibt es 0 von 10 möglichen Punkten. Das ist kein Programmieren, sondern nur rumraten.
Z. B. hat aktuellerRaum.gegenstaendeAnzeigen() keinen Rückgabewert, den man mit System.out.println() ausgeben könnte.
Wann fängst du endlich an zu studieren?
 
Code:
public Gegenstand(String beschreibung, int gewicht)
    {
        this.gegenstandBeschreibung = beschreibung; // Instanzvariable initialisieren
        this.gegenstandGewicht = gewicht;
        this.beschreibung = beschreibung;
        x = 0;
    }

So?
Oder auch noch im Konstruktor nen Parameter schreiben?

1. Schritt jetzt: Wie schreibe ich gegenstaendeAnzeigen() ? (Klasse Raum)
Ich weiss es nicht, wie man sieht -.-

Ich müsste erst ne Ausbildung zum FIAE machen, dieses Jahr nicht mehr.
 
Schreibe dir eine Methode gibGegenstaendeAlsString, und baue die so ähnlich auf wie gibAusgaengeAlsString() mit einem String als Rückgabewert.
Wie lange dauert die Ausbildung zum FIAE?
 
Das hast du falsch verstanden. Wann beschäftigst du dich mit Java so, dass du verstehst, was du machst? Das ist die Frage. Ich kann die sagen, dass ich mindestens fünf Sprachen quasi im Alleingang gelernt habe. Sprachen, von denen heute kaum mehr einer spricht, wie Basic und Forth. Auch die gesamte Java-Sache habe ich mir weitgehend im Selbststudium angeeignet. ich hatte zwar Vorkenntnisse, aber die kamen auch aus der Selbstedukation. Das Buch, das du hast, ist echt gut. Lese es, probiere es durch von Anfang an und lese parallel auch die Insel.
 
Schreibe dir eine Methode gibGegenstaendeAlsString, und baue die so ähnlich auf wie gibAusgaengeAlsString() mit einem String als Rückgabewert

Code:
private String gibAusgaengeAlsString()
    {
        String ergebnis = "Ausgänge:";
        Set<String> keys = ausgaenge.keySet();
        for(String ausgang : keys)
            ergebnis += " " + ausgang;
        return ergebnis;
    }

Ja, ich muss erstmal verstehen was gemacht wird, stimmt.
Eine Aufgabe im Buch ist auch zu beschreiben was diese Methode macht....die habe ich ausgelassen -.-
Was wird da gemacht? Ich weiss es nicht.
 
Was ich eigentlich wissen wollte, war, wie lange der TE noch Ressourcen in ein offensichtlich sinnloses Unterfangen stecken will.
Ich weiss nicht, was in der Ausbildung zum FIAE oder im Studium gefordert wird, bzw. wie viel man da mit Auswendiglernen reissen kann. Sobald es nämlich ans Verstehen geht, wird der TE ziemlich schnell ziemlich frustrierende Erfahrungen machen. Es ist eine Sache, wenn man über Monate in einem Forum immer wieder zu hören bekommt, dass man fürs Programmieren ziemlich unbegabt ist, aber eine ganz andere, wenn einem sowas im realen Leben vermittelt wird.
Was wird da gemacht? Ich weiss es nicht.
Sowas meine ich. Du hast den Code vor Augen, aber verstehst ihn nicht. Wie willst du jemals eine Klausur oder eine Prüfung bestehen?
 
Code:
private String gibAusgaengeAlsString()
    {
        String ergebnis = "Ausgänge:";
        Set<String> keys = ausgaenge.keySet();
        for(String ausgang : keys)
            ergebnis += " " + ausgang;
        return ergebnis;
    }

Ja, ich muss erstmal verstehen was gemacht wird, stimmt.
Eine Aufgabe im Buch ist auch zu beschreiben was diese Methode macht....die habe ich ausgelassen -.-
Was wird da gemacht? Ich weiss es nicht.
Hier ne winzige Erklärung:
String ergebnis = "Ausgänge:";
Hier initialisierst du den String ergebnis mit "Ausgänge:". Das heißt der String ergebnis hat den Wert "Ausgänge:". Soweit so gut.
Set<String> keys = ausgaenge.keySet();
Hier legst du eine Collection an, also eine Liste vom Typ String. Du kannst dieser Liste verschiede Strings hinzufügen um sie dann beispielsweise, da wären wir auch schon beim nächsten Abschnitt, mit einer for-each Schleife auszugeben.for(String ausgang : keys) ergebnis += " " + ausgang;
Hier sagst du praktisch. Für jeden ausgang von der Liste keys soll ergebnis ein Leerzeichen und ausgang zugewiesen werden.
mit return ergebnis; gibst du das ergebnis als Rückgabewert der Methode zurück. Und diesen Rückgabewert musst do wohl irgenwo benutzen müssen. Wo genau dass kann ich dir auch nicht sagen.
 
Code:
private String gibGegenstaendeAlsString()
    {
          String ergebnis = "Ausgänge";
          Set<String> gegenstaende = ausgaenge.keySet();
          for(String aktuellerGegenstand : gegenstaende)
               ergebnis += " " + aktuellerGegenstand;
          return ergebnis; 
    }

Falsch oder?

Wie schreibe ich nun die Methode richtig?

Code:
ausgaenge.keySet();

Woher der Name ausgaenge? Die Ausgänge dieses Raums?
Was macht die Methode keySet() ?


Code:
ergebnis += " " + aktuellerGegenstand;
Das heisst doch: ergebnis = ergebnis " " + aktuellerGegenstand ?
 
Was macht die Methode keySet() ?

JavaDocs lesen!
https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

Das heisst doch: ergebnis = ergebnis " " + aktuellerGegenstand ?

Verweis auf: https://de.wikibooks.org/wiki/Java_Standard:_Operatoren
Und zwar schau dir mal Zuweisungsoperatoren an

Zitat: += Addiert einen Wert zu der angegebenen Variablen

Im Fall von Strings:
Java:
String s1 = "Hallo";
String s2 = "Welt";

// Kurzschreibweise
s1 += " " + s2;
System.out.println(s1); // Ergebnis: Hallo Welt

// gleiches Ergebnis, nur ausführlicher geschrieben:
s1 = s1 + " " + s2;
System.out.println(s1); // Ergebnis: Hallo Welt

Hier wird s2 an s1 angehängt (inkl. eines Leerzeichen....)



Aber das sollte Basicwissen sein....Solltest du bereits damit Probleme haben, dann empfehle ich dir, dich nochmal richtig hinzusetzen und die Basics zu lernen.

Edit:
In meinen Augen versuchst du etwas zu lösen, was mit deinen Kenntnisstand nicht machbar ist. Suche dir vielleicht jemanden, der dich an die Hand nimmt.
 
Zuletzt bearbeitet:
Das heisst doch: ergebnis = ergebnis " " + aktuellerGegenstand ?
Das ist Käse. Mit einem weiteren Pluszeichen wirds aber richtig.
Woher der Name ausgaenge? Die Ausgänge dieses Raums?
Was macht die Methode keySet() ?
Soll die Frageform andeuten, dass du vergessen hast, was "ausgaenge" ist? Deine Ausbilder bzw. Kommilitonen tun mir jetzt schon leid.
ausgaenge ist eine HashMap<String, Raum>. keySet() ist eine in der Klasse HashMap definierte Methode, die ein Set mit den Schlüsseln aus der HashMap zurückliefert. Hast du jemals einen Blick in die Java-API-Dokumentation (https://docs.oracle.com/javase/8/docs/api/) geworfen?
dann empfehle ich dir, dich nochmal richtig hinzusetzen und die Basics zu lernen
Gute Empfehlung. Die hat er wohl schon 100 Mal bekommen. Umgesetzt hat er sie aber offensichtlich bisher nicht.
Eigentlich kann niemand hier im Forum so richtig sagen, wie, wann und wieviel der TE "lernt". Sein "lernen" scheint darin zu bestehen, Aufgaben aus dem BlueJ Buch zu lesen, nicht zu verstehen, hier zu posten, dann nach mehreren hundert Beiträgen mit viel Mühe eine Lösung zu bekommen, und dann bei einem ähnlichen Problem wieder ganz von vorne anzufangen. Also "learning by doing" im Sinne von "not learning by let others do".
 
HashMap<String, Raum>

String ist der Typ der Objekte der in der Map sein soll, und Raum ist der Typ des Schlüssels.
Beide Typen können auch gleich sein!

Code:
private String gibGegenstaendeAlsString()
    {
          String ergebnis = "Ausgänge";
          Set<String> gegenstaende = ausgaenge.keySet();
          for(String aktuellerGegenstand : gegenstaende)
               ergebnis += " " + aktuellerGegenstand;
          return ergebnis;
    }

Wie schreibe ich nun die Methode?
 
HashMap<String, Raum>

String ist der Typ der Objekte der in der Map sein soll, und Raum ist der Typ des Schlüssels.
Beide Typen können auch gleich sein!

Code:
private String gibGegenstaendeAlsString()
    {
          String ergebnis = "Ausgänge";
          Set<String> gegenstaende = ausgaenge.keySet();
          for(String aktuellerGegenstand : gegenstaende)
               ergebnis += " " + aktuellerGegenstand;
          return ergebnis;
    }

Wie schreibe ich nun die Methode?

Hey,

es scheint als hättest du das Prinzip einer Map NICHT verstanden. In diesem Fall ist String der Typ des Keys und Raum der Typ des Values. Auch die Aussage "String ist der Typ der Objekte der in der Map sein soll" ist komplett sinnbefreit.

Mit freundlichen Grüßen
Sasuke
 
Ich habe das im Buch nachgeschlagen, es war nicht eindeutig formuliert.

Der Schlüssel wird an die get-Methode übergeben um den Wert zu bekommen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben