06_Praktikum-1_Zuul-schlecht/Spiel.java

218 lines
6.0 KiB
Java

/**
* 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();
}
}