Erste Schritte Befehl back implementieren

Status
Nicht offen für weitere Antworten.

Devanther

Top Contributor
Es geht immer noch um das Projekt Zuul.
Den Thread bitte nicht schließen.

Aufgabe:
Implementieren Sie den Befehl back. Dieser Befehl hat kein zweites Wort.
Die Eingabe des Befehls back soll den Spieler in dem Raum zurückbringen,
indem er zuletzt gewesen ist.

Zusatzaufgabe:
Implementieren sie den Befehl back so, dass eine wiederholte Anwendung den Spieler mehrere Räume zurückversetzt. Bei genügend häufiger Anwendung sogar an den Spielanfang.
Benutzen Sie dazu eine Stack.

Wie gehe ich an diese Aufgabe ran?
Stack. Man kann ihn sich in der Tat wie einen Stapel vorstellen, von dem immer nur das oberste Element entfernt oder hinzugefügt werden kann.
Ein Element wird durch die Methode push() dem Stapel an der Spitze hinzugefügt, durch search() im Stapel gesucht und durch pop() entfernt. Mit peek() wird jeweils das oberste Element ermittelt.

Ich speichere alle Elemente in diesem Stack. Mit peek() ermittele ich das oberste Element
und mit pop() entferne ich es. Dann werde ich automatisch immer einen Raum zurück
gebracht?

Leider steht im Buch selbst zu Stack nichts.
https://javabeginners.de/Sammlungen_und_Listen/Stack.php
https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

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

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

class Raum
{
    private String beschreibung;
    private HashMap<String, Raum> ausgaenge;        // die Ausgänge dieses Raums
    private Raum aktuellerRaum;
   
    private ArrayList<Gegenstand> gegenstaende;
   
   
   
    /**
     * Erzeuge einen Raum mit einer Beschreibung. Ein Raum
     * hat anfangs keine Ausgänge.
     * @param beschreibung enthält eine Beschreibung in der Form
     *        "in einer Küche" oder "auf einem Sportplatz".
     */
    public Raum(String beschreibung)
    {
        this.beschreibung = beschreibung;
        ausgaenge = new HashMap<String, Raum>();
        gegenstaende = new ArrayList<Gegenstand>();
       
       
    }
   
    public String gibBeschreibung()
    {
    return beschreibung;
    }   
    
   
    public void 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.
     */
   
}
 
Nehmen wir mal die Aufgabe selbst: Impelementieren sie den befehl "back". Wo wird die Eingabe ausgewertet, und was soll passieren, wenn der Nutzer "back" eingibt, d.h. Welche Funktion wird dazu aufgerufen, und was soll diese tun.

Es sollte also sowas herauskommen wie: "Wenn der Nutzer 'back' eingibt soll die Funktion 'raumZurueck() aufgerufen werden und der vorhergehende zum aktuellen Raum werden."

Damit habe ich die Aufgabe für dich schon gelöst. Du brauchst den Satz nur noch in Code umzusetzen.

Erst wenn das Funktioniert, kommt die Zusatzaufgabe.

Ein Tipp: Diesmal solltest du mehr Eigeninitiative zeigen, sonst ist das hier schneller gesperrt, als du gedacht hast.
 
Sind meine Gedanken zur Stack richtig?
Wie schreibe ich die Methode raumZurueck(), darum gehts ja.

Es sollte also sowas herauskommen wie: "Wenn der Nutzer 'back' eingibt soll die Funktion 'raumZurueck() aufgerufen werden und der vorhergehende zum aktuellen Raum werden."

Das weiss ich schon. Das Problem ist das in Code zu schreiben. Jemand nen Tipp der mich auf den richtigen Weg bringt? Brauch ich etwa wieder eine ArrayList die alle Räume speichert und dann gibt man den Wert
length -1 aus?
 
Ein Array hat die Methode length.

Code:
 for (int i = 0; i < zugriffeInStunde.length - 1; i++){

Da!
 
ArrayList:
Eine Liste mit einer flexiblen Anzahl an Elementen. Man kann unbegrenzt Elemente hinzufügen.
In einer ArrayList muss man die Art von Objekten mit angeben z.B. String
Eine ArrayList hat Methoden wie add. remove. contains. size. get.

Array:
Ein Array muss mit dem new-Operator unter Angabe einer festen Größe erzeugt werden!
Das heisst die Größe ist von Anfang an vorbestimmt.

Stack:
Siehe oben. Dazu steht im Buch leider nichts.
 
ArrayList:
Eine Liste mit einer flexiblen Anzahl an Elementen. Man kann unbegrenzt Elemente hinzufügen.
In einer ArrayList muss man die Art von Objekten mit angeben z.B. String
Eine ArrayList hat Methoden wie add. remove. contains. size. get.

Array:
Ein Array muss mit dem new-Operator unter Angabe einer festen Größe erzeugt werden!
Das heisst die Größe ist von Anfang an vorbestimmt.

Stack:
Siehe oben. Dazu steht im Buch leider nichts.

Hey,

es kann doch nicht wahr sein. Wirklich, ich glaube du machst das mit Absicht weil du uns einfach alle trollen willst. Ich habe schonmal genau diese Aussage kommentiert. Nur weil etwas nicht in deinem Buch steht heisst das nicht, dass es nicht existiert. Google kann dir helfen, es dauert keine 2 Minuten herauszufinden was ein Stack ist, aber ich habe langsam das Gefühl du willst es gar nicht verstehen.

Datenstrukturen sind die absoluten Kernelemente, die untersten Basics. Du brauchst gar nicht anfangen ein Spiel o.ä. Zu entwickeln wenn dir grundlegendste abstrakte Datentypen nichts sagen, du kein Verständnis für Logik hast und keine Eigeninitiative zeigst. Ließ dir an was Lists, Queues, Stacks, Sets odrt Maps sind, sonst wirst du nie über dein momentanes abgeschriebenes Hello Welt hinauskommen.

Fang an zu denken, das ist deine letzte Chance. Nochmal sowas und ich würde @Flown bitten auch diesen Thread zu schließen, da der TE ganz offentsichtlich unbelehrbar ist und hier mit allen Mitteln gegen uns arbeitet.

Mit freundlichen Grüßen
Sasuke
 
Wenn der Nutzer 'back' eingibt soll die Funktion 'raumZurueck() aufgerufen werden und der vorhergehende zum aktuellen Raum werden.

Du weißt also nicht, wie man das in Code umsetzt? Was sollte passieren?
1. Nutzer gibt was ein.
2. hat Nutzer "back" eingegeben?
3. wenn ja, Funktion raumZureuck() aufrufen.
4. in raumZurueck() vorherigen zum aktuellen Raum machen.
5. Rücksprung zur Eingabeschleife.

Hast du das verstanden?
 
Wirklich, ich glaube du machst das mit Absicht weil du uns einfach alle trollen willst.

Ich will hier keinen trollen!
Wenn der Thread dir nicht gefällt, musst du hier nicht lesen.
Ich bin ja auch noch Java Anfänger und habe noch nicht viel Code geschrieben bzw. gesehen.
Und dass man sich mit Hilfe von google ALLES anlesen kann ist so auch nicht richtig.
Aber natürlich geb ich mir Mühe.
Ich arbeite das Buch durch und will mich erstmal auf das Wesentliche konzentrieren.

4. in raumZurueck() vorherigen zum aktuellen Raum machen.

Wie das?
Ich kann mir die Methode raumZurueck in Code nicht vorstellen...
Je mehr Code ich gesehen habe, desto mehr Eigeninitiative kann ich zeigen.
 
Richtig. Der Rest sieht so aus:
- Variable letzterRaum deklarieren
- In der Methode wechsleRaum diesen Block
Java:
    aktuellerRaum = naechsterRaum;
    System.out.println(aktuellerRaum.gibLangeBeschreibung());
durch diesen ersetzen
Java:
    letzterRaum = aktuellerRaum;
    aktuellerRaum = naechsterRaum;
    System.out.println(aktuellerRaum.gibLangeBeschreibung());
- In der neuen Methode raumZurück folgendes machen:
Überprüfe ob letzterRaum ungleich null ist
Falls ja, gilt aktuellerRaum = letzterRaum und letzterRaum = null;
Dann noch der Vollständigkeit halber die lange Beschreibung vom aktuellen Raum ausgeben.
 
Danke! Jetzt geht die Methode back!

Stellt sich nur noch die Frage nach der Zusatzaufgabe.
Sind meine Gedanken zum "Stack" überhaupt richtig? siehe erste Seite.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben