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.xmlErstellen 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.dtdDie 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!