218 lines
6.0 KiB
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();
|
||
|
}
|
||
|
}
|