Erste Schritte Zuul - 2ten Befehl einführen

Status
Nicht offen für weitere Antworten.

Devanther

Top Contributor
Hallo,

ich wollte fragen, wie ich einen 2ten Befehl implementieren kann.
Man soll eingeben können "take buch", "take computer" etc um einen Gegenstand
hochzuheben. Bisher habe ich immer nur einen Befehl implementieren müssen.

Außerdem muss die Methode public Gegenstand gegenstand(String name) verbessert werden.

Was passieren soll: im aktuellen Raum wird ein Gegenstand mit passendem Namen gesucht. Wenn einer gefunden wird, wird der Gegenstand (NICHT der name des Gegenstandes) dem Spieler übergeben. Der schaut, ob er einen Gegenstand mit dem dem gleichen Namen schon hat, und falls nein, nimmt er ihn auf.


Code:
public Gegenstand gegenstand(String name)
    {
         for(Gegenstand aktuellerGegenstand: gegenstaende){
              if (aktuellerGegenstand.gibName() .equals (name)) {
                  System.out.println("Sie haben den Gegenstand hochgehoben!");
                  return aktuellerGegenstand;
              }
         }
         System.out.println(" Es gibt keine Gegenstände im Raum");
         return null;
    }

Code:
 gegenstaende.add(gegenstand);

Man müsste beides irgendwie verbinden...ich schaff es alleine leider nicht -.-
Habe stundenlang nachgedacht, ich krieg die Formel nicht zusammen.

Wäre gut wenn jemand helfen könnte!
 

Devanther

Top Contributor
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;
  
    private Spieler spieler;
    private String gegenstand;
    private String Gegenstand;
  
    private String name;
  
  
      
    /**
     * Erzeuge ein Spiel und initialisiere die interne Raumkarte.
     */
    public Spiel()
    {
        raeumeAnlegen();
        parser = new Parser();
        this.name = name;
      
     
    }

    /**
     * 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());
        System.out.println(aktuellerRaum.gibGegenstaendeAlsString());
    }  
  
    private void essen()
    {
        System.out.println(aktuellerRaum.gibEssensBeschreibung());
    }  
  
    private void befehlTake()
    {
     System.out.println(aktuellerRaum.gegenstand(name));
    }  
  
 
  
    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("take")) {
            befehlTake();
        }
        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;
  
    private String name;
  
    private String gegenstand;
  
    /**
     * 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>();
        this.name = name;
      
    }
  
    public String gibBeschreibung()
    {
    return beschreibung;
    }  
   
  
     public Gegenstand gegenstand(String name)
    {
         for(Gegenstand aktuellerGegenstand: gegenstaende){
              if (aktuellerGegenstand.gibName() .equals (name)) {
                  System.out.println("Sie haben den Gegenstand hochgehoben!");
                  return aktuellerGegenstand;
              }
         }
         System.out.println(" Es gibt keine Gegenstände im Raum");
         return null;
    }
 
  
    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 String gibGegenstaendeAlsString()
    {      
      String ergebnis = "";        
      for(Gegenstand aktuellerGegenstand : gegenstaende)
        ergebnis += " " + aktuellerGegenstand.gibBeschreibung();
          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 Befehl:
Code:
/**
* Objekte dieser Klasse halten Informationen über Befehle,
* die der Benutzer eingegeben hat. Ein Befehl besteht momentan
* aus zwei Zeichenketten: einem Befehlswort und einem zweiten
* Wort. Beim Befehl "nimm karte" beispielsweise sind die beiden
* Zeichenketten "nimm" und "karte".
*
* Befehle werden von Benutzern dieser Klasse auf Gültigkeit
* überprüft. Wenn ein Spieler einen ungültigen Befehl eingegeben
* hat (ein unbekanntes Befehlswort), dann ist das Befehlswort <null>.
*
* Wenn der Befehl nur aus einem Wort bestand, dann ist das
* zweite Wort <null>.
*
* @author  Michael Kölling und David J. Barnes
* @version 31.07.2011
*/

class Befehl
{
    private String befehlswort;
    private String zweitesWort;

    /**
     * Erzeuge ein Befehlsobjekt. Beide Wörter müssen angegeben werden,
     * aber jedes oder beide dürfen 'null' sein.
     * @param erstesWort Das erste Wort des Befehls. Sollte
     *                   'null' sein, wenn dieser Befehl als nicht
     *                   vom Spiel erkannt gekennzeichnet werden soll.
     * @param zweitesWort Das zweite Wort des Befehls.
     */
    public Befehl(String erstesWort, String zweitesWort)
    {
        befehlswort = erstesWort;
        this.zweitesWort = zweitesWort;
    }

    /**
     * Liefere das Befehlswort (das erste Wort) dieses Befehls.
     * Wenn der Befehl nicht verstanden wurde, ist das Ergebnis
     * 'null'.
     * @return das Befehlswort.
     */
    public String gibBefehlswort()
    {
        return befehlswort;
    }

    /**
     * @return Das zweite Wort dieses Befehls. Liefere 'null', wenn
     * es kein zweites Wort gab.
     */
    public String gibZweitesWort()
    {
        return zweitesWort;
    }

    /**
     * @return 'true', wenn dieser Befehl nicht verstanden wurde.
     */
    public boolean istUnbekannt()
    {
        return (befehlswort == null);
    }

    /**
     * @return 'true', wenn dieser Befehl ein zweites Wort hat.
     */
    public boolean hatZweitesWort()
    {
        return (zweitesWort != null);
    }
}

Code:
private void befehlTake()
    {
     System.out.println(aktuellerRaum.gegenstand(name));
    }
Aus der Klasse Spiel, ruft die Methode die ich oben gepostet habe auf.
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Du gehst offenbar davon aus, dass sich jemand, der helfen will, selber durch die Klassen kämpft, um herauszufinden, was mit "Befehl eingeben" überhaupt gemeint ist, und wie die Logik von Zuul überhaupt funktioniert. Hilfreicher wäre es sicherlich, den Leser etwas ausführlicher darüber zu informieren, worum es geht.
Hinweise aus früheren Beiträgen hast du ignoriert. Die Klasse "Spiel" hat sinnloserweise immer noch die Variablen ArrayList<Gegenstand> gegenstaende, String gegenstand, String Gegenstand, und Gegenstand aktuellerGegenstand.
Bisher habe ich immer nur einen Befehl implementieren müssen.
Das ist sachlich falsch. S. die Methode "wechsleRaum".
Außerdem muss die Methode public Gegenstand gegenstand(String name) verbessert werden
Das ist KEINE Fehlerbeschreibung. Woran hakt es denn bisher? In einem deiner früheren Threads hast du angegeben, dass an einer Stelle im Code eine NullPointerException fliegt. Meine Vermutung ist, dass die gibName()-Methode der Gegenstand-Klasse null (also einen nicht initialisierten String) zurückgibt, aber um das zu überprüfen, müsste man den Code der Klasse kennen.
Der Befehl "back" aus einem früheren Thread ist immer noch nicht implementiert. Schliesse doch erstmal eine Aufgabe ab, bevor du dich einer neuen widmest (aber das wurde dir auch schon mehrfach gesagt).
 

DaCrazyJavaExpert

Bekanntes Mitglied
Habe stundenlang nachgedacht, ich krieg die Formel nicht zusammen.
Ich hoffe das stimmt. Wenn es stimmt, dann behalte es dir bei.
Ich verstehe dein erstes Problem nicht so wirklich.
Zu deinem zweiten sag ich dir jetzt einfachmal das, was ich verstanden habe.
Java:
public Gegenstand gegenstand(String name)

    {

         for(Gegenstand aktuellerGegenstand: gegenstaende){

              if (aktuellerGegenstand.gibName() .equals (name)) {

                  System.out.println("Sie haben den Gegenstand hochgehoben!");

                  return aktuellerGegenstand;

              }

         }

         System.out.println(" Es gibt keine Gegenstände im Raum");

         return null;
Java:
gegenstaende.add(gegenstand);
}
Also du willst füe jeden gegenstand in deiner HashMap wissen ob er dem Gegenstand im Raum gleich ist!? Das hast du schonmal richtig soweit ich es verstehe. Und du willst jetzt, falls der Gegenstand ihm nicht gleich ist was machen? Hier mal der Code wie ich es machen würde nach meinem Verständis deines Problems, mit Kommentaren.
Java:
//deine Methode die irgendwas macht
public Gegenstand gegenstand(String name) {
//du gehst jeden Gegebstand in deiner HashMap durch...
for(Gegenstand aktuellerGegenstand : gegenstaende) {
//...und prüfst ob der Gegenstand in der Liste dem im Raum(?) gleich ist.
if(aktuellerGegenstand.gibName().equals(name)) {
//Wenn ja wird der gegenstand aufgehoben...
System.out.println("Sie haben den Gegenstand hochgehoben!");
return aktuellerGegenstand;
} else {
//...,wenn nein dann gibst du aus, dass der Gegenstand nicht vorhanden ist und gibst nichts zurück.
System.out.println(" Es gibt keine Gegenstände im Raum");
return null;
}
}
gegenstaende.add(gegenstand);
Ich weiß nicht ob ichs richtig interpretiert habe, aber so sieht das schon mal logischer aus. Und wolltest du die Befehle genau andersrum ausführen lassen? Also wenn Gegenstand schon in der Map vorhanden ist nicht einsammeln und wenn noch nicht vorhanden einsammeln und der Map hinzufügen?
 

Devanther

Top Contributor
@DaCrazyJavaExpert
https://imgur.com/a/t1Ml0

Das hatte ich glaub ich einmal selbst so...aber da kommt halt ne Fehlermeldung.

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;
 
    private String info;
 
    private int nummer;
 
    private String name;
    /**
     * Konstruktor für Objekte der Klasse Gegenstand
     */
    public Gegenstand(String beschreibung, int gewicht)
    {
        this.gegenstandBeschreibung = beschreibung; // Instanzvariable initialisieren
        this.gegenstandGewicht = gewicht;
        this.beschreibung = beschreibung;
        this.nummer = nummer;
        x = 0;
    }
  
 
    public String gibBeschreibung()
    {
    return beschreibung;
    } 
 
    public int gibNummer()
    {
        return nummer;
    }
 
    public String gibName()
    {
        return name;
    } 
 
     /**
     * 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;
    }
}

Zuul ist halt ein Spiel, man gibt Befehle ein um sich in Räumen zu bewegen oder wie hier
Gegenstände aufzuheben. Man müsste z.B. "take buch" eingeben um ein Buch hochzuheben. Später soll es noch so sein, dass man Gegenstände ablegen, anzeigen lassen kann...oder dass man Gegenstände nur bis zu einem Gewicht hochheben kann. Oder das man durch einen Magic Muffin seine maximale Tragkraft steigern kann. Das schwerste kommt noch.

edit: Ja, die Klassen die ich hier gepostet habe, enthalten viel Müll, sind nur Probedateien, damit experementiere ich. Ich hab noch ne Version wo
die Methode back implementiert ist.
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
füe jeden gegenstand in deiner HashMap
Die Gegenstände liegen nicht in einer HashMap, sondern in einer ArrayList.
Zu deinem Code: du überprüfst den ersten Gegenstand, und gibst entweder ihn oder null zurück. Eine Überprüfung des zweiten Gegenstandes findet gar nicht statt (oder ich habe einen katastrophalen Verständnisfehler).
Das hatte ich glaub ich einmal selbst so...aber da kommt halt ne Fehlermeldung.
Diese Fehlermeldung hat mir der (falschen) Prüflogik nichts zu tun, sondern kommt daher, weil du versuchst, die Stringvariable gegenstand (die du ja, wie oben angemerkt, selber als Instanzvariable vom Typ String deklariert hast) in einen ArrayList mit Gegenständen zu packen.
Bin gespannt, wie lange dieser Thread lebt.
 

Devanther

Top Contributor
Naja, aber der Gegenstand (der hochgehoben wird) muss ja irgendwie in die ArrayList eingefügt werden?
Wie das? Da ist wohl ein grundlegendes Problem.

Zu deinem Code: du überprüfst den ersten Gegenstand, und gibst entweder ihn oder null zurück. Eine Überprüfung des zweiten Gegenstandes findet gar nicht statt (oder ich habe einen katastrophalen Verständnisfehler).

Ohman, dann muss wohl die ganze Methode umgeschrieben werden.
 

temi

Top Contributor
Vergleiche mal dieses:
Java:
    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());
        }
    }

Mit diesem:
Java:
    private void befehlTake()
    {
     System.out.println(aktuellerRaum.gegenstand(name));
    }

Jetzt solltest du wissen, wie das zweite Befehlswort implementiert wird.
Aber leider wird das nicht ausreichen, weil bei deinem Programm noch so einiges andere im Argen liegt (siehe die vorherigen Antworten). Außerdem habe ich beim Lesen deiner Fragen das Gefühl, dass du dich damit überforderst.
 

Joose

Top Contributor
Die Antworten zu (fast) allen Fragen gibt es bereits in dem Code! Du musst nur verstehen was da an Code geschrieben steht und diese "Lösung" entsprechend auf dein neues Problem umsetzen zu können.

Aber wie immer wird der Hinweis, von uns das du die Grundlagen lernen und verstehen sollst (nicht nur darüber lesen), ignoriert und einfach stur mim Kopf durch die Wand gerannt.
 

Harry Kane

Top Contributor
Ja, die Klassen die ich hier gepostet habe, enthalten viel Müll, sind nur Probedateien, damit experementiere ich. Ich hab noch ne Version wo die Methode back implementiert ist.
Wenn ich am Experimentieren bin, sammelt sich in meinem Code temporär auch Müll an. Wenn ich aber weiss, wie es richtig geht, wird als erstes der Müll gelöscht. Damit gewinnst nicht nur du Übersicht, sondern vor allem auch die Leute die dir helfen wollen.
Was ich sehr bemerkenswert finde, ist, dass du ohne Hilfe noch nicht mal imstande bist, einen Ansatz zu finden, und gleichzeitig Vorschläge zur Verbesserung des Codes ignorierst. Auf mich macht diese Kombination keinen sehr ambitionierten Eindruck.
Hier mal eine Beschreibung von einem Lösungsansatz:
Methode "gegenstand" der Klasse "Raum":
Du hast nix zu meinem Hinweis geschrieben, dass diese Methode deshalb eine NullPointerException auslöst, weil die Variable "name" der Klasse "Gegenstand" null zurückgibt. Aus der mittlerweile geposteten Quellcode der Klasse "Gegenstand" geht hervor, dass meine Vermutung richtig war. Zur Behebung ersetze "aktuellerGegenstand.gibName()" durch "aktuellerGegenstand.gibBeschreibung()".
Die Logik der Klasse "befehlTake".
Schmeiss die Methode komplett weg, und lege eine Kopie der Methode "wechsleRaum(Befehl befehl)" an. Nenne die Methode "nimmGegenstand(Befehl befehl)".
Überprüfe, ob der Befehl ein zweites Wort hat. Wenn nein, Meldung bzw. Frage ausgeben.
Wenn ja, ist das zweite Wort die Beschreibung des Gegenstands. Übergebe dieses Wort (eine String-Variable) an eine geeignete Methode der Klasse Raum, die z. B. "findeGegenstandMitBeschreibung" heissen könnte. Diese Methode muss folgendes tun:
- Über alle Gegenstände in der gegenstand-ArrayList iterieren.
- Falls der Rückgabewert von gegenstand.gibBeschreibung() identisch ist zum übergebenen String, den Gegenstand zurückgeben. Achtung: Strings werden nicht mit "==" verglichen, sondern mit der equals-Methode.
- Am Ende der methode null zurückgeben, was bedeutet, dass der Raum keinen Gegenstand mit der passenden Beschreibung enthält.

Falls "aktuellerRaum.findeGegenstandMitBeschreibung" nicht null zurückgibt, muss der zurückgegebene Gegenstand an eine geeignete Methode der Spieler-Klasse übergeben werden. Diese Methode kann z. B. die "gegenstandAufnehmen"-Methode sein, die es laut einem früheren Post von dir schon in der Spieler-Klasse gibt. Diese Methode ist allerdings fehlerhaft, weil da zwei Strings mit "==" verglichen werden. Ausserdem würde ich einen Rückgabewert vom Typ boolean einbauen, durch den angezeigt wird, ob der Gegenstand wirklich aufgenommen wurde, oder, aus welchem grund auch immer (schon vorhanden, zu schwer, kein Platz mehr im Rucksack, etc.) nicht.
Falls die entsprechend geänderte Methode "gegenstandAufnehmen" true zurückgibt, muss sie aus dem aktuellen Raum entfernt werden (da ja der Gegenstand nicht gleichzeitig im Raum und beim Spieler sein kann). Ggf. muss die Raum-Klasse dazu um eine Methode "entferneGegenstand" erweitert werden, die einen gegenstand als Parameter bekommt und diesen Gegenstand aus der Gegenstand-Liste des Raums entfernt.
 

JCODA

Top Contributor
Hey @Devanther ,

bist du an Nachhilfe interessiert? Falls du ein Headset hast können wir uns mal per TeamViewer und TeamSpeak treffen und du kannst gezielt Fragen stellen.
Kostet 15€/Stunde. Siehe auch meine Signatur.
 

Devanther

Top Contributor
Vielen Dank für die Hilfe.

Wenn ja, ist das zweite Wort die Beschreibung des Gegenstands. Übergebe dieses Wort (eine String-Variable) an eine geeignete Methode der Klasse Raum, die z. B. "findeGegenstandMitBeschreibung" heissen könnte. Diese Methode muss folgendes tun:

Ich verstehe leider nicht ganz, was/wie übergeben werden soll?

aus der Klasse Spiel:
Code:
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 {
            letzterRaum = aktuellerRaum;
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }

Wie schreibe ich hier die Übergabe?

Klasse Raum:
https://imgur.com/a/nATfu
Und wie schreibe ich die Methode findeGegenstandMitBeschreibung?
Habe versucht deine Anleitung nachvollzuziehen.

Erstmal muss ich es schaffen, dass Gegenstände hochgehoben werden können und mit der
Methode "status" angezeigt werden können. Dann kommt der Rest, dass der Spieler(Klasse Spieler)
eine Tragkraft hat (Datenfeld dafür erstellen) und Gegenstände nur bis zu einem gewissen
Gewicht hochheben kann. Bzw. dass die Tragkraft erhöht werden kann, durch ein Item das gefunden wird etc.

Aber eine Aufgabe nach der anderen, dass sind 5 Aufgaben auf einmal^^Aufgaben zerlegen erst
 

Sasuke

Mitglied
Ich verstehe leider nicht ganz, was/wie übergeben werden soll?

Das zweite eingegebene Wort, die Beschreibung des Gegenstandes.

Und wie schreibe ich die Methode findeGegenstandMitBeschreibung?
Habe versucht deine Anleitung nachvollzuziehen.

Das wurde Wort für Wort beschrieben:
- Über alle Gegenstände in der gegenstand-ArrayList iterieren.
- Falls der Rückgabewert von gegenstand.gibBeschreibung() identisch ist zum übergebenen String, den Gegenstand zurückgeben. Achtung: Strings werden nicht mit "==" verglichen, sondern mit der equals-Methode.
- Am Ende der methode null zurückgeben, was bedeutet, dass der Raum keinen Gegenstand mit der passenden Beschreibung enthält.

Erstmal muss ich es schaffen, dass Gegenstände hochgehoben werden können und mit der
Methode "status" angezeigt werden können. Dann kommt der Rest, dass der Spieler(Klasse Spieler)
eine Tragkraft hat (Datenfeld dafür erstellen) und Gegenstände nur bis zu einem gewissen
Gewicht hochheben kann. Bzw. dass die Tragkraft erhöht werden kann, durch ein Item das gefunden wird etc.

Aber eine Aufgabe nach der anderen, dass sind 5 Aufgaben auf einmal^^Aufgaben zerlegen erst

Würdest du uns mal deine Aufgaben und den aufgeräumten Code zeigen? Ich glaube langsam du weißt selber nicht was du willst.
 

temi

Top Contributor
Code:
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 {
            letzterRaum = aktuellerRaum;
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }

Wie schreibe ich hier die Übergabe?

Das ist fast Wort für Wort die Vorlage, wie die Methode private void nimmGegenstand(Befehl befehl) programmiert wird:
  1. Hat der Befehl ein zweites Wort?
  2. Falls nein, "Was willst du aufheben?
  3. Ist der Gegenstand im Raum?
  4. Falls nein, "Das gibt es hier nicht."
  5. Übergebe den Gegenstand an den Spieler.
Voraussetzung dafür ist, dass der Befehl public Gegenstand gibGegenstand(String name) diesen Gegenstand dabei auch gleich aus dem Raum entfernt. Sonst gäbe es den Gegenstand zweimal.
 

temi

Top Contributor
Klasse Raum:
https://imgur.com/a/nATfu
Und wie schreibe ich die Methode findeGegenstandMitBeschreibung?
Habe versucht deine Anleitung nachvollzuziehen.
Schon gar nicht so schlecht. Ich würde die Namensgebung für die Methoden identisch halten z.B. "gibGegenstand". Das ist aber nicht entscheidend.
  1. Warum gibt deine Methode einen String zurück, wo es doch ein Gegenstand sein sollte? Genau das steht auch in der Fehlermeldung. Kannst du Englisch? Dann sollte das ja einfach zu lesen sein.
  2. Warum sollte eine Methode "gibGegenstand" oder "findeGegenstand" eine Ausgabe machen die "Der Gegenstand wurde hochgehoben" lautet? Ist das die Aufgabe einer Methode mit diesem Namen?
  3. Im else-Zweig gilt dasselbe wie bei 2.
Sorge dafür, dass dein Methoden das tun, was sie tun sollen und nicht mehr. Für das "Aufheben" gibt es die Methode "nimmGegenstand" und schon aus dem Namen kannst du die Aufgabe ersehen.

Wichtig: Wie bereits oben geschrieben muss gibGegenstand den Gegenstand aus dem Raum entfernen = aus der Liste gegenstaende des Raumes löschen.
 

Harry Kane

Top Contributor
Ich verstehe leider nicht ganz, was/wie übergeben werden soll?
Hier ein Beispiel aus der wechsleRaum-Methode zur Erklärung
Java:
String richtung = befehl.gibZweitesWort();
 // Wir versuchen, den Raum zu verlassen.
 Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung);
In dem Codeabschnitt passieren zwei Dinge. Die Methode "gibZweitesWort" der Variable "befehl" wird aufgerufen und der Rückgabewert in der Stringvariablen "richtung" gespeichert. Dann wird die Methode "gibAusgang" der Variable "aktuellerRaum" aufgerufen. Diese Methode braucht einen String als Methodenparameter. Im vorliegenden Fall wird die Variable "richtung" verwendet. Den Aufruf einer Methode, die Parameter braucht, kann man auf verschiedenen Arten in Worte fassen. Manchmal sagt man 'ich rufe die Methode "gibAusgang" auf und verwende dabei "richtung" als Parameter', manchmal sagt man auch 'ich übergebe den Parameter "richtung" der Methode "gibAusgang"'.
Für weitere Erläuterungen s. Kapitel 2.7 der Java-Insel, insbesondere Unterkapitel 2.7.6.
 

Devanther

Top Contributor
https://imgur.com/a/VGcL4
Ist die Übergabe richtig? Wie bekomme ich die Fehlermeldung weg?


Bis auf folgenden Logikfehler: es wird der erste Gegenstand überprüft, und falls es den passenden Namen hat, wird er zurückgegeben, ansonsten wird null zurückgegeben. Der zweite Gegenstand wird nie überprüft

Code:
public String findeGegenstandMitBeschreibung(String name) {
   //du gehst jeden Gegebstand in deiner HashMap durch...
   for(Gegenstand aktuellerGegenstand : gegenstaende) {
   //...und prüfst ob der Gegenstand in der Liste dem im Raum(?) gleich ist.
   if(aktuellerGegenstand.gibBeschreibung().equals(name)) {
    //Wenn ja wird der gegenstand aufgehoben...
   System.out.println("Sie haben den Gegenstand hochgehoben!");
    return Gegenstand;
   } else {
   //...,wenn nein dann gibst du aus, dass der Gegenstand nicht vorhanden ist und gibst nichts zurück.
   System.out.println(" Es gibt keine Gegenstände im Raum");
   return null;
  }
  }
  return null;
}

Wie überprüfe ich den zweiten Gegenstand?
Es kommt hier keine Fehlermeldung.
 

Devanther

Top Contributor
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;
 
    private String Gegenstand;
 
 
    /**
     * 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 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!";
   } 
 
   //deine Methode die irgendwas macht
    public String findeGegenstandMitBeschreibung(String name) {
   //du gehst jeden Gegebstand in deiner HashMap durch...
   for(Gegenstand aktuellerGegenstand : gegenstaende) {
   //...und prüfst ob der Gegenstand in der Liste dem im Raum(?) gleich ist.
   if(aktuellerGegenstand.gibBeschreibung().equals(name)) {
    //Wenn ja wird der gegenstand aufgehoben...
   System.out.println("Sie haben den Gegenstand hochgehoben!");
    return Gegenstand;
   } else {
   //...,wenn nein dann gibst du aus, dass der Gegenstand nicht vorhanden ist und gibst nichts zurück.
   System.out.println(" Es gibt keine Gegenstände im Raum");
   return null;
  }
  }
  return null;
}
 
 
 
    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 String gibGegenstaendeAlsString()
    {     
      String ergebnis = "";       
      for(Gegenstand aktuellerGegenstand : gegenstaende)
        ergebnis += " " + aktuellerGegenstand.gibBeschreibung();
          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 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 buch;
    private Gegenstand computer;
 
    private Raum letzterRaum;
 
    private String name;
 
 
 
     
    /**
     * 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());
        System.out.println(aktuellerRaum.gibGegenstaendeAlsString());
    } 
 
    private void essen()
    {
        System.out.println(aktuellerRaum.gibEssensBeschreibung());
    } 
 
    private void nimmGegenstand(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();
        
        Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung);
     
        Raum aktuellerRaum = aktuellerRaum.findeGegenstandMitBeschreibung(name);

        if (naechsterRaum == null) {
            System.out.println("Dort ist keine Tür!");
        }
        else {
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }
 
    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("back")) {
            raumZurueck(); 
        }
        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 {
            letzterRaum = aktuellerRaum;
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }
  
    private void raumZurueck()
    {
        if (letzterRaum != null) {
            aktuellerRaum = letzterRaum;
             letzterRaum = null;
             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 Spiel hab ich in der Version noch nicht.
Methode back ist implementiert.

@Flown
Den Thread bitte nicht sperren.
Ich habe nie gesagt, dass ich die Grundlagen gut verstanden habe!
Dieses Spiel hier, Zuul ist eine gute Möglichkeit für mich, die Grundlagen zu verbessern...!
Durch lesen im Buch lernt man die Grundlagen nicht ausreichend, man muss Code selber schreiben und
das versuche ich!

@temi
Ja, die Methode verstehe ich schon...
 

DaCrazyJavaExpert

Bekanntes Mitglied
Durch lesen im Buch lernt man die Grundlagen nicht ausreichend, man muss Code selber schreiben und
das versuche ich!
Ich persönlich lerne mit Lesen gut. Wenn du im Buch irgendein Thema nicht verstehst kannst du im Internet danach schauen. Da findest du jedemenge verschiedene Erklärungen für ein Thema - und die Grundlagen, wo die Logik noch nicht den entscheidenden Punkt bringt, kann man damit perfekt lernen, wenn man es will.
 

Harry Kane

Top Contributor
Zu deiner findeGegenstandMitBeschreibung-Methode:
Du warst schon mal sehr dicht dran an der Lösung. Die NullPointerException aus deiner ursprünglichen gegenstand-Methode aus der Raum-Klasse kam einfach daher, weil die gibName()-Methode der Klasse Gegenstand null zurückgibt. Du hättest lediglich gibName() durch gibBeschreibung() ersetzen müssen. Leider hast du den konzeptionell falschen Code vom @DaCrazyJavaExpert übernommen, und es in deiner oben geposteten Version sogar geschafft, einen absoluten Anfängerfehler dort rein zu verschlimmbessern (statt "return Gegenstand" muss es natürlich "return aktuellerGegenstand" heissen). Die falschen Kommentare wie z. B. "HashMap" hast du drin gelassen. Deine Behauptung, dass da keine Fehlermeldung kommt, kann nur das Ergebnis eines kolossalen Missverständnisses sein.
Der Oberknaller ist allerdings die "nimmGegenstand"-Methode aus dem Screeenshot. Sie ist im wesentliche eine 1:1 Kopie der wechsleRaum-Methode, ergänzt um eine vollkommen sinnlose Zeile, in der du es geschafft hast, zwei Fehler einzubauen: die Verwendung der Variable "name", die im Methodenkontext gar nicht deklariert ist und wer weiss woher kommt, und der Versuch, den Rückgabewert einer Methode, der als String deklariert ist, eine Variablen vom Typ Raum zuzuweisen.
 

Meniskusschaden

Top Contributor
Ja, ganz ehrlich, wo soll denn drinstehen wie ich dieses Problem oben lösen kann?
Das wird nirgends so konkret für diesen Fall stehen. Man wendet die erlernten allgemeinen Grundlagen auf den spezifischen Fall an.
Angenommen, du willst die Aufgabe 578 + 1321 berechnen, weißt aber nicht, wie man addiert. Deine aktuelle Lernstrategie folgt der Hoffnung, dass du das Addieren verstehen wirst, sobald dir nur jemand verrät, dass 1899 heraus kommt. Oder du suchst nach einem Buch, in dem 578 + 1321 erklärt wird. Wenn dort aber nur 579 + 1322 erklärt wird, hilft es dir nichts. Mit viel Glück kann das für eine einzelne Aufgabe mal klappen, aber im Normalfall eben nicht. Du kannst das nur ausrechnen, wenn du das Addieren lernst. Aber das willst du offenbar nicht. Vielleicht um Zeit zu "sparen"?
 

Devanther

Top Contributor
puuuh
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;
 
    private String Gegenstand;
 
 
 
 
    /**
     * 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 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 findeGegenstandMitBeschreibung(String name) {
         for(Gegenstand aktuellerGegenstand: gegenstaende){
              if (aktuellerGegenstand.gibBeschreibung()  .equals (name)) {
                  System.out.println("Sie haben den Gegenstand hochgehoben!");
                  return aktuellerGegenstand;
              }
         }
         System.out.println(" Es gibt keine Gegenstände im Raum");
         return null;
    }
 
 
 
    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 String gibGegenstaendeAlsString()
    {     
      String ergebnis = "";       
      for(Gegenstand aktuellerGegenstand : gegenstaende)
        ergebnis += " " + aktuellerGegenstand.gibBeschreibung();
          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 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 buch;
    private Gegenstand computer;
 
    private Raum letzterRaum;
 
    private String name;
 
 
 
     
    /**
     * 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());
        System.out.println(aktuellerRaum.gibGegenstaendeAlsString());
    } 
 
    private void essen()
    {
        System.out.println(aktuellerRaum.gibEssensBeschreibung());
    } 
 
    private void nimmGegenstand(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();
        
        Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung);
     
     
        if (naechsterRaum == null) {
            System.out.println("Dort ist keine Tür!");
        }
        else {
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }
 
    private void befehlTake()
    {
     System.out.println(aktuellerRaum.findeGegenstandMitBeschreibung(name));
    } 
 
 
    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("back")) {
            raumZurueck();
        } 
        else if (befehlswort.equals("take")) {
            befehlTake(); 
        }
        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 {
            letzterRaum = aktuellerRaum;
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }
  
    private void raumZurueck()
    {
        if (letzterRaum != null) {
            aktuellerRaum = letzterRaum;
             letzterRaum = null;
             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.
        }
    }
}

https://imgur.com/a/nBUuh
Jetzt müsste ich nur noch wissen, wie man die Fehlermeldung weg bekommt, dann müsste
es funktionieren. Ich hab den Code von damals nochmal hergeholt und verbessert.
Den Befehl "take" wieder eingeführt etc...! Und den Blödsinn wieder entfernt.
Wie man aufem Screenshot sieht, kommt nur 1 Fehlermeldung, der Rest
ist richtig?
 

temi

Top Contributor
Wenn es dir nur darum ging eine Meldung auf dem Bildschirm auszugeben, dann hättest du das auch einfacher haben können...
 

DaCrazyJavaExpert

Bekanntes Mitglied
Jetzt müsste ich nur noch wissen, wie man die Fehlermeldung weg bekommt, dann müsste
es funktionieren
Dein Rückgabewert (return wert) ist nicht von dem Typ den deine Methode aus Rückgabe erwartet. Deine Methode erwartet einen Steing, du gibst allerdings etwas vom Typ Gegenstand zurück. Also musst du jetzt schauen, was du zurückgeben willst. Einen Text (String) oder etwas vom Typ Gegenstand und das dann je nach dem ändern.
 

Harry Kane

Top Contributor
der Rest
ist richtig
Nein.
Zur Fehlermeldung: du hast den Rückgabewert der Methode findeGegenstandMitBeschreibung als String deklariert, gibt aber eine Instanz von Raum zurück.
Und deine nimmGegenstand-Methode aus der Klasse "Spiel" ist jetzt offenbar identisch zur "wechsleRaum"-Methode, und es werden gar keine Gegenstände mehr aufgenommen.
 

Devanther

Top Contributor
So Fehlermeldung ist schonmal weg.

Wie schreibe ich die Methode nimmGegenstand?

Bisher lässt sich alles kompilieren aber wenn ich das Spiel starte
dann wird der Befehl "take Buch" gar nicht erkannt.
 
Zuletzt bearbeitet:

Joose

Top Contributor
Ich gebe mir Mühe!
Davon sieht man nur leider wenig. Das liegt auch daran dass dir viele Leute schon immer wieder den Tipp gegeben haben dass du die Grundlagen nochmals lernen, verstehen und üben sollst!
Auf diese Hinweise/Tipps kam nur ein "ja mach ich" bzw. "hab ich, aber verstehe es nicht".

Das du es gemacht hast sieht man nicht wirklich, weil es immer noch an den einfachsten Grundlagen hapert.
Gehe die Grundlagen Schritt für Schritt durch, und wenn du etwas nicht verstehst dann frag spezifisch zu diesem Thema nach.
Dein Zwang die Grundlagen durch dieses Programm besser zu verstehen bringt dich nicht ans Ziel.
Du sagst immer wieder du verstehst die Methode bzw. den Code, bei der nächsten Aufgabe die nahezu identisch ist zu vorherigen kannst du den bisherigen Code nicht anwenden/anpassen.

Ich habe nie gesagt, dass ich die Grundlagen gut verstanden habe!
Ja aber bevor man die Grundlagen nicht annähernd gut beherrscht braucht man nicht weitermachen, sondern sollte die Grundlagen weiterüben.
Nein mit diesem Spiel kannst du die Grundlagen nicht gut üben, weil hier schon objektorientierte Programmierung geübt wird -> da sollten die Grundlagen schon sitzen!

Dieses Spiel hier, Zuul ist eine gute Möglichkeit für mich, die Grundlagen zu verbessern...!
Grundlagen übt man einfach mit simplen Konsolenprogrammen über ein paar Zeilen. Experimentiert etwas herum und verursacht auch mal Fehler und versucht diese alleine zu finden.
Wenn es wo nicht weitergeht weil etwas unverständlich ist dann fragt man nach.

Durch lesen im Buch lernt man die Grundlagen nicht ausreichend, man muss Code selber schreiben und
das versuche ich!
Eben ein Buch ist nur eine Anleitung wie es geht, aber dann übe das aktuelle Grundlagenkapitel für sich und nicht mit noch X anderen Sachen zusammen.

Ja, ganz ehrlich, wo soll denn drinstehen wie ich dieses Problem oben lösen kann?
Wie Harry Kane schon gesagt hat -> für ein spezifisches Problem wirst du selten die Lösung in einem Buch oder im Internet finden. Du musst lernen vorhandenen Code bzw. Beispielcode auf dein Problem umzulegen!
Nur dazu muss man eben die Grundlagen kennen.

Wenn ich das eingebe kommt das:
> take Buch
Es gibt keine Gegenstände im Raum
null
Und verstehst du auch warum diese Zeilen ausgegeben werden? Warum wird "null" ausgegeben?
 

AndiE

Top Contributor
Ich wolle mich ja nicht mehr einmischen. Ich habe mir das Buch selbst geholt, und in dem Buch wird das Programmieren aufbauend erklärt. Im 3. Kapitel auch der Umgang mit dem Debugger oder auch mit der Kommunikation mit Objekten. Es ist aber auch recht logisch, dass ich keine Aufgabe des Kapitels 8 ( oder 6) lösen kann, wenn ich die strukturell einfacheren nicht lösen kann. Die IDE von BlueJ bietet mir die Möglichkeit, Klassen und Methoden einzeln zu testen und auch den Staus der Klassen abzufragen. Das steht in den ersten Kapiteln des Buches .
 

Devanther

Top Contributor
Ja, wie gesagt, die Fehlermeldung ist jetzt weg, aber die Methode muss noch geschrieben werden:
Code:
private void nimmGegenstand(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();
        
        Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung);
     
     
        if (naechsterRaum == null) {
            System.out.println("Dort ist keine Tür!");
        }
        else {
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }

Welche Methode wird denn aufgerufen, wenn du den Befehl eingibst? Zwei kleine Tipps: es ist nicht die Methode "nimmGegenstand", und in der aufgerufenen Methode wird eine Instanzvariable von Spiel verwendet, die nie initialisiert wird.

Es ist wohl die Methode findeGegenstandMitBeschreibung.

Was an den Ausführungen in meinem Beitrag von gestern MIttag hast du denn nicht verstanden?

Meinst du das:
Nenne die Methode "nimmGegenstand(Befehl befehl)".
Überprüfe, ob der Befehl ein zweites Wort hat. Wenn nein, Meldung bzw. Frage ausgeben.
Wenn ja, ist das zweite Wort die Beschreibung des Gegenstands. Übergebe dieses Wort (eine String-Variable) an eine geeignete Methode der Klasse Raum, die z. B. "findeGegenstandMitBeschreibung" heissen könnte. Diese Methode muss folgendes tun:
- Über alle Gegenstände in der gegenstand-ArrayList iterieren.
- Falls der Rückgabewert von gegenstand.gibBeschreibung() identisch ist zum übergebenen String, den Gegenstand zurückgeben. Achtung: Strings werden nicht mit "==" verglichen, sondern mit der equals-Methode.
- Am Ende der methode null zurückgeben, was bedeutet, dass der Raum keinen Gegenstand mit der passenden Beschreibung enthält

Die Methode "nimmGegenstand(Befehl befehl)" (Klasse Spiel) muss die Methode "findeGegenstandMitBeschreibung" (Klasse Raum)
aufrufen? Hab ich das richtig verstaden? Wenn ja, wie mache ich das?
Ein Lösungsvorschlag von mir war laut Harry Kane Schwachsinn.
Ich weiss nicht, was wie ich nimmGegenstand schreiben soll.

In die Klasse Befehlswoerter hab ich den Befehl hinzugefügt.
Code:
private static final String gueltigeBefehle[] = {
        "go", "quit", "help", "look", "eat", "back", "take"
    };
 

temi

Top Contributor
Die Methode "nimmGegenstand(Befehl befehl)" (Klasse Spiel) muss die Methode "findeGegenstandMitBeschreibung" (Klasse Raum)aufrufen? Hab ich das richtig verstaden? Wenn ja, wie mache ich das?
Genau das ist dein Problem. Du weißt nicht, wie du ganz grundlegende Dinge machen sollst und das ist ein sehr sehr sehr deutliches Zeichen, dass du das Projekt Zuul für jetzt erst mal beiseite lassen solltest und die Grundlagen lernst. Du probierst sinnlos irgendwelche Sachen aus, in der Hoffnung, dass es vielleicht durch Zufall mal funktioniert. Das ist nicht programmieren. Tu dir den Gefallen und fang in deinem Buch noch mal von vorne an. Alles andere ist verschwendete Zeit für dich und für alle, die dir helfen wollen.
 

Devanther

Top Contributor
Es ist ja so, dass jedes Kapitel neue Konzepte/Dinge vorgestellt werden.
Wenn ich Kapitel z.B. Kapitel 5 verstanden habe heisst es nicht automatisch dass ich Kapitel 6 schaffe usw...

Ich würde schon sagen, dass ich bis zum Projekt Zuul die Dinge verstanden habe, komme bei diesem neuen
Projekt trotzdem nicht weiter.

Mit etwas Hilfe sind die Aufgaben machbar.

Und verstehst du auch warum diese Zeilen ausgegeben werden? Warum wird "null" ausgegeben?

Das bedeutet dass eine Variable auf kein Objekt zeigt.
 
Zuletzt bearbeitet:

temi

Top Contributor
Mit etwas Hilfe sind die Aufgaben machbar.
Gut. Dann nimm diese Methode als Vorlage und forme sie so um, dass sie deine gewünschte Methode korrekt aufruft und auch die ausgegebenen Meldungen zur Aufgabe passen. Eine Beschreibung findest du etwas weiter oben in diesem Thread:
Java:
private void nimmGegenstand(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();
     
        Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung);
   
   
        if (naechsterRaum == null) {
            System.out.println("Dort ist keine Tür!");
        }
        else {
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }

Kümmere die erst mal nur um diese Methode und stelle deine Lösung dann hier vor.
 

Meniskusschaden

Top Contributor
Wenn ich Kapitel z.B. Kapitel 5 verstanden habe heisst es nicht automatisch dass ich Kapitel 6 schaffe usw...
Aber wenn du Kapitel 5 nicht verstanden hast, ist es sehr wahrscheinlich, dass du Kapitel 6 auch nicht verstehen wirst.
Ich würde schon sagen, dass ich bis zum Projekt Zuul die Dinge verstanden habe,
Das ist offensichtlich eine Fehleinschätzung.
Mit etwas Hilfe sind die Aufgaben machbar.
Was sollen solche Bemerkungen? Bisher war trotz intensivster Hilfe keine der Aufgaben für dich machbar.

Bitte gewöhne es dir an, vernünftig zu zitieren. Gerade bei großen Threads sollten die Zitate ordentlich verknüpft sein.
 

Devanther

Top Contributor
https://imgur.com/a/VGcL4

Harry Kane sagt, dass das Schwachsinn ist, ich kann die gewünschte Methode nicht aufrufen -.-
Ich habe leider nur wenig Code bisher gesehen...

Code:
private void nimmGegenstand(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();
         
        Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung);
      
        System.out.println(aktuellerRaum.findeGegenstandMitBeschreibung(name));
      
        if (naechsterRaum == null) {
            System.out.println("Dort ist keine Tür!");
        }
        else {
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
        }
    }

Es kommt keine Fehlermeldung aber die Methode funktioniert im Spiel
immer noch nicht.
 
Zuletzt bearbeitet:

temi

Top Contributor
Harry Kane sagt, dass das Schwachsinn ist, ich kann die gewünschte Methode nicht aufrufen -.-
Da hat er absolut recht.

Dann nimm diese Methode als Vorlage und forme sie so um, dass sie deine gewünschte Methode korrekt aufruft und auch die ausgegebenen Meldungen zur Aufgabe passen.

Du hast nichts gemacht außer einen Befehl irgendwo rein zu schreiben. Beginn bei der ersten Zeile, überlege was sie macht, korrigiere falls notwendig. Und so weiter und so fort.
 

Devanther

Top Contributor
Keine Ahnung.
Code:
private void nimmGegenstand(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();
          
        Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung); 
       
       
       
        if (naechsterRaum == null) {
            System.out.println("Dort ist keine Tür!");
        }
        else {
            aktuellerRaum = naechsterRaum;
            System.out.println(aktuellerRaum.gibLangeBeschreibung());
            System.out.println(aktuellerRaum.findeGegenstandMitBeschreibung(name));
        }
    }

Das geht aber auch nicht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Erste Schritte Projekt Zuul Java Basics - Anfänger-Themen 192
L OOP World of zuul - Falltür? Java Basics - Anfänger-Themen 8
I Klassen Umsetzungsfrage zu Spiel "Zuul" Java Basics - Anfänger-Themen 3
S Die Welt von Zuul Java Basics - Anfänger-Themen 2
M jeden 2ten Buchstaben aus array Java Basics - Anfänger-Themen 6
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
Viktor A. Kaiser Ampelschaltung mit if-Befehl Java Basics - Anfänger-Themen 11
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
Lion.King switch-Befehl Java Basics - Anfänger-Themen 6
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
F Terminal Windows per Befehl schließen? Java Basics - Anfänger-Themen 9
Y Wie kann man überprüfen, ob bei einem Print Befehl tatsächlich etwas geprintet wurde? Java Basics - Anfänger-Themen 4
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3
A Scanner Befehl Java Anfänger Java Basics - Anfänger-Themen 8
K Subklassen mit einzigem Befehl addieren Java Basics - Anfänger-Themen 6
F cmd Befehl ausführen Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
D Input/Output Befehl aus Benutzereingabe herausfiltern Java Basics - Anfänger-Themen 12
T if else Befehl funktioniert nicht richtig Java Basics - Anfänger-Themen 27
N Javac -version der Befehl ist entweder falsch geschrieben oder...... Java Basics - Anfänger-Themen 8
O Methoden Runtime.getRuntime().exec(befehl); Java Basics - Anfänger-Themen 6
L Ist an diesem Befehl irgendwas falsch? Java Basics - Anfänger-Themen 2
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
B Copy Paste Befehl Java Basics - Anfänger-Themen 6
O String: Befehl und Wert erkennen. Java Basics - Anfänger-Themen 4
D Erste Schritte Befehl back implementieren Java Basics - Anfänger-Themen 18
elischa unbekannter Befehl zur Compilezeit Java Basics - Anfänger-Themen 22
B Befehl um ein Befehl abzubrechen Java Basics - Anfänger-Themen 2
M Classpath Befehl zum Kompilieren um die Option classpath erweitern. Java Basics - Anfänger-Themen 5
F Konsolen Befehl ausführen und Rückgabe auswerten Java Basics - Anfänger-Themen 3
S Befehl current: Java Basics - Anfänger-Themen 3
Silvascus Void Methode einem Stringparameter im syso-Befehl hinzufügen Java Basics - Anfänger-Themen 3
slejden Erste Schritte der Befehl import Java Basics - Anfänger-Themen 2
C OOP array Sortieren ohne den sort Befehl Java Basics - Anfänger-Themen 10
J Problem WIE ohne Goto-Befehl lösbar? Java Basics - Anfänger-Themen 6
N Benötige eine Alternative für einen GOTO Befehl Java Basics - Anfänger-Themen 2
O CMD Befehl javac Java Basics - Anfänger-Themen 3
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
D Klassenmethode: Befehl erkennen, dann int zurückgeben Java Basics - Anfänger-Themen 2
C Desktopiconwechsel ohne Befehl Java Basics - Anfänger-Themen 0
V Schlüsselworte Befehl Ignorieren? Java Basics - Anfänger-Themen 10
B JDK installieren Befehl java funktioniert nicht Java Basics - Anfänger-Themen 15
J Variablen Auf der suche nach einem Befehl Java Basics - Anfänger-Themen 2
M Frage zum return; Befehl Java Basics - Anfänger-Themen 1
C CMD Befehl + Variable im Java-Code ausführen Java Basics - Anfänger-Themen 8
S Methoden auf befehl ausführen Java Basics - Anfänger-Themen 7
iB0T Eine Art Goto Befehl! Java Basics - Anfänger-Themen 27
H Exit Befehl in eigener Konsole Java Basics - Anfänger-Themen 9
D Erste Schritte bash-Befehl mit Swing ausführen Java Basics - Anfänger-Themen 8
A Schlüsselworte Befehl this Java Basics - Anfänger-Themen 8
E CMD Befehl über Java ausführen? Java Basics - Anfänger-Themen 4
E Warum wird Methode nicht durch return-Befehl beendet? Java Basics - Anfänger-Themen 3
D Hilfe zu Java Befehl In.open Java Basics - Anfänger-Themen 2
B Javadoc-Befehl unter Ubuntu Java Basics - Anfänger-Themen 2
I Befehl/Methode "los()" Java Basics - Anfänger-Themen 17
A Befehl gesucht....wie komme ich an Folgendes Objekt? Java Basics - Anfänger-Themen 6
I Return Befehl in Methode Java Basics - Anfänger-Themen 13
K Befehl per Shell an Java-Applet JAR übergeben Java Basics - Anfänger-Themen 16
S javac Befehl Java Basics - Anfänger-Themen 7
C Befehl zum Verlassen einer Schleife Java Basics - Anfänger-Themen 27
W Befehl ausführen bei Mausklick + gedrückte Strg-Taste Java Basics - Anfänger-Themen 2
B Befehl mit Priorität aufrufen Java Basics - Anfänger-Themen 4
I Befehl wird erst nach dem Ausführen einer Funktion ausgeführt Java Basics - Anfänger-Themen 4
K Problem mit h2 DB Insert Befehl Java Basics - Anfänger-Themen 6
B Befehl für vorselektierten Radiobutton Java Basics - Anfänger-Themen 2
H if-Befehl mit Buttongroup Java Basics - Anfänger-Themen 9
B assert befehl in netbeans Java Basics - Anfänger-Themen 3
M Objekto.Programm. Return-Befehl Java Basics - Anfänger-Themen 4
F Kann String in Befehl wandeln? Java Basics - Anfänger-Themen 12
F Simpler DrawLine - Befehl!? Java Basics - Anfänger-Themen 9
M Befehl zum Einlesen von Benutzereingaben Java Basics - Anfänger-Themen 1
M Befehl zum Fenster schließen? GUI Java Basics - Anfänger-Themen 3
L Do while Befehl verkürzen? Java Basics - Anfänger-Themen 16
-horn- Befehl an CMD übergeben Java Basics - Anfänger-Themen 15
A [Fehlermeldung]Sleep-Befehl Java Basics - Anfänger-Themen 4
B Befehl "javac" wird nicht erkannt Java Basics - Anfänger-Themen 14
S Befehl "javac" funktioniert und Windows 7 nicht? Java Basics - Anfänger-Themen 3
K Terminal Befehl mit Java unter Mac ausführen Java Basics - Anfänger-Themen 18
L Java Persistence API - Update Befehl? Java Basics - Anfänger-Themen 5
X Befehl import Java Basics - Anfänger-Themen 21
Antoras Explizite Typenumwandlung in einem Befehl Java Basics - Anfänger-Themen 3
A Button einen Befehl zuordnen Java Basics - Anfänger-Themen 7
N suche Datums befehl Java Basics - Anfänger-Themen 8
H Problem mit Tastatur Befehl Java Basics - Anfänger-Themen 11
J Kill befehl Java Basics - Anfänger-Themen 44
G java shell script starten und befehl übergeben Java Basics - Anfänger-Themen 3
Z Ant java -classpath befehl Java Basics - Anfänger-Themen 2
X JOptionPane.showMessageDialog(); - Import Befehl? Java Basics - Anfänger-Themen 4
K Befehl um am Anfang einer Methode zu kommen? Java Basics - Anfänger-Themen 9
G Befehl für Ende bei Switch-Auswahl Java Basics - Anfänger-Themen 11
K fehler mit der Befehl Console Java Basics - Anfänger-Themen 3
H Befehl mit Konstruktoren Java Basics - Anfänger-Themen 2
L Leider klappt bei mir ein Befehl nicht Java Basics - Anfänger-Themen 4
P Befehl zum einrücken der textausgabe? Java Basics - Anfänger-Themen 6
A Befehl ausführen beim Schließen der Konsole Java Basics - Anfänger-Themen 3
S Gibt es einen Befehl "Mausklick" o.ä? Java Basics - Anfänger-Themen 6
S Java-Programm ohne -jar Befehl? Java Basics - Anfänger-Themen 9
K Auf File- Befehl warten. Java Basics - Anfänger-Themen 10
T JDK installiert aber der Befehl "javac" funktionie Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben