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.