/** * 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 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 */ public class Spiel { private final 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.setzeAusgaenge("Ost", hoersaal); draussen.setzeAusgaenge("Süd", labor); draussen.setzeAusgaenge("West", cafeteria); hoersaal.setzeAusgaenge("West", draussen); cafeteria.setzeAusgaenge("Ost", draussen); labor.setzeAusgaenge("Nord", draussen); labor.setzeAusgaenge("Ost", buero); buero.setzeAusgaenge("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ü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(); } } private void rauminfoAusgeben() { 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. } } }