/** * 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 static String NORTH = "north"; private final static String EAST = "east"; private final static String SOUTH = "south"; private final static String WEST = "west"; 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; 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"); draussen.setzeAusgaenge(EAST, hoersaal); draussen.setzeAusgaenge(SOUTH, labor); draussen.setzeAusgaenge(WEST, cafeteria); hoersaal.setzeAusgaenge(WEST, draussen); cafeteria.setzeAusgaenge(EAST, draussen); labor.setzeAusgaenge(NORTH, draussen); labor.setzeAusgaenge(EAST, buero); buero.setzeAusgaenge(WEST, labor); aktuellerRaum = 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(); } } /** * "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(); } }