diff --git a/.gitignore b/.gitignore index 32858aa..80a5c64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,17 @@ +<<<<<<< HEAD *.class +======= +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +>>>>>>> 48ee561645428ff48d44bf22aa7842719ae898e0 # Mobile Tools for Java (J2ME) .mtj.tmp/ @@ -7,6 +19,12 @@ *.jar *.war *.ear +<<<<<<< HEAD +======= +*.zip +*.tar.gz +*.rar +>>>>>>> 48ee561645428ff48d44bf22aa7842719ae898e0 # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* diff --git a/Raum.java b/Raum.java index 8801b2e..6c8c093 100644 --- a/Raum.java +++ b/Raum.java @@ -1,8 +1,3 @@ - - -import java.util.HashMap; -import java.util.Set; - /** * Diese Klasse modelliert Räume in der Welt von Zuul. * @@ -15,76 +10,56 @@ import java.util.Set; * @author Michael Kölling und David J. Barnes * @version 31.07.2011 */ -public class Raum { - private String beschreibung; - private HashMap ausgaenge; +public class Raum +{ + public String beschreibung; + public Raum nordausgang; + public Raum suedausgang; + public Raum ostausgang; + public 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; - this.ausgaenge = new HashMap<>(); - } + /** + * 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; + } - /** - * Definiert die Ausgänge dieses Raums. - * - * @param richtung - * Die Richtung (north, east, south, west) - * @param raum - * Der nächste Raum - */ - public void setzeAusgaenge(String richtung, Raum raum) { - ausgaenge.put(richtung, raum); - } + /** + * Definiere die Ausgänge dieses Raums. Jede Richtung + * führt entweder in einen anderen Raum oder ist 'null' + * (kein Ausgang). + * @param norden Der Nordausgang. + * @param osten Der Ostausgang. + * @param sueden Der Südausgang. + * @param westen Der Westausgang. + */ + public void setzeAusgaenge(Raum norden, Raum osten, + Raum sueden, Raum westen) + { + if(norden != null) { + nordausgang = norden; + } + if(osten != null) { + ostausgang = osten; + } + if(sueden != null) { + suedausgang = sueden; + } + if(westen != null) { + westausgang = westen; + } + } - /** - * Gibt den Raum für eine Richtung zurück - * - * @param richtung - * Die Richtung (north, east, south, west) - * @return Der nächste Raum - */ - public Raum gibAusgang(String richtung) { - return ausgaenge.get(richtung); - } - - /** - * @return die Beschreibung dieses Raums. - */ - public String gibBeschreibung() { - return beschreibung; - } - - /** - * Liefert eine Beschreibung der Ausgänge dieses Raumes, bespielsweise - * "Ausgänge: north west". - * - * @return eine Beschreibung der verfügbaren Ausgänge - */ - public String gibAusgaengeAlsString() { - String resultat = "Ausgänge:"; - Set ausgaengeSet = ausgaenge.keySet(); - for (String ausgang : ausgaengeSet) { - resultat += " " + ausgang; - } - return resultat; - } - - /** - * Liefert eine lange Beschreibung dieses Raumes, in der Form - * Sie sind in der Küche - * Ausgänge: north west - * - * @return eine lange Beschreibung dieses Raumes. - */ - public String gibLangeBeschreibung() { - return "Sie sind " + beschreibung + ".\n" + gibAusgaengeAlsString(); - } + /** + * @return die Beschreibung dieses Raums. + */ + public String gibBeschreibung() + { + return beschreibung; + } } diff --git a/Spiel.java b/Spiel.java index 3eec68b..fe0750b 100644 --- a/Spiel.java +++ b/Spiel.java @@ -1,217 +1,215 @@ - - /** - * 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! + * 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. + * Zum Spielen muss eine Instanz dieser Klasse erzeugt werden und + * an ihr die Methode "spielen" aufgerufen werden. * - * Diese Instanz 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. + * Diese Instanz 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 + * @author Michael Kölling und David J. Barnes * @version 31.07.2011 */ -public class Spiel { - private final static String NORTH = "north"; - private final static String EAST = "east"; - private final static String SOUTH = "south"; - private final static String WEST = "west"; +public class Spiel +{ + private Parser parser; + private Raum aktuellerRaum; + + /** + * Erzeuge ein Spiel und initialisiere die interne Raumkarte. + */ + public Spiel() + { + raeumeAnlegen(); + parser = new Parser(); + } - private Parser parser; - private Raum aktuellerRaum; + /** + * 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.setzeAusgaenge(null, hoersaal, labor, cafeteria); + hoersaal.setzeAusgaenge(null, null, null, draussen); + cafeteria.setzeAusgaenge(null, draussen, null, null); + labor.setzeAusgaenge(draussen, buero, null, null); + buero.setzeAusgaenge(null, null, null, labor); - /** - * Erzeuge ein Spiel und initialisiere die interne Raumkarte. - */ - public Spiel() { - raeumeAnlegen(); - parser = new Parser(); - } + aktuellerRaum = draussen; // das Spiel startet draussen + } - /** - * Erzeuge alle Räume und verbinde ihre Ausgänge miteinander. - */ - private void raeumeAnlegen() { - Raum draussen, hoersaal, cafeteria, labor, buero; + /** + * Die Hauptmethode zum Spielen. Läuft bis zum Ende des Spiels + * in einer Schleife. + */ + public void spielen() + { + willkommenstextAusgeben(); - 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 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."); + } - draussen.setzeAusgaenge(EAST, hoersaal); - draussen.setzeAusgaenge(SOUTH, labor); - draussen.setzeAusgaenge(WEST, cafeteria); + /** + * Einen Begrüssungstext 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("Sie sind " + aktuellerRaum.gibBeschreibung()); + System.out.print("Ausgänge: "); + if(aktuellerRaum.nordausgang != null) { + System.out.print("north "); + } + if(aktuellerRaum.ostausgang != null) { + System.out.print("east "); + } + if(aktuellerRaum.suedausgang != null) { + System.out.print("south "); + } + if(aktuellerRaum.westausgang != null) { + System.out.print("west "); + } + System.out.println(); + } - hoersaal.setzeAusgaenge(WEST, draussen); + /** + * 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; - cafeteria.setzeAusgaenge(EAST, draussen); + 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); + } + + return moechteBeenden; + } - labor.setzeAusgaenge(NORTH, draussen); - labor.setzeAusgaenge(EAST, buero); + // Implementierung der Benutzerbefehle: - buero.setzeAusgaenge(WEST, labor); + /** + * 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:"); + System.out.println(" go quit help"); + } - aktuellerRaum = draussen; - } + /** + * 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; + } - /** - * Die Hauptmethode zum Spielen. Läuft bis zum Ende des Spiels in einer - * Schleife. - */ - public void spielen() { - willkommenstextAusgeben(); + String richtung = befehl.gibZweitesWort(); - // Die Hauptschleife. Hier lesen wir wiederholt Befehle ein - // und führen sie aus, bis das Spiel beendet wird. + // Wir versuchen, den Raum zu verlassen. + Raum naechsterRaum = null; + if(richtung.equals("north")) { + naechsterRaum = aktuellerRaum.nordausgang; + } + if(richtung.equals("east")) { + naechsterRaum = aktuellerRaum.ostausgang; + } + if(richtung.equals("south")) { + naechsterRaum = aktuellerRaum.suedausgang; + } + if(richtung.equals("west")) { + naechsterRaum = aktuellerRaum.westausgang; + } - boolean beendet = false; - while (!beendet) { - Befehl befehl = parser.liefereBefehl(); - beendet = verarbeiteBefehl(befehl); - } - System.out.println("Danke für dieses Spiel. Auf Wiedersehen."); - } + if (naechsterRaum == null) { + System.out.println("Dort ist keine Tür!"); + } + else { + aktuellerRaum = naechsterRaum; + System.out.println("Sie sind " + aktuellerRaum.gibBeschreibung()); + System.out.print("Ausgänge: "); + if(aktuellerRaum.nordausgang != null) { + System.out.print("north "); + } + if(aktuellerRaum.ostausgang != null) { + System.out.print("east "); + } + if(aktuellerRaum.suedausgang != null) { + System.out.print("south "); + } + if(aktuellerRaum.westausgang != null) { + System.out.print("west "); + } + System.out.println(); + } + } - /** - * Einen Begrüssungstext 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(); - rauminfoAusgeben(); - } - - /** - * 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); - } - - 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:"); - System.out.println(" go quit help"); - } - - /** - * 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; - rauminfoAusgeben(); - } - } - - /** - * "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. - } - } - - private void rauminfoAusgeben() { - - // Lösung A6 - System.out.println(aktuellerRaum.gibLangeBeschreibung()); - - // Lösung A3 - // System.out.println("Sie sind " + aktuellerRaum.gibBeschreibung()); - - // Lösung A5 - // System.out.println(aktuellerRaum.gibAusgaengeAlsString()); - - // Lösung A3 - // System.out.print("Ausgänge: "); - // if (aktuellerRaum.nordausgang != null) { - // System.out.print("north "); - // } - // if (aktuellerRaum.ostausgang != null) { - // System.out.print("east "); - // } - // if (aktuellerRaum.suedausgang != null) { - // System.out.print("south "); - // } - // if (aktuellerRaum.westausgang != null) { - // System.out.print("west "); - // } - // System.out.println(); - - // Lösung A4 - // 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(); - } + /** + * "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. + } + } }