Im Rahmen der Entwicklung eines Memory-Spiels soll als Speicherformat XML eingesetzt werden, um den aktuellen Spielstand zu beliebigen Zeitpunkten des Spiels speichern und laden zu können.
Zuerst ist ein XML Schema und ein entsprechendes XML Instanzdokument zu erstellen. Aufbauend darauf ist eine DTD zu erstellen, die soweit wie möglich dieselbe Struktur für das XML Instanzdokument vorgibt wie das XML Schema.
Erstellen Sie im ersten Teil dieser Übung ein XML Schema und ein XML Instanzdokument. Halten Sie sich bei dem Entwurf des Schemas an die folgenden Vorgaben:
http://www.dbai.tuwien.ac.at/education/ssd/SS11/uebung/Memory
lauten.column
und row
vom Typ int
als verpflichtend.id
vom Typ string
als verpflichtend.key
vom Typ string
als verpflichtend.
Die Schlüssel im Instanzdokument sollen dabei folgende Form einhalten: id_column_row. Sie müssen die Einhaltung dieser
Form aber nicht explizit im Schema sicherstellen.current-state
als verpflichtend. Stellen Sie sicher, dass der current-state
ausschließlich einen der folgenden 4 Werte annehmen kann: Integer-Werte 0
oder 1
, String-Werte COVERED
oder UNCOVERED
.uncover-count
vom Typ int
. Der uncover-count soll per default den Wert 0 annehmen.card1
und card2
vom Typ string
als verpflichtend.is-match
vom Typ boolean
. Per Default soll hier der Wert false
angenommen werden.player-description
und einem
weiterem optionalem Element uncovered-pairs
.player-description
wird verwendet um eine kurze Beschreibung der am Spiel teilnehmenden SpielerInnen speichern zu können.
Es soll gemischten Inhalt zulassen. Wobei neben Text als einziges Kindelement das Element date
vom Typ date
beliebig oft vorkommen darf.uncovered-pairs
soll den zuvor global definierten Typ MemoryCardPairs verwenden.
Es wird dazu verwendet alle bisher von diesem SpielerInnen aufgedeckten Kartenpaare (egal ob diese übereinstimmen oder nicht) zu speichern.name
vom Typ string
.spent-time
vom Typ long
. Schränken Sie den Wertebereich auf Zahlen größer oder gleich null ein.table, players, covered-pairs
(optional), uncovered-pairs (optional)
.table
wird verwendet um alle in einem Spiel befindlichen Karten zu speichern. Es besteht aus mindestens 2
Elementen namens card
von dem zuvor definiertem Typ MemoryCard.players
wird verwendet um alle an einem Spiel teilhabenden SpielerInnen zu speichern. Es besteht aus mindestens
einem Element player
von dem zuvor definiertem Typ MemoryPlayer.covered-pairs
und uncovered-pairs
werden dafür
verwendet alle im Spiel gefundenen bzw. nicht gefundenen Kartenpaare zu speichern.
Verwenden Sie für beide Elemente den zuvor definierten Typ MemoryCardPairs.current-player
vom Typ string
optional
verwendet werden. Dieses referenziert den Namen eines SpielerInnen, welcher in dem Element players
gespeichert ist.current-card1
und current-card2
als optional vom Typ string
, welche jeweils den Schlüssel einer Karte aus dem Element
cards
referenzieren.current-state
das ausschließlich die Werte 0 bis 4 als Integer oder NO_CARD, CARD1, CARD2_MATCH, CARD2_UNMATCH und GAME_OVER als String
annehmen darf.current-turn-started
vom Typ long
als mit Werten ausschließlich größer oder gleich 0),
sowie der Zeitpunkt an dem das Spiel überhaupt gestartet wurde (Optionales Attribut game-started
vom Typ date
).game
. Verwenden Sie dafür den zuvor
definierten Typ MemoryGamename
in allen player
-Elementen muss eindeutig sein
und kann als Schlüssel verwendet werden.key
in allen card
-Elementen muss eindeutig sein und kann als
Schlüssel verwendet werden.current-player
im game
-Element muss den Namen eines Spielers/einer Spielerin referenzieren
(name Attribut in player-Element).current-card1
und current-card2
im game
-Element müssen
den Schlüssel einer Karte referenzieren (key Attribut in card-Element).card1
und card2
in den pair
-Elementen müssen
den Schlüssel einer Karte referenzieren (key Attribut in card-Element).Das XML-Dokument soll die unterschiedlichen Möglichkeiten veranschaulichen und daher möglichst viele beschriebenen Einschränkungen abdecken (optionale Elemente, verschiedene Werte für Attribute etc.)
Es bietet sich zudem an, die intendierten Schlüssel (key/keyref), mit gültigen und bezüglich dem Schema ungültigen Instanzdokumenten zu testen.
Beachten Sie, dass Sie alle oben angeführten Vorgaben umsetzen müssen, um die volle Punktezahl erhalten zu können.
Benennen Sie die Schemadatei mit memory.xsd
und das Instanzdokument mit
memory.xml
.
überprüfen Sie Ihre Lösung mit dem Befehl
xmllint --schema memory.xsd memory.xml
.
memory.xsd
, memory.xml
Erstellen Sie im zweiten Teil eine Document Type Definition, die soweit wie möglich dieselbe Struktur für das XML Instanzdokument vorgibt wie das XML Schema, das Sie im ersten Teil erstellt haben.
Beachten Sie:
game
kann in der DTD nur sehr schwer ausgedrückt werden, da der Parser diesen als deterministisch ansehen
muss. Hier reicht es, wenn Sie die genaue Elementabfolge ihres Instanzdokumentes als verpflichtend definieren (wobei die Elemente
covered-pairs
und uncovered-pairs
weiterhin optional sein sollen).Benennen Sie die DTD mit memory.dtd
.
Prüfen Sie die DTD gegen das XML-Dokument aus dem ersten Teil mit dem Befehl
xmllint --dtdvalid memory.dtd memory.xml
.
memory.dtd
Die Beispiele müssen bis zum Abgabetermin auf unserem Server
(bordo.dbai.tuwien.ac.at) im Unterverzeichnis beispiel2
ihres Home-Verzeichnisses verfügbar sein (die Dateien werden automatisch
abgesammelt und den Tutorinnen und Tutoren zur Verfügung gestellt).
Insgesamt erstellen Sie also 3 Dateien (1-mal XML Schema, 1-mal XML, 1-mal DTD).
Überprüfen Sie Ihre Abgabe direkt auf dem Server! Die notwendigen Tools sind installiert, und die Tutorinnen und Tutoren prüfen Ihre Abgabe ebenfalls direkt am Server. Laden Sie außer den Abgabedateien keine weiteren Dateien auf den Server!
Für das Beispiel 2 werden maximal 10 Punkte vergeben. Im Rahmen des Kontrollgespräches wird nicht nur die Korrektheit, sondern vor allem das Verständnis der Technologien kontrolliert.
Die volle Punktezahl gibt es nur wenn das Beispiel korrekt gelöst ist und die Lösung erklärt werden kann. Nicht selbstständig gelöste Abgaben werden jedenfalls mit 0 Punkten bewertet!