/** * 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 Kolling and David J. Barnes * @version 1.0 (March 2003) */ 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). * Wenn der Befehl das Spiel beendet, wird 'true' zurückgeliefert, * andernfalls 'false'. */ private boolean verarbeiteBefehl(Befehl befehl) { boolean moechteBeenden = false; if(befehl.istUnbekannt()) { System.out.println("Ich weiß 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:"); parser.zeigeBefehle(); } /** * Versuche, den Raum zu wechseln. 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. Liefere '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. } }