Konzept: Schleifen#
Die for
-Schleife#
Die for
-Schleife wiederholt einen Befehl n-mal.
Beispiel#
Die folgende Schleife läuft 5-mal durch:
for i in range(5):
print("I'm in a loop!")
Ausgabe:
I'm in a loop!
I'm in a loop!
I'm in a loop!
I'm in a loop!
I'm in a loop!
Die Schleifenvariable#
Du kannst die Variable i
als Zähler verwenden. Sie beginnt bei 0 und zählt hoch:
for i in range(5):
print(i)
Ausgabe:
0
1
2
3
4
Allgemeine Form#
for i in range(max):
<code block>
oder
for i in range(min, max):
<code block>
Damit kannst du eine bestimmte Anzahl von Durchläufen oder einen Bereich wiederholen.
Zeichnen mit Schleifen#
import miniworlds
world = miniworlds.World(200, 200)
for i in range(4):
miniworlds.Circle((20 + 50 * i, 50), 20)
world.run()
Dies zeichnet vier Kreise in einer Reihe.
Schachbrettmuster#
Verwende den Modulo-Operator %
, um zu prüfen, ob eine Zahl gerade ist: x ist durch 2 teilbar ⇨ x % 2 == 0
from miniworlds import *
world = World(200, 50)
for i in range(4):
rect = Rectangle((50 * i, 0), 50, 50)
if i % 2 == 0:
rect.color = (255, 0, 0, 255)
else:
rect.color = (255, 255, 255, 255)
world.run()
Graphen#
from miniworlds import *
world = World(400, 400)
for x in range(400):
gl = 0.5 * x + 50
y = 400 - gl
Point((x, y))
world.run()
Verschachtelte Schleifen#
Mit verschachtelten Schleifen kannst du 2D-Muster zeichnen:
from miniworlds import *
world = World(200, 200)
for i in range(4):
for j in range(4):
Circle((20 + 50 * i, 20 + 50 * j), 20)
world.run()
Die while
-Schleife#
Allgemeine Syntax:
while <condition>:
<code block>
Solange die Bedingung True
ist, wird die Schleife wiederholt. Vorsicht — dies kann Endlosschleifen erzeugen.
Beispiel: Zufälliges Muster#
from miniworlds import *
import random
world = World(255, 60)
x = 0
while x < 255:
c = Circle((x, 30), 20)
c.color = (x, 0, 0, random.randint(0, 255))
x = x + random.randint(10, 50)
world.run()
Die Hauptschleife#
Dein Programm läuft im Wesentlichen in einer Schleife wie dieser:
while <no quit>:
<draw screen>
<handle events>
Eine for
-Schleife ist dafür nicht geeignet, da man im Voraus wissen muss, wie viele Durchläufe es gibt.
Schleifen innerhalb registrierter Methoden#
Wenn du Schleifen innerhalb von act()
oder einer Ereignismethode verwendest, solltest du folgendes wissen:
Die gesamte Schleife wird innerhalb eines einzigen Frames ausgeführt! Das bedeutet, sie ist nicht geeignet für Animationen — die sich ja von Frame zu Frame ändern.
Beispiel: Zustandsautomat einer Ampel#
Ein einfaches Zustandsdiagramm:
stateDiagram
[*] --> Green
Green --> GreenYellow
GreenYellow --> Red
Red --> RedYellow
RedYellow --> Green
Falscher Ansatz: while
-Schleife (läuft sofort durch)#
from miniworlds import *
state = "green"
while True:
if state == "green":
state = "green-yellow"
print("green")
elif state == "green-yellow":
state = "red"
print("green-yellow")
elif state == "red":
state = "red-yellow"
print("red")
elif state == "red-yellow":
state = "green"
print("red-yellow")
world.run()
Korrekter Ansatz: Stattdessen act()
verwenden#
from miniworlds import *
world = World(100, 240)
state = "green"
g = Circle((50, 40), 40)
y = Circle((50, 120), 40)
r = Circle((50, 200), 40)
@world.register
def act(self):
global state
if world.frame % 20 == 0:
if state == "green":
g.color = (0, 255, 0)
y.color = (255, 255, 255)
r.color = (255, 255, 255)
state = "green-yellow"
print("green")
elif state == "green-yellow":
g.color = (0, 255, 0)
y.color = (255, 255, 0)
r.color = (255, 255, 255)
state = "red"
print("green-yellow")
elif state == "red":
g.color = (255, 255, 255)
y.color = (255, 255, 255)
r.color = (255, 0, 0)
state = "red-yellow"
print("red")
elif state == "red-yellow":
g.color = (255, 255, 255)
y.color = (255, 255, 0)
r.color = (255, 0, 0)
state = "green"
print("red-yellow")
world.run()
Der Programmablauf bleibt gleich, aber die Endlosschleife wird durch die act()
-Methode ersetzt, die frameweise ausgeführt wird.