Erste Schritte Projekt Zuul

Status
Nicht offen für weitere Antworten.

Devanther

Top Contributor
Hallo,

neues Projekt:
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
*/

class Spiel
{
    private Parser parser;
    private Raum aktuellerRaum;
      
    /**
     * 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;
    
        // 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");
      
        // 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);

        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.");
    }

    /**
     * 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("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.
        }
    }
}

Es geht hier darum, ein eigenes Spiel zu programmieren.
Es ist die erste von vielen Aufgaben.

Aufgabe:
Als ersten Schritt sollen Sie die Methode raeumeAnlegen so ändern, dass sie
die Räume und Ausgänge für ihr Spiel anlegt. Testen Sie auch!

Sind die Räume und Ausgänge richtig angelegt? Wie kann ich das testen?
Wenn ich eine Instanz der Klasse "Spiel" erstelle und die Methode
void spielen() aufrufe, dann kann ich erstmal nur 3 Befehle,
go, quit und help eingeben.
Wie teste ich, ob bisher alles richtig angelegt ist?
 
Es geht hier darum, ein eigenes Spiel zu programmieren.
Was bei deinem "Grundwissen" wieder mal kein programmieren wird sondern eine Ratespiel.
Es ist die erste von vielen Aufgaben.
... und der erste von vielen Threads

Sind die Räume und Ausgänge richtig angelegt? Wie kann ich das testen?
Wenn ich eine Instanz der Klasse "Spiel" erstelle und die Methode
void spielen() aufrufe, dann kann ich erstmal nur 3 Befehle,
go, quit und help eingeben.
Wie teste ich, ob bisher alles richtig angelegt ist?

Entweder steht in dem Buch, wo du dieses Aufgabe her hast, genauer beschrieben wie man diese Spiel bedient oder es gibt bei dem schon vorhandenen Code auch eine entsprechende Anleitung/ReadMe Datei.
Ansonsten lies dich in das Programm ein und überlege was du für Befehle eingeben musst damit du die Räume und Ausgänge testen kannst. Bewege dich zwischen den Räumen hin und her und schau ob es logisch ist.
Wenn du von Raum A nach Westen gehst und dann direkt wieder nach Osten solltest du auch wieder in Raum A landen 😉
 
Ansonsten lies dich in das Programm ein und überlege was du für Befehle eingeben musst damit du die Räume und Ausgänge testen kannst. Bewege dich zwischen den Räumen hin und her und schau ob es logisch ist.

Das ist ja gerade das Problem. Ich kann es nicht testen. Ich kann mich nicht von Raum zu Raum bewegen.
 
ja, danke! Das mit "go west" funktioniert tatsächlich.
Ich kann mich von Raum zu Raum bewegen.
Warum sag ich dir oben du sollst dich ins Programm einlesen? Damit du selber rausfindest mit welchem Befehl du den Raum wechseln kannst 😉
Das gehört auch zum Programmieren dazu -> Code lesen und verstehen können
 
Code:
public String gibBeschreibung()
    {
    return;
    }

Wie muss ich die return Anweisung schreiben? In der Klasse Raum.

Das andere sollen wohl Attribute der Klasse Raum sein westAusgang ... etc. und hier brauchst du enstsprechende getter-Methoden weil die Attribute sicher private sind

Ja, wie mache ich das? Dass mit den getter-Methoden?
 
Code:
public String gibBeschreibung()
    {
    return beschreibung;
    }

ok^^ eine Fehlermeldung weniger!

https://panjutorials.de/tutorials/der-ultimative-java-kurs/lektionen/setter-und-getter/
Das hab ich mir auch schon angesehen.

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

/**
* 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
   
   
    /**
     * 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>();
    }
   
    public String gibBeschreibung()
    {
    return beschreibung;
    }   
   
    /**
     * 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();
    }

    /**
     * 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;
    }

    /**
     * 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.
     */
    public Raum gibAusgang(String richtung)
    {
        return ausgaenge.get(richtung);
    }
}
 
Zuletzt bearbeitet:
Wie kamst du eigentlich darauf eine Methode gibBeschreibung() aufrufen zu wollen ? Es gibt ja schon Methoden gibKurzBeschreibung() und gibLangeBeschreibung() ! Warum verwendest du nicht einfach diese ? Ich wüsste nämlich nicht was man noch für andere Beschreibung erstellen könnte. Und ausserdem ist deine gibBeschreibung ja exakt das gleiche wie gibKurzeBeschreibung() !
 
Wie kamst du eigentlich darauf eine Methode gibBeschreibung() aufrufen zu wollen ? Es gibt ja schon Methoden gibKurzBeschreibung() und gibLangeBeschreibung() ! Warum verwendest du nicht einfach diese ? Ich wüsste nämlich nicht was man noch für andere Beschreibung erstellen könnte. Und ausserdem ist deine gibBeschreibung ja exakt das gleiche wie gibKurzeBeschreibung() !

Ich glaube, dass ist so gewollt^^ Dass viel Code überflüssig ist bzw doppelt/dreifach vorhanden ist.
Es geht im Laufe des Projektes das zu berichtigen!
Erstmal müsste ich wissen, wie ich die Fehlermeldungen beseitigen kann,
dann gehts erst weiter. Dann werde ich weitere Verbesserungen vornehmen.
https://imgur.com/a/RnR3d
 
Du rufst einfach auf:
Code:
if (aktuellerRaum.gibAusgang("north") != null {
...
}
usw. für die anderen Richtungen
 
Wo soll ich das aufrufen?
Wie heisst dann die Methode: private void rauminfoAusgeben()
Ich verstehe leider nicht was du mir sagen willst.
 
Wo kommen diese Aufgaben und die Klasse Raum (von 2011) eigentlich her?
Und wie sollen wir dir helfen? 🙁
 
Von der CD, BlueJ

Es müssen einige Änderungen/Verbesserungen an diesem Projekt vorgenommen werden.
So die Fehlermeldungen sind jetzt alle weg!
Wie teste ich diese Methode?
Wenn ich ne Instanz von Spiel erzeuge sehe ich diese Methode gar nicht.
 
Von der CD, BlueJ
Es gibts tausende CDs.... du müsstest schon etwas genauer werden. SteuerCD 🙄
Änderungen/Verbesserungen
Ergänzungen? Sind das Hausaufgaben?....
Wie teste ich diese Methode?
Wenn ich ne Instanz von Spiel erzeuge sehe ich diese Methode gar nicht.
Womit möchtest du testen? eventuell ist BlueJ gar nicht das richtig werkzeug.

Les dir zum Beispiel mal solche Blogs durch, wenn du etwas lernen möchtest: http://www.tippscom.de/java-programmieren-lernen/
 
Es gibts tausende CDs.... du müsstest schon etwas genauer werden. SteuerCD 🙄

Es gibt zu dem Buch eine spezielle CD mit allen Projekten, leider ohne Lösungen.

Ergänzungen? Sind das Hausaufgaben?....

Nein. Man soll halt die Projekte von der CD bearbeiten.
Und im Buch stehen die Aufgaben dazu, nicht immer so leicht^^

Womit möchtest du testen? eventuell ist BlueJ gar nicht das richtig werkzeug.

Wie kann ich die Datei ohne BlueJ ausführen?
Wenn ich in BlueJ auf Projekt ->Als jar.Archiv speichern gehe und die Datei als jar. Datei speichere, kann
ich diese Datei mit nem Doppelklick nicht ausführen. Auch Kommandozeile funktioniert nicht.

Code:
 public static void main(String[] args)
    {
        Spiel spiel = new Spiel();
        spiel.spielen();
    }
Die main-Methode hab ich in Spiel hinzugefügt!
Wie starte ich dieses Spiel ohne BlueJ?
 
Code:
import java.util.Set;
import java.util.HashMap;

/**
* 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 nordausgang;
    private Raum suedausgang;
    private Raum ostausgang;
    private Raum westausgang;
  
  
    /**
     * 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>();
    }
  
    public String gibBeschreibung()
    {
    return beschreibung;
    }  
  
    public Raum gibAusgang(String richtung)
    {
        if(richtung.equals("north")) {
            return nordausgang;
        }
        if(richtung.equals("east")) {
            return ostausgang;
        }   
        if(richtung.equals("south")) {
            return suedausgang;
        }
        if(richtung.equals("west")) {
            return westausgang;
        }
     return null;
    }
    }
  
  
  
    /**
     * 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();
    }

    /**
     * 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;
    }

    /**
     * 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.
     */
    public Raum gibAusgang(String richtung)
    {
        return ausgaenge.get(richtung);
    }
}

Ich hab die Methode gibAusgang() hinzugefügt und jetzt kommen unterhalb dieser Methode
Fehlermeldungen. Warum? Wie verbessere ich das?

edit: Sorry, Klammer zuviel.
 
Das bringt nichts.
Das ist keine Problembeschreibung.
Wieso externe Seiten?
Wieso Grafik riesig?
Wieso nicht Java code tags?
Wieso nicht mal daran gedacht, den obigen Blog zu lesen?
Hat jemand BlueJ?
Ja aber du beabsichtigst ja mit dieser Frage etwas anderes, dass sich jemand bereit erklärt , zu helfen. 😕
Nicht irritiert sein, aber ich kann hier nüx helfen.
 
Das ist für mich Trolling. Ich weiß nicht, ob ernst gemeint oder nicht! 😵
 
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
*/

class Spiel
{
    private Parser parser;
    private Raum aktuellerRaum;
 
    
    /**
     * 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;
  
        // 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");
    
        // 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);

        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 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("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;

/**
* 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 nordausgang;
    private Raum suedausgang;
    private Raum ostausgang;
    private Raum westausgang;
 
 
    /**
     * 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>();
    }
 
    public String gibBeschreibung()
    {
    return beschreibung;
    }
 
    public Raum gibAusgang(String richtung)
    {
        if(richtung.equals("north")) {
            return nordausgang;
        }
        if(richtung.equals("east")) {
            return ostausgang;
        } 
        if(richtung.equals("south")) {
            return suedausgang;
        }
        if(richtung.equals("west")) {
            return westausgang;
        }
     return null;
    }
 
 
 
 
    /**
     * 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();
    }

    /**
     * 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;
    }

    /**
     * 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.
     */
 
}

Aufgabe ist:
Führen Sie eine ähnliche Änderung auch an der Methode rauminfoAusgeben in der Klasse
Spiel durch, sodass die Details der Ausgänge nun von Raum und nicht mehr von
Spiel geliefert werden. Definieren Sie dazu eine Methode in der Klasse Raum mit folgender Signatur.

/**
* Liefere eine Beschreibung der Ausgänge dieses Raumes,
* beispielsweise
* "Ausgänge: north west".
* @Return eine Beschreibung der Ausgänge dieses Raumes.
*/
public String gibAusgaengeAlsString()


Wie schreibe ich die Methode gibAusgaengeAlsString in der Klasse Raum?
Und wie verändere ich die Methode rauminfoAusgeben in der Klasse
Spiel
?
 
Zuletzt bearbeitet:
Wie schreibe ich die Methode gibAusgaengeAlsString in der Klasse Raum?
Und wie verändere ich die Methode rauminfoAusgeben in der Klasse
Spiel
?

Naja, du öffnest die Klasse, und fängst an zu tippen... 😉

Du weißt sicherlich schon was Strings sind, oder?
Für die erste Frage musst du einfach nur die Namen der Ausgänge, die es gibt, zusammensetzen zu einem String, das sollte doch schaffbar sein?
In der Klasse spiel musst du dann nur diese Methode an der entsprechenden Stelle ausgeben - wenn du verstanden hast, was die Methoden machen, sollte das kein Problem für dich sein
 
Für die erste Frage musst du einfach nur die Namen der Ausgänge, die es gibt, zusammensetzen zu einem String, das sollte doch schaffbar sein?

Ich verstehe nicht was ich machen soll -.-
Die Namen der Ausgänge sind bis jetzt: north, south, west, east und das zu einem String zusammensetzen?

Du weißt sicherlich schon was Strings sind, oder?
Ich verstehe darunter eine Zeichenkette.
 
Code:
public String gibAusgaengeAlsString()
    {
     String ergebnis = "Ausgänge: ";
     if (nordausgang != null)
        ergebnis += "north";
     if (ostausgang != null)
        ergebnis += "east";
     if (suedausgang != null)
        ergebnis += "south";
     if (westausgang != null)
        ergebnis += "west"; 
  
        return ergebnis;
      
    }

Ich weiss nicht was genau gemeint ist, ist das damit gemeint?
Ich lese auch noch grade das Buch dazu:
https://www.amazon.de/Einführung-Java-Ideal-Studium-Ausbildung/dp/383622867X/ref=sr_1_1?ie=UTF8&qid=1504457618&sr=8-1&keywords=einführung+in+java
 
Code:
public String gibAusgaengeAlsString()
    {
     String ergebnis = "Ausgänge: ";
     if (nordausgang != null)
        ergebnis += "north";
     if (ostausgang != null)
        ergebnis += "east";
     if (suedausgang != null)
        ergebnis += "south";
     if (westausgang != null)
        ergebnis += "west";
 
        return ergebnis;
     
    }

Diesen Code?
 
Leider nicht.
Was wird da getan?
Es scheint mir, das hier jeweils abgefragt wird, ob ein von den Objekten aktiv ist und wenn ja,
soll dieser Wert dann geliefert werden.
Warum findet hier keine if/else Abfrage statt? Ist es ein Bestandteil der Aufgabe, den Code zu verbessern oder kann immer nur ein Objekt aktiv sein?
Habe das Buch leider nicht und kann nicht nachschauen.

edit:
Irgendwie werde ich das Gefühl nicht los, du willst es erzwingen.
Hör auf Menschen, die dir helfen wollen und tue dir selbst den Gefallen:
lerne von Anfang an
 
Code:
if (nordausgang != null)
        ergebnis += "north";

Null bedeutet, dass eine Variable auf kein Objekt zeigt.
!= (ungleich null) bedeutet also dann , dass wenn nordausgang auf ein Objekt zeigt,
ergebnis geliefert wird.
ergebnis += ist ne Kurzschreibweise für: ergebnis = ergebnis + north

Ist diese Aufgabe dann also gelöst?
Mit der Methode, die ich oben gepostet habe.

Und wie verändere ich die Methode rauminfoAusgeben in der Klasse
Spiel
?

Die nächsten Aufgaben werden wieder interessanter...
da müssen noch weitere Ausgänge, Räume etc hinzugefügt werden.
 
Wie lautet denn das Ergebnis von: "ergebis=ergebnis+ "north";"? Was sollte die Funktion für den Raum "draußen" ausgeben?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben