Challenge 9: Falling Blocks

Challenge

Bei Falling Blocks geht es darum, den fallenden Blöcken auszuweichen. Man steuert eine Figur am Boden nach rechts und links und von oben fallen zufällig Blöcke nach unten.

Es gibt einen Zeitraum, den jeder Block zufällig wartet, bevor er anfängt nach unten zu fallen. Dieser ist notwendig, damit nicht alle Blöcke gleichzeitig herunterfallen. Danach bewegt sich jeder Block mit der gleichen Geschwindigkeit nach unten. Befindet sich ein Block am Boden, wird er wieder an die Decke gesetzt. Sollte er jedoch den Spieler berühren, ist das Spiel vorbei.

Optional: 

  • Je ausgewichenem Block gibt es einen Punkt. Der erreichte Score wird am Ende des Spiels ausgegeben.
  • Abhängig von der Anzahl der Punkte kann man die Blöcke schneller fallen lassen.

Tipps:

  • Man benötigt fünf einzelne Variablen für die Blöcke. 
  • Einer Funktion kann ein Sprite-Objekt als Parameter übergeben werden. Man kann sie unter Advanced – Functions erstellen. Diese Funktion arbeitet dann mit dem jeweiligen übergebenen Objekt und kümmert sich um die Bewegung und Abfrage der Blöcke. Der Aufruf der Funktion erfolgt dann in fünf einzelnen Endlosschleifen, welche jeweils eine der Block-Variablen übergibt.

Makecode

Programmierfunktion

  • Variablen
  • Events abfragen
  • If-Abfrage
  • Funktionen mit Parametern
  • Funktionsaufrufe
  • Endlosschleifen

Spiellogik

Wenn der Micro:bit startet, sollen die Variablen definiert und initialisiert werden.

  • Die Start-Variable auf False, um das Spiel starten zu können.
  • Eine Variable, welche den gewünschten maximalen Zeitwert in Millisekunden für den Start des Herunterfallens eines Blocks speichert.
  • Eine Variable, welche die Zeit speichert, die ein Block zum Herunterfallen braucht. Nachdem ein Block seine zufällige Zeit gewartet und mit Herunterfallen gestartet hat, soll er immer in gleichmäßigen Abständen („Ticks“) nach unten fallen.
  • Fünf Sprite Variablen für jeden Block. Diese werden initial in der oberen Reihe des micro:bits platziert, jeder auf eine LED.
  • Zuletzt eine Sprite Variable für den Spieler, welche mittig in der untersten Reihe platziert wird. Zur bessern Sichtbarkeit gibt es die Möglichkeit das Sprite blinken zu lassen.

Um das Spiel zu starten wird gleichzeitig die „A“ und „B“ Taste gedrückt. Wenn das Spiel noch nicht gestartet wurde, setzt man die entsprechende Variable auf True um ein erneutes Starten zu verhindern.

Durch das Drücken einer der Tasten allein soll sich das Sprite des Spielers jeweils nach rechts oder links bewegen. Dazu wird bei jedem Tastendruck die x-Koordinate um 1 erhöht oder erniedrigt. Um zu verhindern, dass das Sprite über den Rand hinaus verschwindet braucht man eine Kollisionsabfrage. Wenn man z.B. die linke Seite betrachtet ist die letzte mögliche x-koordinate 0. Also fragt man bei jedem Tastendruck für die Bewegung nach links ab, ob die Koordinate größer als 0 ist, denn nur dann darf man sich weiter nach links bewegen. Sollte sich das Sprite auf x=0 befinden, bedeutet das, es befindet sich am Rand und bewegt sich somit nicht noch weiter nach links. Das Ganze benötigt man entsprechend auch für die Bewegung nach rechts.

Damit ein Block herunterfallen kann brauchen wir dafür eine Funktion. Diese Funktion benötigt als Übergabeparameter eine Sprite-Variable. Warum das so ist wird etwas später noch genauer erklärt. Die Funktion beginnt damit, dass zuerst eine zufällige Zahl zwischen 0 und der Zahl, die in der Zeitwert-Variable gespeichert ist, ausgewählt und um diese Zeit pausiert wird. Mit einer while-Schleife wird nun solange das Fallen des Blocks ausgeführt, wie die Start-Variable auf True steht, also solange das Spiel läuft. Zuerst wird überprüft ob sich der Block nicht auf y=4 befindet, da er sich sonst auf dem Boden befinden würde. In allen anderen Fällen bedeutet das, der Block schwebt noch in der Luft und soll deshalb um 1 nach unten bewegt werden, weswegen y um 1 erhöht wird. Danach wird um die Zeit gewartet, die man definiert hat, wie lange ein Block zum Herunterfallen braucht. 

Die While-Schleife wäre nun vorbei und beginnt von vorne. Sollte der Block sich immer noch in der Luft befinden wird der obige Code erneut ausgeführt. Ansonsten wird im Else-Fall behandelt, was passiert, wenn der Block sich in der untersten Reihe befindet. Zuerst überprüft man, ob der Spieler-Sprite und der Block-Sprite sich berühren. Ist dies der Fall, ist das Spiel vorbei und soll zurückgesetzt werden. Andernfalls ist der Block nur am Boden angekommen und soll wieder nach oben gesetzt werden. Dazu ändert man die y-Koordinate wieder auf 0. Danach muss wieder wie am Anfang der Funktion gewartet werden.

Zuletzt benötigt man noch fünf einzelne Endlosschleifen. Jede dieser Schleifen ruft die Funktion auf und übergibt jeweils eine der Block-Sprite-Variable. Der Sinn hinter dem Ganzen ist, dass Code, welcher in solchen Endlosschleifen ausgeführt wird, im Hintergrund ausgeführt wird und deswegen gleichzeitig mit anderem Code laufen kann. Zum anderen ist der Code so weitaus übersichtlicher, da die Logik des Herunterfallens nur einmal da ist. Alternativ hätte man auch den Code innerhalb der Funktion fünf Mal kopieren können und statt dem Übergabeparameter jeweils die Block-Variable einsetzen können.

Challenge accepted? Viel Spaß! Die Lösung gibt es morgen hier auf dem Blog.

Challenge Master

Ich bin der Challenge Master. Hinter mir verbergen sich die Auszubildenden von Proact Deutschland. Gemeinsam füllen wir diesen Blog mit verschiedenen Projekten, um euch das Coden beizubringen.

 
Kommentare

Noch keine Kommentare vorhanden.

Hinterlassen Sie einen Kommentar