Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland...
-
Upload
artur-straub -
Category
Documents
-
view
219 -
download
3
Transcript of Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland...
![Page 1: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/1.jpg)
Ein Textadventure AIP Aufgabe 2 14.05.2009
Fabian BergfeldPatrick BoeckhovenChristian Haberland Benjamin Jochheim
Liem Nguyen
![Page 2: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/2.jpg)
Entwürfe Dr.Little schlecht,besser Unterschiede schlecht ->besser Erweiterung um oben,unten
Erweiterung Stories 1.0 Statische Sicht Dynamische Sicht Verteilungssicht Fachliche Sicht
Erweiterung Stories 2.0 Unterschiede zu Stories 1.0
![Page 3: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/3.jpg)
![Page 4: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/4.jpg)
![Page 5: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/5.jpg)
![Page 6: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/6.jpg)
Feste Eingänge -> Erweiterungen sind schwierig
Verwendung öffentlicher Attribute
class Raum {
public String beschreibung;public Raum nordausgang;public Raum suedausgang;public Raum ostausgang;public Raum westausgang
Verletzung -> InformationHiding
![Page 7: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/7.jpg)
Private wird verwendet -> Attribute versteckt
Attribute nur über Getter und Setter zu erreichengibKurzbeschreibung()gibLangeBeschreibung()setzeAusgang()
class Raum { private String beschreibung; private HashMap ausgaenge; // die Ausgänge dieses Raums
![Page 8: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/8.jpg)
Nicht alle Parameter werden verwendet -> Interface zu breit
Schlecht für Erweiterungen -> Parameterliste müsste erweitert
Bei mehrmaligen Setzten eines Raumes, kann kein Null mehr für einen Raum gesetzt werden
public void setzeAusgaenge(Raum norden, Raum osten, Raum sueden, Raum westen) {
if(norden != null) nordausgang = norden; ...
-> InformationHiding-> hohe Kopplung
![Page 9: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/9.jpg)
Ausgang Norden und Osten bleiben beim zweiten Aufruf erhalten!!!
// Aufruf 1:setzeAusgaenge(ausgangNorden,ausgangOsten, ausgangSueden, ausgangWesten) // Aufruf 2:setzeAusgaenge(null,null, ausgangSueden, ausgangWesten);
...
Fehler beim wiederholten Aufrufen. Beispiel:
![Page 10: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/10.jpg)
alle Parameter werden verwendetAusgaenge nur durch Setter zu setzenBeliebige Richtung können eingegeben
werden(-) Keine Absicherung der Richtung
(Dubbleten)
public void setzeAusgang(String richtung, Raum nachbar) { ausgaenge.put(richtung, nachbar); }
![Page 11: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/11.jpg)
Ausgänge werden als HashMap implementiert
-> mehrere Ausgänge möglichNachteile:
(-) richtung als String ->Eingabe falscher Ausgänge
Abgeschwächt bei Verwendung von StringKonstanten
private HashMap ausgaenge; // die Ausgänge dieses Raums.... ausgaenge.put(richtung, nachbar);...
draussen.setzeAusgang("east", hoersaal);draussen.setzeAusgang(“East", labor);Besser: draussen.setzeAusgang(EAST, labor);
![Page 12: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/12.jpg)
Direkter Zugriff auf Klassen-Attribute Man muss das innere von Raum kennen Es kann die Abfrage eines Attributs vergessen werden
private void willkommenstextAusgeben(){...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 ");
-> Information Hiding-> hohe Kopplung
![Page 13: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/13.jpg)
Redundanter CodeGenauso wie in willkommenstextAusgeben()Gefahr bei Änderungen
private void wechsleRaum(Befehl befehl) {...System.out.println("Sie sind " + aktuellerRaum.gibBeschreibung());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 ");
![Page 14: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/14.jpg)
Spiel greift über gibLangeBeschreibung() auf Raum, um Ausgänge auszugeben
Spiel braucht keine Interna von Raum wissen
public String gibLangeBeschreibung() { return "Sie sind " + beschreibung + ".\n" + gibAusgaengeAlsString(); }
private String gibAusgaengeAlsString() { String ergebnis = "Ausgänge:"; Set keys = ausgaenge.keySet(); for(Iterator iter = keys.iterator(); iter.hasNext(); ) ergebnis += " " + iter.next(); return ergebnis; }
![Page 15: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/15.jpg)
Greift direkt auf interne Attribute Codeänderung bei Erweiterung von Richtung
private void wechsleRaum(Befehl befehl){.....Raum naechsterRaum = null;if (richtung.equals("north")) naechsterRaum = aktuellerRaum.nordausgang;if (richtung.equals("east")) naechsterRaum = aktuellerRaum.ostausgang;if (richtung.equals("south")) naechsterRaum = aktuellerRaum.suedausgang;if (richtung.equals("west")) naechsterRaum = aktuellerRaum.westausgang;.....
Information Hiding
![Page 16: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/16.jpg)
Ermittlung des nächsten Raumes liegt jetzt in Raum Spiel braucht keine Interna von Raum wissen Spiel greift über aktuellerRaum.gibAusgang(richtung) auf
nächsten Raum zu
class Raum {.... private HashMap ausgaenge; // die Ausgänge dieses Raums... public Raum gibAusgang(String richtung){ return (Raum)ausgaenge.get(richtung); }
![Page 17: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/17.jpg)
Feste Befehlsliste -> Feste Bestandteile von Veränderlichen trennen
Schlecht für Erweiterung Ausgabe auslagern -> trennen von Logic
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");}
(Open Closed Principle)
![Page 18: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/18.jpg)
Ausgabe aller gültigen Befehle wurde an Parser übergeben
Parser besitzt alle Befehlswoerter Gültige Befehle werden einer Stelle definiert (in
Befehlswoerter)
private void hilfstextAusgeben() { .... System.out.println("Ihnen stehen folgende Befehle zur Verfügung:"); parser.zeigeBefehle(); }class Parser {
public void zeigeBefehle() { befehle.alleAusgeben();
}
![Page 19: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/19.jpg)
Wird nur von verarbeiteBefehl() aufgerufen, daher sollte die Schnittstelle kleiner sein (nur den Raum übergeben)
private void wechsleRaum(Befehl befehl) {
![Page 20: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/20.jpg)
„Look“ wird angenommen, obwohl es nicht spezifiziert ist.
Dadurch dass „look“ nicht erwartet wird, wird es nicht abgefangen
Unerwartete Funktionalität
class Befehlswoerter{ // ein konstantes Array mit den gültigen Befehlswörtern private static final String gueltigeBefehle[] = { "go", "quit", "help", "look" };
![Page 21: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/21.jpg)
"Das Befehlswort sollte 'null' sein, wenn dieser Befehl als nicht vom Spiel erkannt gekennzeichnet werden soll.
Schlecht: Datenparameter haben eine Doppelbedeutung
public Befehl(String erstesWort, String zweitesWort) { befehlswort = erstesWort; this.zweitesWort = zweitesWort;}....public boolean istUnbekannt() { return (befehlswort == null); }
Single Responsibility Principle
![Page 22: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/22.jpg)
Liefert das Befehlswort (das erste Wort) dieses Befehls.
Wenn der Befehl nicht verstanden wurde, ist das Ergebnis 'null'.
Schlecht: Datenparameter haben eine Doppelbedeutung
Verbesserung: Exceptions im Fehlerfall
public String gibBefehlswort() { return befehlswort; }
![Page 23: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/23.jpg)
Ausgaben (hier via println) sowie das einlesen via Buffered Reader sollten von dem eigentlichen Parsen entkoppelt werden.
public Befehl liefereBefehl() {... System.out.print("> "); // Eingabeaufforderung..... BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));.....eingabezeile = eingabe.readLine();...
Single Responsibility PrincipleTrennung von Funktion und Interaktion
![Page 24: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/24.jpg)
Dr.Little schlecht und besser werden um oben+unten erweitert
![Page 25: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/25.jpg)
class Raum {... public Raum oberausgang; public Raum unterausgang;....public void setzeAusgaenge(Raum norden, Raum osten, Raum sueden, Raum westen, Raum oben, Raum unten, Raum oben, Raum unten) { if(oben != null) oberausgang = oben; if(unten != null) unterausgang = unten;...public void setzeAusgaenge(Raum norden, Raum osten, Raum sueden, Raum westen) { this.setzeAusgaenge(norden, osten, sueden, westen, null, , null, nullnull); }
![Page 26: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/26.jpg)
Class Spiel {...private void raeumeAnlegen(){ Raum aussichtsturm, keller; //Erweiterung oben+unten ....aussichtsturm = new Raum("im Aussichsturm der Uni");keller = new Raum("im Keller der Uni");....draussen.setzeAusgaenge(null, hoersaal, labor, cafeteria);hoersaal.setzeAusgaenge(null, null, null, draussen);cafeteria.setzeAusgaenge(null, draussen, null, null);labor.setzeAusgaenge(draussen, buero, null, null, null, keller);buero.setzeAusgaenge(null, null, null, labor, aussichtsturm, null);keller.setzeAusgaenge(null, null, null, null, labor, null);aussichtsturm.setzeAusgaenge(null, null, null, null, null, buero);
![Page 27: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/27.jpg)
Class Spiel {...private void willkommenstextAusgeben() {...if (aktuellerRaum.oberausgang != null) System.out.print("upstairs ");if (aktuellerRaum.unterausgang != null) System.out.print("downstairs ");....private void wechsleRaum(Befehl befehl) {if (richtung.equals("upstairs")) naechsterRaum = aktuellerRaum.oberausgang;if (richtung.equals("downstairs")) naechsterRaum = aktuellerRaum.unterausgang;...if (aktuellerRaum.oberausgang != null) System.out.print("upstairs ");if (aktuellerRaum.unterausgang != null) System.out.print("downstairs ");
![Page 28: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/28.jpg)
Class Spiel {...private void raeumeAnlegen(){...aussichtsturm = new Raum("im Aussichsturm der Uni");keller = new Raum("im Keller der Uni");....
labor.setzeAusgang("north", draussen); labor.setzeAusgang("east", buero); labor.setzeAusgang("downstairs", keller); //Erweiterung; oben+unten
buero.setzeAusgang("west", labor); buero.setzeAusgang("upstairs", aussichtsturm); //Erweiterung; oben+unten
//Erweiterung; oben+untenkeller.setzeAusgang("upstairs", labor);aussichtsturm.setzeAusgang("downstairs", buero);
![Page 29: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/29.jpg)
Erweiterung von Dr. Little-besser um Stories 1.0
![Page 30: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/30.jpg)
Demonstration
![Page 31: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/31.jpg)
![Page 32: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/32.jpg)
Erweiterung von Dr. Little-besser um Stories 2.0
![Page 33: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/33.jpg)
Demonstration
![Page 34: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/34.jpg)
Stories 2.0: GUI
![Page 35: Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570491cd1a28ab14218dee9d/html5/thumbnails/35.jpg)
Vielen Dank!