Initial commit of the source files.
This commit is contained in:
parent
b0f8ac3fd7
commit
8f9d45557f
|
@ -0,0 +1,76 @@
|
||||||
|
/**
|
||||||
|
* Diese Klasse modeliert einen Gegenstand
|
||||||
|
* mit seinem Namen und seiner Beschreibung sowie
|
||||||
|
* seinem Gewicht.
|
||||||
|
*
|
||||||
|
* @author tebe
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Gegenstand {
|
||||||
|
private final String name;
|
||||||
|
private final String beschreibung;
|
||||||
|
private final int gewicht;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erzeugt einen Gegenstand mit Namen und
|
||||||
|
* Gewicht aber ohne genauere Beschreibung.
|
||||||
|
*
|
||||||
|
* Der Name darf nicht null sein und das
|
||||||
|
* Gewicht muss groesser als 0 sein.
|
||||||
|
*
|
||||||
|
* @param name Der Name des Gegenstands
|
||||||
|
* @param gewicht Das Gewicht des Gegenstands
|
||||||
|
*/
|
||||||
|
public Gegenstand(String name, int gewicht) {
|
||||||
|
this(name, "", gewicht);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erzeugt einen Gegenstand mit Namen und
|
||||||
|
* Gewicht und genauere Beschreibung.
|
||||||
|
*
|
||||||
|
* Name und Beschreibung duerfen nicht null sein und das
|
||||||
|
* Gewicht muss groesser als 0 sein.
|
||||||
|
*
|
||||||
|
* @param name Der Name des Gegenstands
|
||||||
|
* @param gewicht Das Gewicht des Gegenstands
|
||||||
|
*/
|
||||||
|
public Gegenstand(String name, String beschreibung, int gewicht){
|
||||||
|
this.name = name;
|
||||||
|
this.gewicht = gewicht;
|
||||||
|
this.beschreibung = beschreibung;
|
||||||
|
if(! istDefinitionGueltig()) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Gegenstandsdefinition ist ungueltig.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean istDefinitionGueltig(){
|
||||||
|
return !(name == null || beschreibung == null || gewicht <= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Der Name des Gegenstands
|
||||||
|
*/
|
||||||
|
public String gibName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gibt die Beschreibung des Gegenstandes zurueck.
|
||||||
|
* Falls der Gegenstand ueber keine Beschreibung
|
||||||
|
* verfuegt, wird ein leerer String zurueckgegeben.
|
||||||
|
* @return Die Beschreibung des Gegenstands
|
||||||
|
*/
|
||||||
|
public String gibBeschreibung() {
|
||||||
|
return beschreibung;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Das Gewicht des Gegenstands
|
||||||
|
*/
|
||||||
|
public int gibGewicht() {
|
||||||
|
return gewicht;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dieser Parser liest Benutzereingaben und wandelt sie in Befehle um. Bei jedem
|
||||||
|
* Aufruf liest er eine Zeile von der Konsole und versucht, diese als einen
|
||||||
|
* Befehl aus bis zu zwei Woertern zu interpretieren. Er liefert den Befehl als
|
||||||
|
* ein Objekt der Klasse Befehl zurueck.
|
||||||
|
*
|
||||||
|
* Der Parser verfuegt ueber einen Satz an bekannten Befehlen. Er
|
||||||
|
* vergleicht die Eingabe mit diesen Befehlen. Wenn die Eingabe
|
||||||
|
* keinen bekannten Befehl enthaelt, dann liefert der Parser ein als
|
||||||
|
* unbekannter Befehl gekennzeichnetes Objekt zurueck.
|
||||||
|
*
|
||||||
|
* @author tebe
|
||||||
|
* @version 18.10.2013
|
||||||
|
*/
|
||||||
|
class Parser {
|
||||||
|
// Lieferant fuer eingegebene Befehle
|
||||||
|
private Scanner leser = new Scanner(System.in);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Der naechste Befehl des Benutzers.
|
||||||
|
*/
|
||||||
|
public Befehl liefereBefehl() {
|
||||||
|
Befehl befehl;
|
||||||
|
String eingabezeile; // fuer die gesamte Eingabezeile
|
||||||
|
|
||||||
|
System.out.print("> "); // Eingabeaufforderung
|
||||||
|
eingabezeile = leser.nextLine();
|
||||||
|
String[] woerter = eingabezeile.split(" ");
|
||||||
|
|
||||||
|
if (woerter.length >= 2) {
|
||||||
|
befehl = new Befehl(woerter[0], woerter[1]);
|
||||||
|
} else {
|
||||||
|
befehl = new Befehl(woerter[0], null);
|
||||||
|
}
|
||||||
|
return befehl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Diese Klasse modeliert eine Person, die einen Namen
|
||||||
|
* hat und einen Rucksack traegt. Im Rucksack kann sie
|
||||||
|
* Gegenstaende herumtragen. Gegenstaende sollen nur dann in den
|
||||||
|
* Rucksack gepackt werden, wenn der Rucksack nicht schwerer wird
|
||||||
|
* als die Tragkraft der Person.
|
||||||
|
*
|
||||||
|
* @author tebe
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Person {
|
||||||
|
private final String name;
|
||||||
|
private final int tragkraft;
|
||||||
|
private final ArrayList<Gegenstand> rucksack = new ArrayList<Gegenstand>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erzeugt eine Person mit Namen und Tragkraft.
|
||||||
|
* @param tragkraft
|
||||||
|
*/
|
||||||
|
public Person(String name, int tragkraft) {
|
||||||
|
this.tragkraft = tragkraft;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Gegenstand> getRucksack() {
|
||||||
|
return rucksack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gibt die Tragkraft zurueck.
|
||||||
|
* @return Die Tragkraft
|
||||||
|
*/
|
||||||
|
public int gibTragkraft() {
|
||||||
|
return tragkraft;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Der Name der Person
|
||||||
|
*/
|
||||||
|
public String gibName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,169 @@
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Diese Klasse modelliert Raeume in der Welt von Zuul.
|
||||||
|
*
|
||||||
|
* Ein "Raum" repraesentiert einen Ort in der virtuellen Landschaft des
|
||||||
|
* Spiels. Ein Raum ist mit anderen Raeumen ueber Ausgaenge verbunden.
|
||||||
|
* Fuer jeden existierenden Ausgang haelt ein Raum eine Referenz auf
|
||||||
|
* den benachbarten Raum. In einem Raum koennen sich Personen und
|
||||||
|
* Gegenstaende befinden.
|
||||||
|
*
|
||||||
|
* @author tebe (Original: Michael Koelling und David J. Barnes)
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Raum
|
||||||
|
{
|
||||||
|
private final String beschreibung;
|
||||||
|
private final ArrayList<Person> person = new ArrayList<Person>();
|
||||||
|
private final ArrayList<Gegenstand> gegenstand = new ArrayList<Gegenstand>();
|
||||||
|
private final HashMap<String, Raum> ausgaenge = new HashMap<String, Raum>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erzeuge einen Raum mit einer Beschreibung. Ein Raum
|
||||||
|
* hat anfangs keine Ausgaenge, Personen oder Gegenstaende.
|
||||||
|
* @param beschreibung enthaelt eine Beschreibung in der Form
|
||||||
|
* "in einer Kueche" oder "auf einem Sportplatz".
|
||||||
|
*/
|
||||||
|
public Raum(String beschreibung)
|
||||||
|
{
|
||||||
|
this.beschreibung = beschreibung;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Definiere einen Ausgang fuer diesen Raum.
|
||||||
|
* @param richtung Die Richtung, in der der Ausgang liegen soll
|
||||||
|
* @param nachbar Der Raum, der ueber diesen Ausgang erreicht wird
|
||||||
|
*/
|
||||||
|
public void setzeAusgang(String richtung, Raum nachbar)
|
||||||
|
{
|
||||||
|
ausgaenge.put(richtung, nachbar);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Die Person betritt den Raum und wird fortan als im Raum
|
||||||
|
* befindlich gelistet.
|
||||||
|
* @param person Person, welche den Raum betritt
|
||||||
|
*/
|
||||||
|
public void betreten(Person person)
|
||||||
|
{
|
||||||
|
this.person.add(person);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Die Person mit der angegebenen Nummer wird aus dem Raum entfernt
|
||||||
|
* und wird fortan nicht mehr als im Raum befindlich gelistet.
|
||||||
|
* Falls eine Person mit dieser Nummer nicht existiert, wird 'null'
|
||||||
|
* zurueckgegeben.
|
||||||
|
* @param nummer Nummer der Person
|
||||||
|
* @return Person, die den Raum verlassen hat
|
||||||
|
*/
|
||||||
|
public Person verlassen(int nummer)
|
||||||
|
{
|
||||||
|
boolean ungueltigerIndex = person.isEmpty() ||
|
||||||
|
nummer > person.size()-1 || nummer < 0;
|
||||||
|
return ungueltigerIndex ? null : person.remove(nummer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Der Gegenstand wird in den Raum gelegt und wird fortan als im
|
||||||
|
* Raum befindlich gelistet.
|
||||||
|
* @param gegenstand Gegenstand, welcher in den Raum gelegt wird
|
||||||
|
*/
|
||||||
|
public void hineinlegen(Gegenstand gegenstand)
|
||||||
|
{
|
||||||
|
this.gegenstand.add(gegenstand);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Der Gegenstand mit der angegebenen Nummer wird aus dem Raum entfernt
|
||||||
|
* und wird fortan nicht mehr als im Raum befindlich gelistet.
|
||||||
|
* Falls ein Gegenstand mit dieser Nummer nicht existiert, wird 'null'
|
||||||
|
* zurueckgegeben.
|
||||||
|
* @param nummer Nummer des Gegenstands
|
||||||
|
* @return Gegenstand, der herausgenommen wurde
|
||||||
|
*/
|
||||||
|
public Gegenstand herausnehmen(int nummer)
|
||||||
|
{
|
||||||
|
boolean ungueltigerIndex = gegenstand.isEmpty() ||
|
||||||
|
nummer > gegenstand.size()-1 || nummer < 0;
|
||||||
|
return ungueltigerIndex ? null : gegenstand.remove(nummer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Die kurze Beschreibung dieses Raums (die dem Konstruktor
|
||||||
|
* uebergeben wurde).
|
||||||
|
*/
|
||||||
|
public String gibKurzbeschreibung()
|
||||||
|
{
|
||||||
|
return beschreibung;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Liefere eine lange Beschreibung dieses Raums, inkl.
|
||||||
|
* Beschreibung des Rauminhaltes (Gegenstaende, Personen,...).
|
||||||
|
* @return eine lange Beschreibung dieses Raumes.
|
||||||
|
*/
|
||||||
|
public String gibLangeBeschreibung()
|
||||||
|
{
|
||||||
|
return "Sie sind " + beschreibung + ".\n"
|
||||||
|
+ gibAusgaengeAlsString()
|
||||||
|
+ gibGegenstaendeAlsString()
|
||||||
|
+ gibPersonenAlsString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String gibGegenstaendeAlsString() {
|
||||||
|
String text = "Keine Gegenstaende im Raum.\n";
|
||||||
|
if(gegenstand.size()>0) {
|
||||||
|
int counter = 0;
|
||||||
|
text = "Gegenstaende im Raum:\n";
|
||||||
|
for( Gegenstand objekt : gegenstand) {
|
||||||
|
text += " " + counter++ + ": " + objekt.gibName() + "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String gibPersonenAlsString() {
|
||||||
|
String text = "Keine Personen im Raum.\n";
|
||||||
|
if(person.size()>0){
|
||||||
|
text="Personen im Raum:\n";
|
||||||
|
int counter = 0;
|
||||||
|
for( Person objekt : person) {
|
||||||
|
text += " " + counter++ + ": " + objekt.gibName() + "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Liefere eine Zeichenkette, die die Ausgaenge dieses Raums
|
||||||
|
* beschreibt, beispielsweise
|
||||||
|
* "Ausgaenge: north west".
|
||||||
|
* @return eine Beschreibung der Ausgaenge dieses Raumes.
|
||||||
|
*/
|
||||||
|
private String gibAusgaengeAlsString()
|
||||||
|
{
|
||||||
|
String ergebnis = "Ausgaenge:";
|
||||||
|
Set<String> keys = ausgaenge.keySet();
|
||||||
|
for(String ausgang : keys)
|
||||||
|
ergebnis += " " + ausgang;
|
||||||
|
return ergebnis + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Liefere den Raum, den wir erreichen, wenn wir aus diesem Raum
|
||||||
|
* in die angegebene Richtung gehen. Liefere 'null', wenn in
|
||||||
|
* dieser Richtung kein Ausgang ist.
|
||||||
|
* @param richtung die Richtung, in die gegangen werden soll.
|
||||||
|
* @return den Raum in der angegebenen Richtung.
|
||||||
|
*/
|
||||||
|
public Raum gibAusgang(String richtung)
|
||||||
|
{
|
||||||
|
return ausgaenge.get(richtung);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,355 @@
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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, die Kontrolle von anderen Personen
|
||||||
|
* im Raum uebernehmen und Gegenstaende einpacken, sofern seine Tragkraft ausreicht.
|
||||||
|
* Das Spiel sollte auf jeden Fall noch weiter ausgebaut werden, damit es interessanter wird!
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Diese Instanz dieser Klasse erzeugt und initialisiert alle anderen Objekte
|
||||||
|
* der Anwendung: Sie legt alle Raeume und einen Parser an und startet das
|
||||||
|
* Spiel. Sie wertet auch die Befehle aus, die der Parser liefert und sorgt fuer
|
||||||
|
* ihre Ausfuehrung.
|
||||||
|
*
|
||||||
|
* @author tebe (Original: Michael Koelling und David J. Barnes)
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Spiel {
|
||||||
|
private Parser parser;
|
||||||
|
private Raum aktuellerRaum;
|
||||||
|
private Person spieler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erzeuge ein Spiel und initialisiere die Spielwelt.
|
||||||
|
*/
|
||||||
|
public Spiel() {
|
||||||
|
spielweltErzeugen();
|
||||||
|
parser = new Parser();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Baut die Spielewelt auf. Erzeugt die Raeume mit Verbindungen und fuellt
|
||||||
|
* diese mit Personen und Gegenstaenden.
|
||||||
|
*/
|
||||||
|
private void spielweltErzeugen() {
|
||||||
|
spieler = new Person("Captain Kirk", 20);
|
||||||
|
ArrayList<Raum> raeume = raeumeAnlegen();
|
||||||
|
fuellenMitPersonen(raeume);
|
||||||
|
fuellenMitGegenstaenden(raeume);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erzeuge alle Raeume, verbinde ihre Ausgaenge miteinander.
|
||||||
|
*
|
||||||
|
* @return Die angelegten Raeume
|
||||||
|
*/
|
||||||
|
private ArrayList<Raum> raeumeAnlegen() {
|
||||||
|
HashMap<String, Raum> raum = new HashMap<String, Raum>();
|
||||||
|
// die Raeume erzeugen
|
||||||
|
raum.put("draussen", new Raum("vor dem Haupteingang der Universitaet"));
|
||||||
|
raum.put("hoersaal", new Raum("in einem Vorlesungssaal"));
|
||||||
|
raum.put("cafeteria", new Raum("in der Cafeteria der Uni"));
|
||||||
|
raum.put("labor", new Raum("in einem Rechnerraum"));
|
||||||
|
raum.put("buero", new Raum("im Verwaltungsbuero der Informatik"));
|
||||||
|
// die Ausgaenge initialisieren
|
||||||
|
raum.get("draussen").setzeAusgang("osten", raum.get("hoersaal"));
|
||||||
|
raum.get("draussen").setzeAusgang("sueden", raum.get("labor"));
|
||||||
|
raum.get("draussen").setzeAusgang("westen", raum.get("cafeteria"));
|
||||||
|
raum.get("hoersaal").setzeAusgang("westen", raum.get("draussen"));
|
||||||
|
raum.get("cafeteria").setzeAusgang("osten", raum.get("draussen"));
|
||||||
|
raum.get("labor").setzeAusgang("norden", raum.get("draussen"));
|
||||||
|
raum.get("labor").setzeAusgang("osten", raum.get("buero"));
|
||||||
|
raum.get("buero").setzeAusgang("westen", raum.get("labor"));
|
||||||
|
|
||||||
|
// Startraum
|
||||||
|
aktuellerRaum = raum.get("draussen");
|
||||||
|
ArrayList<Raum> raumliste = new ArrayList<Raum>();
|
||||||
|
for (Raum r : raum.values()) {
|
||||||
|
raumliste.add(r);
|
||||||
|
}
|
||||||
|
return raumliste;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verteilt eine Anzahl Personen auf eine Liste von Raeumen. Die Zuteilung
|
||||||
|
* erfolgt auf Basis einer Zufallsstrategie.
|
||||||
|
*
|
||||||
|
* @param raum
|
||||||
|
* Liste der Raeume
|
||||||
|
*/
|
||||||
|
private void fuellenMitPersonen(ArrayList<Raum> raum) {
|
||||||
|
ArrayList<Person> person = new ArrayList<Person>();
|
||||||
|
person.add(new Person("Dr. Hans Muster", 40));
|
||||||
|
person.add(new Person("Peter Stark", 80));
|
||||||
|
person.add(new Person("Anna Pfister", 45));
|
||||||
|
person.add(new Person("Prof. Dr. Luna Berger", 35));
|
||||||
|
int counter = 0;
|
||||||
|
while (person.size() > 0) {
|
||||||
|
if (Math.random() > 0.5) {
|
||||||
|
raum.get(counter).betreten(person.get(0));
|
||||||
|
person.remove(0);
|
||||||
|
}
|
||||||
|
counter = (counter + 1) % raum.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verteilt eine Anzahl Gegenstaende auf eine Liste von Raeumen. Die
|
||||||
|
* Zuteilung erfolgt auf Basis einer Zufallsstrategie.
|
||||||
|
*
|
||||||
|
* @param raum
|
||||||
|
* Liste der Raeume
|
||||||
|
*/
|
||||||
|
private void fuellenMitGegenstaenden(ArrayList<Raum> raum) {
|
||||||
|
ArrayList<Gegenstand> gegenstand = new ArrayList<Gegenstand>();
|
||||||
|
gegenstand.add(new Gegenstand("Sehr schwerer Laserpointer", 1));
|
||||||
|
gegenstand.add(new Gegenstand("Beamer", 12));
|
||||||
|
gegenstand.add(new Gegenstand("Workstation", 10));
|
||||||
|
gegenstand.add(new Gegenstand("Wandtafel", 250));
|
||||||
|
gegenstand.add(new Gegenstand("Mineralwasser (6x1.5L)", 9));
|
||||||
|
gegenstand.add(new Gegenstand("Laptoptasche mit Laptop", 5));
|
||||||
|
gegenstand.add(new Gegenstand("Flipchart", 11));
|
||||||
|
gegenstand.add(new Gegenstand("Whiteboard", 8));
|
||||||
|
gegenstand.add(new Gegenstand("Toeggelikasten", 30));
|
||||||
|
int counter = 0;
|
||||||
|
while (gegenstand.size() > 0) {
|
||||||
|
if (Math.random() > 0.5) {
|
||||||
|
raum.get(counter).hineinlegen(gegenstand.get(0));
|
||||||
|
gegenstand.remove(0);
|
||||||
|
}
|
||||||
|
counter = (counter + 1) % raum.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Die Hauptmethode zum Spielen. Laeuft bis zum Ende des Spiels in einer
|
||||||
|
* Schleife.
|
||||||
|
*/
|
||||||
|
private void spielen() {
|
||||||
|
willkommenstextAusgeben();
|
||||||
|
|
||||||
|
// Die Hauptschleife. Hier lesen wir wiederholt Befehle ein
|
||||||
|
// und fuehren sie aus, bis das Spiel beendet wird.
|
||||||
|
boolean beendet = false;
|
||||||
|
while (!beendet) {
|
||||||
|
Befehl befehl = parser.liefereBefehl();
|
||||||
|
beendet = verarbeiteBefehl(befehl);
|
||||||
|
}
|
||||||
|
System.out.println("Danke fuer dieses Spiel. Auf Wiedersehen.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Einen Begruessungstext fuer 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 '" + Befehlswort.HILFE
|
||||||
|
+ "', wenn Sie Hilfe brauchen.");
|
||||||
|
System.out.println();
|
||||||
|
System.out.println(aktuellerRaum.gibLangeBeschreibung());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verarbeite einen gegebenen Befehl (fuehre 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;
|
||||||
|
|
||||||
|
Befehlswort befehlswort = befehl.gibBefehlswort();
|
||||||
|
|
||||||
|
switch (befehlswort) {
|
||||||
|
case UNBEKANNT:
|
||||||
|
System.out.println("Ich weiss nicht, was Sie meinen...");
|
||||||
|
break;
|
||||||
|
case UMSEHEN:
|
||||||
|
umsehen();
|
||||||
|
break;
|
||||||
|
case HILFE:
|
||||||
|
hilfstextAusgeben();
|
||||||
|
break;
|
||||||
|
case GEHE:
|
||||||
|
wechsleRaum(befehl);
|
||||||
|
break;
|
||||||
|
case BEENDEN:
|
||||||
|
moechteBeenden = beenden(befehl);
|
||||||
|
break;
|
||||||
|
case UEBERNIMM:
|
||||||
|
uebernimm(befehl);
|
||||||
|
break;
|
||||||
|
case NIMM:
|
||||||
|
nimm(befehl);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
System.out.println("Befehlswort ohne zugehoerige Aktion.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return moechteBeenden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void umsehen() {
|
||||||
|
System.out.println("Sie sind: " + spieler.gibName());
|
||||||
|
System.out.println(aktuellerRaum.gibLangeBeschreibung());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Packt den spezifizierten Gegenstand in den Rucksack
|
||||||
|
* des Spielers und entfernt ihn aus dem aktuellen Raum.
|
||||||
|
*
|
||||||
|
* Falls der bezeichnete Gegenstand nicht vorhanden ist, aendert sich nichts.
|
||||||
|
*
|
||||||
|
* @param befehl Der auszufuehrende Befehl
|
||||||
|
*/
|
||||||
|
private void nimm(Befehl befehl) {
|
||||||
|
if (befehl.hatZweitesWort()) {
|
||||||
|
int kennummer = Integer.parseInt(befehl.gibZweitesWort());
|
||||||
|
gegenstandEinpacken(kennummer);
|
||||||
|
} else {
|
||||||
|
System.out.println("Geben Sie die Nummer des Gegenstands an.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Packt den Gegenstand mit der gegebenen
|
||||||
|
* Nummer, falls vorhanden, in den Rucksack
|
||||||
|
* des Spielers und entfernt ihn aus dem aktuellen Raum.
|
||||||
|
*
|
||||||
|
* @param nummer Nummer des Gegenstands
|
||||||
|
*/
|
||||||
|
private void gegenstandEinpacken(int nummer) {
|
||||||
|
Gegenstand gegenstand = aktuellerRaum.herausnehmen(nummer);
|
||||||
|
if (gegenstand == null) {
|
||||||
|
System.out.println("Es gibt keinen Gegenstand mit dieser Nummer: "
|
||||||
|
+ nummer);
|
||||||
|
} else {
|
||||||
|
if (spieler.gibTragkraft() >= berechneGewicht(spieler.getRucksack()) + gegenstand.gibGewicht()) {
|
||||||
|
System.out.println("Gegenstand eingepackt: " + gegenstand.gibName());
|
||||||
|
spieler.getRucksack().add(gegenstand);
|
||||||
|
} else {
|
||||||
|
System.out
|
||||||
|
.println("Gegenstand konnte nicht eingepackt werden.");
|
||||||
|
aktuellerRaum.hineinlegen(gegenstand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Berechnet das Gewicht der Gegenstaende in dieser Liste
|
||||||
|
* @param rucksack Die Liste mit Gegenstaenden
|
||||||
|
* @return Das Gewicht der Gegenstaende
|
||||||
|
*/
|
||||||
|
private int berechneGewicht(ArrayList<Gegenstand> rucksack) {
|
||||||
|
int gewicht = 0;
|
||||||
|
for(Gegenstand gegenstand : rucksack) {
|
||||||
|
gewicht += gegenstand.gibGewicht();
|
||||||
|
}
|
||||||
|
return gewicht;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uebernimmt die Kontrolle der spezifizierten Person. Der Spieler steuert
|
||||||
|
* anschliessend neu diese Person.
|
||||||
|
*
|
||||||
|
* Falls die bezeichnete Person nicht vorhanden ist, aendert sich nichts.
|
||||||
|
*
|
||||||
|
* @param befehl
|
||||||
|
* Der auszufuehrende Befehl
|
||||||
|
*/
|
||||||
|
private void uebernimm(Befehl befehl) {
|
||||||
|
if (befehl.hatZweitesWort()) {
|
||||||
|
int nummer = Integer.parseInt(befehl.gibZweitesWort());
|
||||||
|
personUebernehmen( nummer);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
System.out.println("Geben Sie die Nummer der Person an.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uebernimmt, falls vorhanden, die Kontrolle der
|
||||||
|
* Person mit der spezifizierten Nummer.
|
||||||
|
*
|
||||||
|
* @param nummer Nummer der Person
|
||||||
|
*/
|
||||||
|
private void personUebernehmen(int nummer) {
|
||||||
|
Person person = aktuellerRaum.verlassen(nummer);
|
||||||
|
if (person == null) {
|
||||||
|
System.out.println("Es gibt keine Person mit Nummer " + nummer);
|
||||||
|
} else {
|
||||||
|
aktuellerRaum.betreten(spieler);
|
||||||
|
spieler = person;
|
||||||
|
System.out.println("Sie kontrollieren nun " + spieler.gibName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gib Hilfsinformationen aus. Hier geben wir eine etwas alberne und unklare
|
||||||
|
* Beschreibung aus, sowie eine Liste der Befehlswoerter.
|
||||||
|
*/
|
||||||
|
private void hilfstextAusgeben() {
|
||||||
|
System.out.println("Sie haben sich verlaufen. Sie sind allein.");
|
||||||
|
System.out.println("Sie irren auf dem Unigelaende herum.");
|
||||||
|
System.out.println();
|
||||||
|
befehleAusgeben();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gibt eine Liste der vorhandenen Befehlswoerter aus.
|
||||||
|
*/
|
||||||
|
private void befehleAusgeben() {
|
||||||
|
System.out.println("Ihnen stehen folgende Befehle zur Verfuegung:");
|
||||||
|
System.out.println(Befehlswort.gibBefehlsworteAlsText());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 moechten 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 Tuer!");
|
||||||
|
} else {
|
||||||
|
aktuellerRaum = naechsterRaum;
|
||||||
|
System.out.println(aktuellerRaum.gibLangeBeschreibung());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Der Befehl zum Beenden wurde eingegeben. Ueberpruefe 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue