Sommersemester 2014
Dr. Guido Roling
https://moodle.informatik.tu-darmstadt.de/
Wildcard (*) beim Import kann man auf alle Unterklassen eines Packages
zugreifen.
Eine Klasse kann in Java mehreren Packages angehoren.
2 Fragen
1. Erklaren Sie die folgenden Begrie in eigenen Worten: Klasse, Objekt und Instanz. Geben
Sie ein Beispiel f ur jeden Begri an.
2. Was ist ein Konstruktor? Wof ur wird dieser benotigt? Wie sieht ein minimaler Konstruktor
aus?
3. Nennen Sie die wichtigsten Methoden der Assert-Klasse, die man bei einem typischen JUnit
Testcase benotigt.
4. Nennen und beschreiben Sie die vier Phasen der
Ubersetzung (Kompilierung) eines Programms.
1
GdI 1 - Sommer 2014
Ubung 9 Version: 1.0 16. 06. 2014
3 Modellierung und Test eines virtuellen Autos
1. Schreiben Sie eine Klasse Car zur Reprasentation von Autos, die folgende Anforderungen
erf ullen soll:
Ein Auto hat einen Namen vom Typ String und einen Kilometerstand (mileage) vom
Typ double. Beide Attribute sollen private, nicht public, sein.
Der Konstruktor soll einen String als Parameter erhalten, der den Namen des Autos
angibt. Der Konstruktor soll den Namen des Autos setzen und den Kilometerstand auf
0.0 setzen.
Schreiben Sie die Getter-Methoden public double getMileage() und public String getName(),
um auf die Attribute der Klasse Car zugreifen zu konnen.
Schreiben Sie die Methode void drive(double distance), die eine Distanz in Kilometern als
Argument erhalt und den Kilometerstand entsprechend aktualisiert.
Vergessen Sie nicht die Verwendung von JavaDoc-Kommentaren f ur alle Elemente, die
nach auen sichtbar sind!
Hinweis: Eclipse kann Ihnen viel von der Arbeit abnehmen, wenn Sie die Men ueintrage im
Men u
Source etwas erkunden. Allerdings sollten Sie auch in der Lage sein, diese Aufgabe
ohne Eclipse zu bearbeiten (Stichwort: Programmierung auf Papier in der Klausur)!
2. Schreiben Sie nun einen minimalen JUnit-Testcase, der die beiden folgenden Tests abdecken
soll:
Anlegen mindestens eines
fahren, der Kilometerstand uberpr uft werden, dann soll das Auto
weitere 26.8 km
Uber die Methode public String toString() kann eine Beschreibung der Entity abgefragt werden.
Siehe dazu die folgende Teilaufgabe f ur die Untertypen der Klasse Entity.
1
dazu ist die Klasse java.awt.Point zu importieren.
5
GdI 1 - Sommer 2014
Ubung 9 Version: 1.0 16. 06. 2014
Die Methode public boolean attack(String, Entity) ermoglicht den Angri auf eine andere En-
tity. Diese Methode soll true liefern, wenn der Angri erfolgreich war. Ansonsten soll false
zur uckgegeben werden. F ur die im nachsten Teil genauer erklarten Klassen Troll und Warrior
soll der String immer Melee
2
lauten, f ur Wizards hingegen ist hier der konkrete Name eines
Zauberspruchs anzugeben. Entities des Typs Priest durfen nicht angreifen.
6.2 Implementierung konkreter Entity (5 Punkte)
Denieren Sie nun die folgenden Unterklassen von Entity: Warrior (Kampfer), Wizard (Zauberer),
Priest (Priester) und Troll. Alle Unterklassen auer Trollen stehen dem Spieler bei der Erstellung einer
Spielgruppe (Party) zur Auswahl. Die Trolle dienen in diesem Rollenspiel als nicht vom Spieler
steuerbare Gegner.
Zusatzlich sollen die Unterklassen uber die folgenden zusatzlichen privaten Attribute verf ugen:
Priest, Warrior und Wizard: int xp - Experience Points (Erfahrungspunkte, XP), die angeben,
wie erfahren der Charakter ist: je mehr, desto besser.
Priest: int healing: Heilk unste, die eine feste Anzahl Lebenspunkte wiederherstellen.
Uberlegen
Sie sich dazu, wie Sie den Heileekt am besten umsetzen.
Troll, Warrior: int strength - die Angrisstarke, die den bei einem Angri verursachten (immer
gleichen) Schaden angibt.
Wizard: Spell[] spells - die dem Wizard bekannten Zauberspr uche, sowie int mana - das Mana
3
.
Bitte beachten Sie, dass Trolle hier keine Experience Points erhalten!
Finden Sie eine geeignete Implementierung mit passender Abstraktion, um moglichst gut Redundan-
zen im Code zu vermeiden, aber nicht gegen die Vererbungsregeln zu verstoen (siehe Foliensatz
T13.6-7)!
Zu den eben beschrieben Attributen m ussen wie bereits in Aufgabe 6.1 immer Getter, jedoch keine
Setter bereitgestellt werden. Zusatzlich sind folgende Methoden zu implementieren:
Priest: Eine Methode public boolean heal(Entity), die die Lebenspunkte einer ubergebenen En-
tity um den Wert der Heilk unste des Priesters erhoht.
Uberlegen Sie sich dazu, wie Sie den
Heileekt f ur die andere Entity am besten umsetzen, da der Priest nicht von Auen ein
Attribut einer anderen Entity andern soll.
Achten Sie darauf, dass der Priester nur heilen und nicht angreifen darf.
Wizard: Dem Zauberer wird durch den ubergebenen String in attack(String, Entity mitgeteilt,
welcher Zauberspruch angewandt werden soll. Dabei ist zu beachten, dass der Zauber nur
dann gewirkt werden kann, wenn der Zauberer noch uber gen ugend Mana verf ugt. Zusatzlich
konnen nur dem Wizard bekannte Zauberspr uche genutzt werden.
Implementieren Sie dazu eine Klasse Spell zur Reprasentation von Zauberspr uchen. Jeder Zau-
berspruch besteht aus drei Komponenten: dem Namen des Zaubers als String, dem Verbrauch
an Mana (int) sowie den durch den Zauber verursachten Schaden (int).
Alle vom Spieler steuerbaren Charaktere (Priest, Warrior, Wizard) erhalten nach einer erfolgrei-
chen Aktion Experience Points. Ein Angri gilt als erfolgreich, wenn dem Gegner Lebenspunkte
abgezogen wurden oder der Gegner getotet wurde. Eine Heilung gilt immer als erfolgreich
4
.
F ur jede erfolgreiche Aktion erhalt der Charakter 10 Experience Points (XP), f ur das Toten des
Gegners bei einem Angri insgesamt 20 XP. Dies soll uber die Methode public void earnXP(int)
erfolgen.
2
Nahkampf-Angri
3
Die magische Energie, von der jeder getatigte Zauberspruch eine gewisse Menge verbraucht
4
Wir verzichten zur Vereinfachung auf die Unterscheidung zwischen maximalen Hit Points und aktuellen Hit
Points. Daher erhoht jede Heilung die Hit Points eines Charakters und ist somit immer erfolgreich.
6
GdI 1 - Sommer 2014
Ubung 9 Version: 1.0 16. 06. 2014
Das Format f ur die in der vorherigen Teilaufgabe bereits erwahnte Methode public String toString()
soll wie folgt sein, wobei name, id, xpos, ypos, experience, hitPoints, strength, healPower und spells
jeweils Platzhalter f ur die konkreten Werte sind und f ur exakt ein Leerzeichen steht:
Priest: name (id): position x: xpos, y: ypos, hitPoints HP, experience XP, healPower healing power
Warrior: name (id): position x: xpos, y: ypos, hitPoints HP, experience XP, strength attack power
Wizard: name (id): position x: xpos, y: ypos, hitPoints HP, experience XP, spells
Troll: name (id): position x: xpos, y: ypos, hitPoints HP, strength attack power
Die Zauberspr uche des Wizard sollen als Aufzahlung aller Spr uche getrennt durch Semikolon
ohne Semikolon nach dem letzten Zauberspruchausgegeben werden. Jeder Zauberspruch
wird dabei durch folgenden String-Aufbau reprasentiert), wobei name, mana und dmg wie-
derum Platzhalter sind:
name: mana casting cost, dmg damage caused
Hier sehen Sie zwei Beispielausgaben f ur den Priester Aeli mit ID 5 und den Wizard Irith mit ID 1.
Der Pfeil in der Ausgabe des Wizard deutet an, dass die Zeile hier (ohne Zeilenumbruch!) weitergeht:
1 Aeli (5): position x: 20, y: 20, 120 HP, 0 XP, 45 healing power
2 Irith (1): position x: 0, y: 0, 150 HP, 0 XP, Fiery: 25 casting cost, 10 damage caused; Icy: 50
casting cost, 30 damage caused
Zu beachten: Nutzen Sie zum Zusammenbau der Beschreibung die Java-Klasse StringBuilder (siehe
Foliensatz T11.57-58). Einzelne Teilzeichenketten konnen an den StringBuilder mit Hilfe der Methode
append(...) angef ugt werden. Die so zusammengesetzte Zeichenkette kann dann mit Hilfe der Methode
public String toString() aus dem StringBuilder ausgelesen werden.
6.3 Modellierung einer Gruppe aus Charakteren (1,5 Punkte)
Die einzelnen auswahlbaren Charaktere sollen nun in einer Gruppe (Party) zusammenarbeiten
konnen. Erstellen Sie daf ur eine Klasse Party, die die folgenden Methoden bieten soll:
Ein Konstruktor public Party(int). Der Parameter ist die maximale Anzahl an Mitgliedern in der
Gruppe.
Uber die Methode boolean join(Entity) wird die ubergebene Entity der Gruppe hinzugef ugt. Trol-
le konnen dabei keiner Gruppe hinzugef ugt werden. Beachten Sie, dass eine Entity immer nur
einmalig zu einer Gruppe hinzugef ugt werden kann. Auerdem konnen keine Mitglieder hinzu-
gef ugt werden, wenn die Gruppe bereits voll besetzt ist. Die Methode soll true zur uckliefern,
wenn die Entity erfolgreich hinzugef ugt wurde, andernfalls soll false zur uckgegeben werden.
Die Methode boolean dismiss(Entity) entfernt die ubergebene Entity aus der Gruppe. Sollte die
Entity nicht in der Gruppe vorhanden sein, soll false zur uckgegeben werden. War das Entfernen
erfolgreich, soll true zur uckgegeben werden.
Die Methode int getSize() liefert die aktuelle Anzahl an Gruppenmitgliedern.
Zuletzt soll es eine Moglichkeit geben, alle Member der Gruppe als Array zu erhalten.
6.4 JUnit-Test (2 Punkte)
Schreiben Sie nun noch eine JUnit-Testklasse, die Ihre Quellen ausf uhrlich testetauch mit kom-
plexeren Ausdr ucken als dem oben stehenden und mit sich gegenseitig angreifenden Figuren.
Zu beachten: Bitte denken Sie daran, Ihre Losung gema unseren Vorgaben zu dokumentieren und
auch im korrekten Format (als Eclipse-Projekt) abzugeben!
7