Erläuterung zu dem Ablauf eines Spielzugs

Software Engineering I, SS14

Ein Spielzug in Carcassonne läuft in drei Schritten ab:

  1. Karte ziehen
  2. Karte ausspielen
  3. Spielstein auslegen

Für jeden dieser drei Schritte gibt es jeweils einen eigenen Command. Der dritte Schritt kann alternativ mit END_TURN übersprungen werden.

Alle Änderungen am Datenmodell des Server, die diese Commands auslösen werden wie gewohnt über JSON Event an alle Teilnehmer eines Spiels übertragen. Im Folgenden soll verdeutlicht werden, wie ausgespielte Karten und Spielsteine lokalisiert werden können.

 

Wo und wie werden Karten angelegt?

Zu Beginn eines Zuges muss zuerst eine Karte gezogen werden. In diesem Beispiel wird eine Karte vom Typ A gezogen:

Single card A

 

 

 

 

 

 

 

Die hierzu verschickten Events sind vergleichbar zu folgendem:

  1. {“@ts”:”1402044757843″,”@src”:”Field@24640285″,”@prop”:”rotation”,”@nv”:”R0″}
  2. {“@ts”:”1402044757843″,”@src”:”Field@24640285″,”@prop”:”name”,”@nv”:”A”}
  3. {“@ts”:”1402044757843″,”@src”:”Field@24640285″,”@prop”:”meeplePositions”,”@nv”:”MeeplePosition@21e17c6d”}
  4. {“@ts”:”1402044757843″,”@src”:”Field@24640285″,”@prop”:”meeplePositions”,”@nv”:”MeeplePosition@5aafe97b”}
  5. {“@ts”:”1402044757843″,”@src”:”Field@24640285″,”@prop”:”meeplePositions”,”@nv”:”MeeplePosition@5309b8c0″}
  6. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@21e17c6d”,”@prop”:”field”,”@nv”:”Field@24640285″}
  7. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@21e17c6d”,”@prop”:”name”,”@nv”:”1″}
  8. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@21e17c6d”,”@prop”:”meeple”}
  9. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@5aafe97b”,”@prop”:”field”,”@nv”:”Field@24640285″}
  10. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@5aafe97b”,”@prop”:”name”,”@nv”:”2″}
  11. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@5aafe97b”,”@prop”:”meeple”}
  12. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@5309b8c0″,”@prop”:”field”,”@nv”:”Field@24640285″}
  13. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@5309b8c0″,”@prop”:”name”,”@nv”:”3″}
  14. {“@ts”:”1402044757843″,”@src”:”MeeplePosition@5309b8c0″,”@prop”:”meeple”}
  15. {“@ts”:”1402044757843″,”@src”:”Field@24640285″,”@prop”:”game”}
  16. {“@ts”:”1402044757845″,”@src”:”CarcassonneGame@35ba04f8″,”@prop”:”drawnCard”,”@nv”:”Field@24640285″}

Der Event in Zeile zwei verdeutlicht welche Art von Karte gerade gezogen wurde, in diesem Fall eine Karte vom Typ A. Alle Zuordnungen von Spielkarten und Name sind hier zu finden. Die Events in den Zeilen 7, 10 und 13 zeigen die Zuordnung eines Spielsteinposition-Objekts und seinem Namen. Bei Karten vom Typ A gibt es drei Positionen, 1 entspricht der Wiese, 2 dem Kloster und 3 der Straße.

Wird nun diese Karte südlich und um 180 Grad gedreht an der bereits liegenden Startkarte (Typ D) ausgespielt, folgen Events vergleichbar zu folgendem:

  1. {“@ts”:”1402044784348″,”@src”:”OrientationToFieldEntry@34592e88″,”@prop”:”key”,”@nv”:”SOUTH”}
  2. {“@ts”:”1402044784348″,”@src”:”OrientationToFieldEntry@34592e88″,”@prop”:”value”,”@nv”:”Field@24640285″}
  3. {“@ts”:”1402044784348″,”@src”:”Field@5e223ed2″,”@prop”:”neighbors”,”@nv”:”OrientationToFieldEntry@34592e88″}
  4. {“@ts”:”1402044784349″,”@src”:”OrientationToFieldEntry@6912610d”,”@prop”:”key”,”@nv”:”EAST”}
  5. {“@ts”:”1402044784349″,”@src”:”OrientationToFieldEntry@6912610d”,”@prop”:”value”,”@nv”:”Field@5e223ed2″}
  6. {“@ts”:”1402044784349″,”@src”:”Field@24640285″,”@prop”:”neighbors”,”@nv”:”OrientationToFieldEntry@6912610d”}
  7. {“@ts”:”1402044784350″,”@src”:”Field@24640285″,”@prop”:”game”,”@nv”:”CarcassonneGame@35ba04f8″}
  8. {“@ts”:”1402044784351″,”@src”:”Field@24640285″,”@prop”:”rotation”,”@nv”:”R180″,”@ov”:”R0″}
  9. {“@ts”:”1402044784351″,”@src”:”Field@24640285″,”@prop”:”name”,”@nv”:”A”}

Die Nachbar-Beziehung zwischen Feldern wird mit dem Hilfsobjekt OrientationToFieldEntry dargestellt. In diesem Beispiel wird in den Zeilen 1-3 gesendet, dass Feld Field@24640285 (Neues Feld) im Süden von Feld Field@5e223ed2 (Startfeld) angelegt wird. Die Zeilen 4-6 legen entsprechend die Rückrichtung an. Zeile 8 zeigt zudem die Rotation (R180) auf, in der das neue Feld angelegt wird.

Wird schließlich noch ein Spielstein auf die neue Karte gestellt, folgen Events ähnlich zu:

  1. {“@ts”:”1402045113008″,”@src”:”Meeple@46e3644a”,”@prop”:”meeplePosition”,”@nv”:”MeeplePosition@21e17c6d”}
  2. {“@ts”:”1402045113009″,”@src”:”MeeplePosition@21e17c6d”,”@prop”:”meeple”,”@nv”:”Meeple@46e3644a”}

Der Spielstein Meeple@46e3644a wird demnach auf die Position MeeplePosition@21e17c6d gestellt. Zeile 7 im ersten Eventblock zeigt, dass dies Position 1, also der Wiese, entspricht.