9: Ein viertes Programm
Übertrage das Programm unten in den Thonny und überspiele es auf den micro:bit.
Teste das Programm und erkläre seine Funktion. Notiere dir dazu Stichpunkte im Heft und ergänze neue Befehle in deiner Befehlsübersicht.
Tipp: Kippe den micro:bit doch mal leicht in eine Richtung.
from microbit import *
## Hilfsfunktion
def check_coords(x, y):
if x > 4:
x = 4
elif x < 0:
x = 0
if y > 4:
y = 4
elif y < 0:
y = 0
return (x, y)
## Initialisierung
sens = 350 # Mess-Sensitivität des Akzelerometer
x = 0
y = 0
display.clear()
display.set_pixel(x, y, 6)
## Endlosschleife
while True:
x1 = x + int(accelerometer.get_x()/sens)
y1 = y + int(accelerometer.get_y()/sens)
x1, y1 = check_coords(x1, y1)
if x1 != x or y1 != y:
display.set_pixel(x, y, 0)
display.set_pixel(x1, y1, 6)
x, y = x1, y1
sleep(200)
Das Schlüsselwort return
In Zeile 13 siehst Du das neue Schlüsselwort return
im Python-Code. Es kann am Ende einer Funktion vorkommen und bedeutet, dass die Funktion sofort beendet ist und der Wert, der hinter return
steht als Ergebnis der Funktion "zurückgegeben" werden soll.
Der zurückgegebene Wert wird beim Benutzen der Funktion (dem Aufruf) für die Funktion eingesetzt. Im folgenden Beispiel wird also das Ergebnis 5
ausgegeben, da die Funktion verdoppeln
beim Aufruf verdoppeln(2)
durch die Rückgabe 4
ersetzt wird und dann + 1
gerechnet wird.
def verdoppeln( zahl ):
return zahl * 2
ergebnis = verdoppeln(2) + 1
print(ergebnis)
Im Beispiel oben prüft die Funktion check_coords
, ob die Parameter x
und y
korrekte Indizes für LEDs des micro:bit Displays sind (also zwischen 0
und 4
liegen). Ist ein Wert nicht in diesem Bereich, werden die Werte auf 0
oder 4
gesetzt. Es wird dann eine Liste mit angepassten x
und y
Werten zurückgegeben, die auf jeden Fall korrekte Indizes darstellen.
Die Variablen x1
und y1
werden in Zeile 28 dann auf die beiden Werte der Liste gesetzt, die von check_coords
zurückgegeben wurde.
Das Schlüsselwort break
Manchmal ist es nötig, eine Schleife vorzeitig abzubrechen. Im Code oben gibt es etwa eine Endlosschleife, die niemals endet. Soll diese Schleife doch einmal beendet werden, kann das Schlüsselwort break
benutzt werden. Es bricht genau die Schleife ab, in der es vorkommt.
i = 1
while True:
print("Schleife läuft")
i += 1
if i > 10:
break # bricht die Schleife nach 10 Durchläufen ab
print("Schleife beendet")
Erweitere das Programm nun zu einem kleinen Spiel. Das Ziel soll es sein, alle LEDs des Displays einzuschalten. Nimm dazu folgende Änderungen vor:
- Anstatt die alte LED auszuschalten, setze ihren Wert auf
3
. - Implementiere eine Methode
check_display()
, die prüft, ob alle LEDs an sind und in diesem FallTrue
zurückgibt, ansonstenFalse
. - Nutze
check_display()
, um vor jedemsleep()
das Display zu prüfen. - Falls das Display komplett an ist, schalte alle LEDs auf
6
und breche die Endlosschleife ab.
Hilfreiche Befehle
for i in range(5):
print(i)
|
Eine Zählschleife, die ab dem Wert 0 die Variable i |
display.get_pixel(0, 3) |
Ermittelt den Helligkeitswert (0 bis 9 ) der LED am Index (0, 3) (also in Zeile 1, Reihe 4).
|
Du kannst eine LED des Displays mit den Funktionen display.get_pixel(x, y)
abrufen und mit display.set_pixel(x, y, value)
einschalten. x
und y
sind der Spalten- und Zeilenindex der LED zwischen 0
und 4
. value
ist ein Helligkeitswert zwischen 0
und 9
.
Du kannst alle LEDs prüfen oder schalten, indem Du zwei Zählschleifen benutzt. Der folgende Code reduziert die Helligkeit jeder LED um Eins:
# Schaltet alle LEDs auf die Helligkeit 3
for y in range(5):
for x in range(5):
helligkeit = display.get_pixel(x, y)
display.set_pixel(x, y, helligkeit - 1)
from microbit import *
## Hilfsfunktion
def check_coords(x, y):
if x > 4:
x = 4
elif x < 0:
x = 0
if y > 4:
y = 4
elif y < 0:
y = 0
return (x, y)
## Hilfsfunktion, um das Display zu prüfen
def check_display():
for y in range(5):
for x in range(5):
if display.get_pixel(x, y) == 0:
return False
return True
## Hilfsfunktion, um das Display einzuschalten
def on(value=6):
for y in range(5):
for x in range(5):
display.set_pixel(x, y, value)
## Initialisierung
sens = 350 # Mess-Sensitivität des Akzelerometer
x = 0
y = 0
display.clear()
display.set_pixel(x, y, 6)
## Endlosschleife
while True:
x1 = x + int(accelerometer.get_x()/sens)
y1 = y + int(accelerometer.get_y()/sens)
x1, y1 = check_coords(x1, y1)
if x1 != x or y1 != y:
display.set_pixel(x, y, 3)
display.set_pixel(x1, y1, 6)
x, y = x1, y1
if check_display():
on()
break
sleep(200)