Das Regentropfenspiel wurde bereits in Make Code mit Sprite-Objekten realisiert. Leider
sind die Sprite-Objekte recht unflexibel und lassen sich nicht an einen größeren Bildschirm anpassen.
Deshalb wird in Python ein eigenes Sprite-Objekt entwickelt, das entsprechend den Wünschen des Programmierers angepasst werden kann. Die folgende Anleitung realisiert nur einige Grundfunktionen, die aber für ein einfaches Spiel ausreichen.
In der Datei sprite.py wird eine Klasse sprite definiert. Wird dann im Hauptrogramm eine Instanz dieser Klasse erzeugt, wird automatisch die Methode __init__ aufgerufen. Diese Methode bekommt für den leuchtenden Punkt die x- und y- Koordinate übergeben. Die Richtung wird auf 1 festgesetzt.
Auf das Attribut richtung greift die Methode bewege() zu. Diese Methode wird als nächstes der Klasse zugefügt.
Festlegung für die Richtung:
Im Hauptprogramm wird die Datei sprite.py importiert und ein Objekt wasser erzeugt. Das erste sprite ist die Datei, in der die Klasse steckt und das zweite sprite der Name der Klasse, von dem das Objekt erzeugt wird.
Da die Methode __init__ die Koordinaten des leuchtenden Punktes erwartet, wird x=2 und y=0 übergeben. Das Programm lässt dann wirklich oben in der Mitte die LED aufleuchten.
Im nächsten Schritt wird der Klasse sprite die Methode bewege() hinzugefügt. Sie bewegt den leuchtenden Punkt entsprechend der Richtung um eine Stelle weiter. Dabei achtet sie auch ganz rührend darauf, das der Kobold nicht über den Spielfeldrand fällt und verschwindet.
Als erstes wird der Punkt an der aktuellen Stelle gelöscht. Dann werden die neuen Koordinaten berechnet und der Punkt leuchtet an dieser Stelle wieder auf.
Hinweis: Falls man später die Klasse ausbauen möchte, kann man auch diagonale Richtungen ermöglichen.
Lässt man das Programm nun eine halbe Sekunde ruhen und bewegt dann den Punkt, wandert er erwartungsgemäß eine Stelle nach rechts.
Damit der Tropfen nach unten fällt, muss die Richtung geändert werden. Das Attribut __richtung ist von außen über eine weitere Methode erreichbar.
Im nächsten Schritt soll es nun endlich von der Decke tropfen. Dazu braucht man die volle Kontrolle über die x- und y-Koordinaten des Objektes. Es werden dazu in der Klassendefinition 4 weitere Methoden geschrieben. Die ersten beiden liefern einfach nur die x- und y-Werte zurück.
Die setze-Methoden prüfen zuerst, ob die übergebenen Werte in das Raster der LED-Matrix passen. Wenn das der Fall ist, wird der Punkt an der aktuellen Position gelöscht, die Werte geändert und der Punkt an der neuen Position zum Leuchten gebracht.
Es reichen dann wenige Programmzeilen aus, um es pausenlos von der Decke tropfen zu lassen.
Unschön ist jetzt nur noch der sleep(500)-Befehl am Ende des Programms. Es soll ja ein Eimer in der unteren Zeile mit den Tasten A und B so verschoben werden, dass die Tropfen gefangen werden. Leider reagiert der Calliope mini in der Schlafzeit nicht auf die Tasten, er schläft ja tief und fest.
Das Problem kann mit dem Befehl running_time() gelöst werden. Dieser Befehl liefert die Laufzeit des Calliope mini in Millisekunden seit dem Start des Programms. Die Variable zeit enthält in ms den Zeitpunkt der nächsten Bewegung. Ist er erreicht, wird die Variable zeit um den Wert aus wartezeit erhöht.
Wenn alles richtig läuft, tropft das Wasser wieder im Halbsekundentakt. Der Calliope mini arbeitet aber durch und hat keine Schlafenszeit.
Nun praucht man noch einen Eimer, der die Tropfen in der unteren Zeile fängt. Der Eimer ist eine weitere Instanz der sprite-Klasse und taucht sofort am unteren Rand auf.
Der Eimer soll bei jedem Druck auf die Taste A oder B um genau eine Stelle bewegt werden. Dazu muss das Programm sowohl auf den Druck als auch auf das Loslassen der Taste reagieren.
Dazu wird eine Variable taste_a benutzt, die zu Beginn des Programms auf False gesetzt wird. Sofort nach dem Drücken von A wird sie auf True gesetzt und die Taste A praktisch gesperrt. Erst das Loslassen der Taste A öffnet sie wieder.
Für die Taste B muss ein ähnlicher Programmteil eingefügt werden.
Ist alles richtig, kann der Eimer mit A und B bewegt werden.
Jetzt fehlt nur noch die Kontrolle, ob der Tropfen den Eimer berührt oder daneben gefallen ist. Dazu wird eine weitere Methode zu der Klasse sprite hinzugefügt. Die Methode beruehrt(objekt) vergleicht die x- und y-Koordinaten des eigenen Objektes (also wasser) mit den Koordinaten des übergebenen Objektes (eimer). Entsprechend wird ein True oder ein False zurückgegeben.
Im Hauptprogramm wird der Test dann ausgeführt, wenn der Tropfen unten ist. Im Beispiel gibt es eine Variable spielstand und eine Variable leben. spielstand wird zu Beginn auf 0 und leben auf 5 gesetzt.
Nun ist es dem Programmierer überlassen, wie er das Spiel weitergestaltet. Man kann die LEDs mit einbeziehen, die Wartezeit bei einem gefangenen Tropfen kleiner machen, das Spiel bei 0 Leben beenden...
Hinweis: Der Eimer wird nach dem Fangen eines Tropfens gelöscht. Er erscheint wieder, wenn er bewegt wird. Um das Verschwinden des Eimers zu vermeiden, wird noch eine Methode zeige() geschrieben. die an der aktuellen Stelle das Pixel wieder einschaltet. Die Methode eimer.zeige() muss dann an der richtigen Stelle aufgerufen werden.