MuEditor.png
Arbeitsauftrag

Ü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)
Icon Info.png

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.

Icon Info.png

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")
MuEditor.png
Arbeitsauftrag

Erweitere das Programm nun zu einem kleinen Spiel. Das Ziel soll es sein, alle LEDs des Displays einzuschalten. Nimm dazu folgende Änderungen vor:

  1. Anstatt die alte LED auszuschalten, setze ihren Wert auf 3.
  2. Implementiere eine Methode check_display(), die prüft, ob alle LEDs an sind und in diesem Fall True zurückgibt, ansonsten False.
  3. Nutze check_display(), um vor jedem sleep() das Display zu prüfen.
  4. 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 nacheinander auf insgesamt 5 Zahlen setzt (also 0, 1, 2, 3, 4). In jedem Durchlauf der Schleife hat i also einen anderen Wert.
display.get_pixel(0, 3) Ermittelt den Helligkeitswert (0 bis 9) der LED am Index (0, 3) (also in Zeile 1, Reihe 4).
Tipp

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)
Lösung
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)