Willst du ein Spiel spielen?

Januar 20, 2022 0 Von Andreas

Dieser Beitrag ist etwas mehr Spaß als es die anderen waren. Es wird nicht um große Performance oder Best-Practices Fragen gehen. Vermutlich geht es hier tatsächlich mehr darum sich in der Mittagspause die Zeit zu vertreiben.

Ich habe auf meinem Schreibtisch einen Würfelbecher stehen. Würfel sind etwas tolles. Wie nichts anderes sind sie ein Symbol des Zufalls und folgen somit strengen mathematischen Regeln. Ich habe mich daher dazu entschieden eines der beliebtesten Würfelspiele in Mendix umzusetzen. Die Rede ist von Yahtzee (oder Kniffel wie man in Deutschland sagt). Wer es nicht kennt kann hier nachlesen worum es geht und wie es gespielt wird: https://en.wikipedia.org/wiki/Yahtzee

Da das hier ein Mendix Blog ist komme ich natürlich nicht ohne technische Details aus. Daher folgt ein kleiner Blick unter die Haube. Natürlich könnt ihr diesen Teil auch überspringen und gleich zum Spielen übergehen.

Domain Model

Ja klar, man hätte das ganze auch können einfacher machen. Aber dann hätte es ja keinen Spaß gemacht, oder?

Game ist die zentrale Entity. Sie repräsentiert ein inzelnes Spiel. Zu jedem Spiel gehören mehrere Dinge. Zunächst ist der DiceCup notwendig welcher wiederum Würfel enthält. Außerdem braucht man LineItems. Diese LineItems repräsentieren die Einträge auf dem Yahtzee Block. Die einträge werden basierend auf einer Konfiguration, den LineItemTemplates, pro spiel erstellt. Wie man sieht haben die Würfel eine Assoziation zu den LineItems. Um das spiel besser nachvollziehen zu können werden die Würfel beim Eintragen der Punkte an das Line Item gehängt und der Würfelbecher wird mit „frischen“ Würfeln neu bestückt. Zuletzt gibt es noch die HighScore. Von diesem Objekt existieren maximal 10 Stück. Eine klassische Arcade High Score eben.

Ich weiß was ihr jetzt denkt. So viele Calculated Attributes auf einem Objekt? Ist das nicht eine schlechte Idee? Natürlich ist es das. In diesem Fall habe ich mich der einfachheit halber trotzdem dafür entschieden. Nicht zuletzt weil es pro Spiel immer nur genau einen DiceCup. Die Menge an zu berechnenden Attributen bleibt also gering.

Berechnung der Punkte

Nach jedem Wurf berechnet das System für alle noch offenen LineItems die Punkte welche notiert würden wenn sich der Spieler für dieses Line Item entscheidet. Für jeden Typ von LineItem gibt es einen eigenen Berechnungsmicroflow.

In einem zentralen Microflow wird anhand des LlineItem Typs entschieden welcher dieser Berechnungsmicroflows ausgeführt wird.

Die Berechnungen selbst sind dann sehr einfach und basieren auf der Häufigkeit der Würfel welche sich in den Calculatet Attributes des DiceCup wiederfinden. Als Beispiel möchte ich die Berechnung des FullHouse zeigen. Der Full House Microflow sieht so aus:

Die Expression im Endpoint gibt die Punkte zurück welche in der FullHouse Reihe mit den gewürfelten Würfeln erreicht werden würden. Sie basiert auf dem IsFullHouse Boolean.

if $IsFullHouse
then 25
else 0

Das IsFullHouse Boolean wird mit folgendem Ausdruck bestimmt.

(
	$DiceCup/Aces = 2
	or
	$DiceCup/Twos = 2
	or
	$DiceCup/Threes = 2
	or
	$DiceCup/Fours = 2
	or
	$DiceCup/Fives = 2
	or
	$DiceCup/Sixes = 2
)
and
(
	$DiceCup/Aces = 3
	or
	$DiceCup/Twos = 3
	or
	$DiceCup/Threes = 3
	or
	$DiceCup/Fours = 3
	or
	$DiceCup/Fives = 3
	or
	$DiceCup/Sixes = 3
)

Sobald sich der Spieler dafür entscheidet seine Punkte einzutragen werden die möglichen zu erreichenden Punkte als Punkte festgeschrieben, das LineItem wird gesperrt, die Würfel werden mit ihm assoziiert, der DiceCup wird mit neuen Würfeln bestückt und der Zähler des DiceCup wird auf 0 gesetzt.

Ende des Spiels

Sind alle LineItems gefüllt endet das Spiel. Das System überprüft ob der Spieler es in die HighScore geschafft hat. In diesem Fall wird das Spiel gespeichert und alle Spieler können seine Punktzahl bewundern.

In allen Fällen hat der Spieler nun die Option sein Glück ein weiteres mal zu versuchen.

Beat the High Score

Nun ist es an euch einen Platz in der High Score zu ergattern. Ihr braucht keinen Benutzeraccount. Ihr müsst nicht mal eine Münze einwerfen. Klickt einfach diesen Link und zeigt uns was ihr könnt. Viel Spaß!

https://my100108-sandbox.mxapps.io