Lernpfad:Scratch für Fortgeschrittene/wiederhole fortlaufend richtig nutzen

Aus Informatik-Box
Zur Navigation springen Zur Suche springen

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 ist wahr, 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]