Für den dritten Meilenstein befasste ich mich mit der Map Generation. Unsere Map wird durch fünf verschiedene Blöcke (Steine, Erde, Höhle, Gold und Fragezeichen) dargestellt, deren Anordnung bei jedem erneuten Spielstart neugeneriert werden soll. Das heisst, dass man nie genau weiss, wie die Map in der neuen Spielrunde aussehen wird. Dies macht das Spiel sicher wesentlich spannender und man verhindert somit das Einstudieren der besten Tunnel zum Gold.
Matthias machte mich auf Perlin Noise aufmerksam. Mit Hilfe der Perlin Noise kann man eine Map generieren, deren Elemente zusammenhängend generiert werden. In anderen Worten: Der Entscheid, ob das jeweilige Feld ein Stein, eine Höhle, Erde, Gold oder ein Fragezeichen wird, hängt von der Umgebung ab. Die Implementierung der Perlin Noise erfolgt in mehreren komplexen Schritten. Für jeden einzelnen Block muss man vier verschiedene Skalarpodukte aus acht verschiedenen Vektoren berechnen, welche dann mit Hilfe der Interpolation zu einer Zahl verrechnet werden. Die Zahl sollte im Bereich 0 und 1 liegen. Die Perlin Noise würde einen deterministischen Randomizer ersetzen. Das Bild unterdran ist aus dem Internet entnommen und zeigt, was man mit Perlin Noise anstellen kann.
Nach mehreren Versuche ist es mir gelungen, Zusammenhänge zwischen den Blockarten und Blockpositionen zu schaffen. Das Problem bestand jedoch darin, dass wir in unserem Spiel keine Wände oder grössere Blöcke von Steinen oder Höhlen brauchten, sondern eher kleiner unterteilte Regionen.
Weiter habe ich mich mit der Implementierung der Herzen bzw. «Leben» der Spieler befasst. In Buddler Joe ist die Anzahl der noch verfügbaren Leben ebenfalls matchentscheidend. Verliert ein Spieler sein letztes Leben, so heisst es «Game Over».
In der jetzigen Version führt der Client selbst die Änderung am Lebensstand aus. Der Client realisiert, ob ein Stein auf den Spieler gefallen ist, dieser zu nahe beim Dynamit stand oder er ein Herz aufgesammelt hat, und ruft somit die «increaseLives» oder «decreaseLives» Methoden auf. Beide verschicken den aktuellen Lebensstand an den Server, welcher die Daten übernimmt und speichert. Wenn ein Spieler, dem nur noch ein Leben zur Verfügung steht, beispielsweise unter einen Stein gerät, so verschickt die «decreaseLives» Methode den aktuellen Stand an den Server, der dann im Falle «0» ein «Niederlage»-Paket verschickt und der Spieler scheidet aus. Sammelt der Spieler ein Herz auf, obwohl er schon zwei Leben hat, so wird kein Updatepaket an den Server geschickt.
Weiter habe ich den Lebensstand im Fenster, wo das aktuelle Spiel läuft, ausgeben lassen. Somit kann jeder Spieler seinen eigenen Stand einsehen.