FH Darmstadt
FB Informatik
Prof.Dr.H.P.Weber |
Programmieren II
Übungsklausur
|
Juni 2005
|
Wesentliches Element vieler rundenbasierter Strategiespiele ist das Konzept der 'Stadt'
(Town): Vom
Spieler angelegte Objekte vom Typ Town sind für die Produktion sowohl von
Einheiten (wird hier nicht weiter betrachtet) als auch von Ressourcen wie Geld, Forschung, Luxusgüter
(darum soll es im folgenden gehen) zuständig.
|
| Anforderungen für die Noten ausreichend und befriedigend: |
Realisieren Sie die Klasse Town zusammen mit einem Anwendungsprogramm zum
Testen. Hierbei soll folgendes gelten:
-
Attribute von Town-Objekten sind name (Name der Stadt), size (Größe der Stadt),
money (Geldmenge, die jede Runde produziert wird), research
(Forschungsergebnisse, die jede Runde produziert werden), luxuryGoods
(Luxusgüter, die jede Runde produziert werden). name ist vom Typ string und wird
vom Konstruktor aus dem Anwendungsprogramm übernommen, alle anderen Attribute
sind vom Typ int und werden bei der Erzeugung einer Stadt mit dem Wert 1
initialisiert.
-
Die Methode grow erhöht alle Attribute eines Town-Objektes (außer name) um den
Wert 1.
-
Der überladene operator<< gibt als erstes den Namen der Stadt und dann die aktuellen
Werte aller anderen Attribute in einer geeigneten Formatierung aus.
-
Das Anwendungsprogramm soll dem Benutzer ein Menü mit den vier Alternativen
-
Neue Stadt
-
Nächste Runde
-
Alle Städte anzeigen
-
Spiel beenden
anbieten.
-
Wenn der Benutzer 'Neue Stadt' auswählt, soll er nach einem Namen gefragt werden
und, nachdem dieser eingelesen wurde, ein Town-Objekt mit diesem Namen erzeugt werden. Dieses Objekt soll in eine
verkettete Liste allTowns eingefügt werden.
-
Wenn der Benutzer 'Nächste Runde' auswählt, soll ein Rundenzähler inkrementiert
werden. Alle drei Runden wird die grow-Methode für alle Städte in der Liste
aufgerufen.
-
Wenn der Benutzer 'Alle Städte anzeigen' auswählt, sollen alle
Städte in der Liste in alphabetischer Reihenfolge (Sortierung nach
ASCII-Code reicht aus) der Namen der Städte ausgegeben werden.
- Hinweis: Es ist erlaubt und sinnvoll, für die verkettete Liste std::list aus
der STL zu benutzen.
| Anforderungen für die Note gut: |
Die Leistungsfähigkeit eines Town-Objektes wird neben seiner Größe vor allem
von den in der Stadt vorhandenen Gebäuden unterschiedlicher Art bestimmt.
Realisieren Sie eine einfache Vererbungshierarchie für die Gebäude, die eine
Stadt haben kann. Hierbei gilt folgendes:
-
Basisklasse ist die abstrakte Klasse Building. Sie enthält die rein virtuelle
Methode improveTown, über die die Ressourcenproduktion der Stadt
durch Gebäude verbessert werden kann. Außerdem enthält sie als Attribut eine
Referenz auf Town, die vom Konstruktor auf diejenige Stadt gesetzt wird, zu der
das jeweilige Gebäude gehört.
-
Von Building abgeleitet sind die Klassen MoneyBuilding (mit dem int-Attribut
moneyAdder) und ResearchBuilding (mit dem
double-Attribut researchFactor).
-
Von MoneyBuilding abgeleitet sind die Klassen Marketplace und Bank. Bei der
Erzeugung eines Marketplace-Objekts wird sein moneyAdder
auf den Wert 5
gesetzt, bei der Erzeugung eines Bank-Objekts wird sein moneyAdder auf den Wert
10 gesetzt.
-
Von ResearchBuilding abgeleitet sind die Klassen Library und University. Bei der
Erzeugung eines Library-Objekts wird sein researchFactor auf den Wert
1.3 gesetzt,
bei der Erzeugung eines University-Objekts wird sein researchFactor auf den Wert
1.5 gesetzt.
-
Die Methode improveTown soll für Marketplace und Bank die entsprechenden
moneyAdder-Werte zum Attribut money der Stadt addieren. Im Fall von Library und
University sollen die researchFactor-Werte mit dem Attribut research der Stadt
multipliziert werden.
-
Ergänzen Sie in der Town-Klasse als Attribut eine verkettete Liste von Building*-Zeigern.
-
Ergänzen Sie im Benutzer-Menü einen Punkt
-
Neues Gebäude für vorhandene Stadt
wo dem Benutzer eine Auflistung der möglichen Gebäude zur Auswahl angezeigt wird.
Nachdem ein Gebäude ausgewählt wurde, soll nach dem Namen der Stadt gefragt
werden, zu der das Gebäude hinzugefügt wird. Das Gebäude-Objekt wird dann
dynamisch erzeugt und in die Building*-Liste der betreffenden
Stadt eingefügt. Hierfür soll die Town-Klasse um eine Methode insertBuilding
ergänzt werden.
- Damit die vorhandenen Gebäude die Ressourcenerzeugung in einer Stadt
beeinflussen, wird die Methode grow ergänzt: Sie soll nach der
oben angesprochenen Inkrementierung der Attribute einer Stadt die Building*-Liste
der Stadt durchgehen und für jedes vorhandene Gebäude improveTown aufrufen.
| Anforderungen für die Note sehr gut: |
Der Benutzer soll die Möglichkeit haben, den Spielstand zu einem beliebigen
Zeitpunkt abzuspeichern und vorher gespeicherte Spielstände wieder zu laden. Dabei gilt folgendes:
-
Ergänzen Sie im Benutzer-Menü die Punkte
-
Spiel speichern
-
Spiel laden
Hierbei soll der Benutzer jeweils aufgefordert werden, den Namen der Datei
anzugeben, in die der Spielstand gespeichert bzw. aus der der Spielstand geladen
werden soll.
-
Beim Speichern eines Spiels sollen alle Informationen, die den aktuellen
Spielstand kennzeichnen, in einer Textdatei abgelegt werden. Dazu gehört auch,
dass in einer geeigneten Form für jede Stadt festgehalten wird, welche Gebäude
sie besitzt. Nutzen Sie hierzu die Möglichkeiten der Typinformationen zur
Laufzeit (RTTI), indem Sie z.B. typeid einsetzen.