Lernpfad:Scratch für Fortgeschrittene/wiederhole fortlaufend richtig nutzen
Scratch-Projekte wie Spiele oder Animationen enthalten in der Regel Anweisungen, die immer wieder ausgeführt werden müssen. Dazu werden Schleifen verwendet. Einige Schleifen-Anweisungen in Scratch hast du vielleicht schon kennengelernt:
wiederhole fortlaufend :: stack
- Die Anweisungen werden ohne Ende wiederholt. Man nennt sie daher auch Endlosschleife.
wiederhole (10) mal :: stack
- Die Anweisungen werden so oft wiederholt, wie durch die Zahl festgelegt (hier also 10 mal). Diese Art der Schleife nennt man auch Zählschleife.
wiederhole bis <> :: stack
- Die Anweisungen werden so lange wiederholt, bis die Bedingung
wahr
ist. (Ein solche Bedingung könnte zum Beispiel<(x-Position) < (0)>
sein. Sie istwahr
, sobald die Figur in die linke Hälfte der Bühne wandert.) Diese Art nennt man auch Kopfgesteuerte Schleife.
Bei der Verwendung von Schleifen in Scratch muss man einige Punkte beachten.
Das Programm stoppen
Schleifen sparsam verwenden
Gibt es in einem Projekt zu viele Schleifen können in Scratch seltsame Dinge passieren. Viele Fehler treten auf, weil sich zu viele Schleifen gegenseitig behindern und dann ganz unvorhersehbare Probleme Verursachen. Auf einmal bewegt sich eine Figur nicht wie erwartet. Die Steuerung reagiert nicht mehr, oder die Figuren reagieren nicht auf Berührungen.
Wenn du also eine Schleife verwenden möchtest, dann stell dir zunächst folgende Fragen:
Ist für das Problem, das ich lösen möchte, wirklich eine Schleife nötig?
Manchmal kann man ein Problem auch ohne Schleifen lösen, wenn man darüber nachdenkt. Springt eine Figur zum Beispiel an eine unerwartete Position, könntest du das Problem lösen, indem du in einer Endlosschleife die Position immer wieder auf die gewünschte setzt:
wiederhole fortlaufend gehe zu x:(100) y:(15) end
Sinnvoller ist es aber, herauszufinden, warum die Figur den unerwarteten Sprung macht. Welche Anweisung ist dafür verantwortlich? Wenn die entfernt wird, ist das Problem gelöst, ohne eine weitere Schleife zu benutzen.
Gibt es schon eine Schleife, die ich zur Lösung nutzen kann?
Ist zur Lösung des Problems auf jeden Fall eine Schleife notwendig, solltest du zunächst gucken, ob es schon eine passende Schleifen gibt, in der du die nötigen Anweisungen ergänzen kannst. Auf diese Weise musst du keine weitere Schleife ergänzen.
Gibt es zum Beispiel schon eine Endlosschleife in der Figur, die beim Drücken der grünen Flagge gestartet wird, dann macht es meist keinen Sinn, eine weitere solche Schleife in der Figur zu erstellen.
Welche Art von Schleife brauche ich?
Oft neigt man dazu, zur Endlosschleife (wiederhole fortlaufend :: stack
) zu greifen, wenn eine Schleife benötigt wird. Sinnvoller ist es aber, genau darüber nachzudenken, welche Art von Schleife am sinnvollsten ist. Die sinnvollste Art ist immer die, die am kürzesten läuft. Endlosschleifen laufen unendlich lange und sind daher eigentlich die schlechteste Wahl. Warum, das wird im nächsten Abschnitt beschrieben.
Schleifen beenden sobald möglich
Um Probleme mit zu vielen Schliefen zu vermeiden, sollten die Schleifen so bald wie möglich beendet werden. Wenn es möglich ist, sollte daher statt der Endlosschleife eine der anderen beiden Arten verwendet werden. Sie haben ein festgelegtes Ende: Entweder nach einer bestimmten Anzahl an Wiederholungen (Zählschleifen) oder bis eine Bedingung eintritt (Kopfgesteuerte Schleife).
Aber auch Endlosschleifen - die sich ja eigentlich endlos wiederholen - lassen sich beenden, wenn sie nicht mehr benötigt werden. Wenn zum Beispiel in einem Spiel nach dem Ende in einen Bildschirm mit der erreichten Punktzahl oder in ein Menü gewechselt wird, werden die Endlosschleifen für das Spiel (Bewegung der Figuren, usw.) nicht mehr benötigt.
Um eine Endlosschleife zu beenden kann die Anweisung stoppe [dieses Skript v]
innerhalb der Schleife benutzt werden. Um alle noch laufenden Schleifen zu beenden, kann innerhalb der Figur die Anweisung stoppe [andere Skripte der Figur v]
verwendet werden.
Beispiele
Angenommen du programmierst ein Spiel in Scratch, bei dem eine Figur (zum Beispiel ein Ball) über die Bühne fliegt und von den Rändern abprallt. Dazu werden die Befehle gehe (10)er-Schritt
und pralle vom Rand ab
endlos wiederholt. Parallel laufen andere Skripte ab, die die Punkte des Spielers in einer Variablen zählen. (Wann die Punkte hochgezählt werden ist für dieses Beispiel nicht wichtig.) Sobald der Spieler vier Punkte hat ist das Spiel beendet und die Schleife zur Bewegung des Balls kann beendet werden.
Die erste Möglichkeit ist es, innerhalb der Schleife zu prüfen, ob der Spieler schon vier Punkte hat, und wenn die Bedingung wahr
ist, die Anweisung stoppe [dieses Skript v]
aufzurufen:
wenn die grüne Flagge angeklickt setze [Punkte v] auf (0) wiederhole fortlaufend gehe (10)er-Schritt pralle vom Rand ab falls <(Punkte) > (4)> dann stoppe [dieses Skript v] end end
Gibt es noch weitere Schleifen in der Figur, dann kann stoppe [andere Skripte der Figur v]
benutzt werden, um alle gleichzeitig zu beenden. Der Aufruf dieser Anweisung darf aber nicht innerhalb der Schleife erfolgen. Er könnte zum Beispiel durch eine Nachricht ausgelöst werden:
wenn die grüne Flagge angeklickt setze [Punkte v] auf (0) wiederhole fortlaufend gehe (10)er-Schritt pralle vom Rand ab end wenn ich [spiel ende v] empfange stoppe [andere Skripte der Figur v]