06_Praktikum-1_Zuul-schlecht/Spiel.java

188 lines
5.7 KiB
Java
Raw Permalink Normal View History

2017-09-17 17:06:55 +02:00
/**
2017-10-23 13:20:05 +02:00
* 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!
2017-09-17 17:06:55 +02:00
*
2017-10-23 13:20:05 +02:00
* Zum Spielen muss eine Instanz dieser Klasse erzeugt werden und
* an ihr die Methode "spielen" aufgerufen werden.
2017-09-17 17:06:55 +02:00
*
2017-10-23 13:20:05 +02:00
* 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.
2017-09-17 17:06:55 +02:00
*
2017-10-23 13:20:05 +02:00
* @author Michael Kölling und David J. Barnes
2017-09-17 17:06:55 +02:00
* @version 31.07.2011
*/
2017-10-23 13:20:05 +02:00
public class Spiel
{
2021-11-18 16:22:03 +01:00
private final Parser parser;
2017-10-23 13:20:05 +02:00
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
2021-11-18 16:22:03 +01:00
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);
2017-10-23 13:20:05 +02:00
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();
2021-11-18 15:52:27 +01:00
rauminfoAusgeben();
2017-10-23 13:20:05 +02:00
}
/**
* 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.
2021-11-18 16:22:03 +01:00
Raum naechsterRaum = aktuellerRaum.gibAusgang(richtung);
2017-10-23 13:20:05 +02:00
if (naechsterRaum == null) {
System.out.println("Dort ist keine Tür!");
}
else {
aktuellerRaum = naechsterRaum;
2021-11-18 15:52:27 +01:00
rauminfoAusgeben();
2017-10-23 13:20:05 +02:00
}
}
2021-11-18 15:52:27 +01:00
private void rauminfoAusgeben() {
2021-11-18 16:27:19 +01:00
System.out.println(aktuellerRaum.gibLangeBeschreibung());
2021-11-18 15:52:27 +01:00
}
2017-10-23 13:20:05 +02:00
/**
* "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.
}
}
2017-09-17 17:06:55 +02:00
}