Wiederholungen

Ein wichtiger Bestandteil von Programmiersprachen sind Schleifenanweisungen. In Schleifen werden Programmanweisungen wiederholt. Wie oft dies passiert, hängt von der Art der Schleife ab. Scratch bietet drei Schleifentypen an: eine Wiederholeanweisung mit vorgegebener Anzahl von Wiederholungen (wiederhole x mal wiederholt x-mal die in der Anweisung stehenden  Programmbefehle), eine Endlosschleife (Wiederhole fortlaufend bedeutet, dass alle Anweisungen bis zum Programmabbruch permanent wiederholt werden)  und eine Schleife, bei der die Anzahl der Wiederholungsschritte nicht direkt angeben werden kann, sondern flexibel mit Hilfe einer Bedingung gesteuert wird (Wiederhole bis Bedingung erfüllt).

Ampel

Ein Beispiel für eine Endlosschleife ist das folgende Ampelprogramm:

 

df

Sechs Objekte werden durch sechs Skripte verwaltet. Diese sind zum Teil sehr kurz. Figur1 hat vier Kostüme, die die 4 Ampelzustände repräsentieren. Jeder Farbbutton ruft die entsprechende Ampelfarbe auf; in der Automatik läuft die Ampel selbständig.

r

Das Skript für Figur1 ist verantwortlich für die Ampelfarbe.

f

Die Skripte für die Ampelfarben sind identisch (bis auf die Farbauswahl). Das Skript von Figur1 reagiert auf die Nachrichten, die die einzelnen Buttons senden.

Die Ampelautomatik fasst alle Schaltmöglichkeiten in einer Endlosschleife zusammen. Eine Zeitsteuerung sorgt dafür, dass die Ampelphasen unterschiedlich lang sind.

Das Scratch-Feature Senden ermöglicht es, Nachrichten zwischen Figuren und auch zwischen Figuren und der Bühne hin und her zusenden, damit diese miteinander interagieren und auf einander reagieren. Es gibt drei Senden-Blöcke, die sich in Scratch 3.0 alle in der Kategorie Ereignisse befinden.

w

Wenn ich Nachricht empfange: Dieser Block ist ein Kopfblock. Das Skript, das an ihm hängt, wird ausgeführt, wenn die entsprechende Nachricht durch einen der beiden anderen Anweisungen gesendet wird und kann auch mehrmals aktiviert werden.

sende Nachricht an alle: Diese Anweisung sendet eine Nachricht an alle Figuren und die Bühne. Die Anweisungen, die sich unter dieser befinden, werden anschließend sofort aktiviert und das Skript dadurch fortgesetzt.
sende Nachricht  an alle  und warte: Auch diese Anweisung sendet eine Nachricht an alle Figuren und die Bühne, jedoch werden die darunterliegenden Anweisungen erst aktiviert, wenn das Skript unter dem vorhin erwähnten Kopfblock fertig ausgeführt wurde.

Pong

e3

Die Schleifenbildung soll in einem kleinen Spiel erprobt werden. Die Vorfahren der heutigen Computer hatten nur  beschränkte Graphikfähigkeiten. Aus dieser Zeit stammt das Pong-Spiel: ein Ball bewegt sich in einem Raum und prallt an der linken, oberen und rechten Seite ab. Berührt er die untere Seite ist das Spiel beendet. Um dies zu verhindern, gibt es einen  Schläger, der sich am unteren Rand bewegen lässt. Berührt der Ball diesen Schläger, prallt er ab und es gibt einen Punkt. Dieses Spiel soll auch dazu benutzt werden, SCRATCH-Eigenschaften einzuführen.

Bei jedem neuen Programm steht die Katze auf der Bühne. Diese kann man nun überhaupt nicht gebrauchen und löscht sie deshalb. Für die Bühne benötigt man aber einen Ball. Dieser wird über das Figurenmenü geladen. Für die Bühne wählt man einen anderen Hintergrund. Wie schon erwähnt, erhält jedes Objekt sein eigenes Skript. Man fängt mit dem Ball an. Er soll sich immerwährend im Raum bewegen; berührt er eine Seite soll er abprallen. Er soll sich in einem Winkel von 45 Grad bewegen. Da auch in Scratch die Gesetze der Physik gelten, soll der Aufprallwinkel und der Abprallwinkel gleich groß sein. Damit man dies nicht selber berechnen muss, gibt es die praktische Anweisung pralle vom Rand ab. Der erste Anweisungsblock sieht dann wie folgt aus:

d

Man  benötigt aber noch zwei weitere Objekte auf der Bühne: das Paddle und eine Auslinie. Beides findet man bei den wählbaren Objekten und platziert sie auf der Bühne wie im Bild ersichtlich ist. Das Paddle soll mit Hilfe der Maus gesteuert werden. Dabei wird nur die x-Position des Paddles geändert. Diese Position soll abhängig sein von der Position des Mauszeigers. In dem Skript für das Paddle muss also die x-Position des Mauszeigers abgefragt werden und dem Paddle genau diese x-Position zugewiesen werden. Das folgende Skript erledigt dieses:

f

Bleibt noch unser drittes Objekt: die rote Linie. Wenn sie vom Ball berührt wird, soll das Spiel beendet werden. Im Ballskript gibt es die Anweisung pralle vom Rand ab. Dazu muss aber festgestellt werden, ob der Rand der Bühne berührt wird. Wie dies geschieht, läuft in einer "black box" ab: Wie der Befehl umgesetzt wird, ist nicht wichtig. Es funktioniert einfach, nur das Ergebnis zählt. Ähnliche Befehle für Objekte gibt es in der Palette Fühlen. Wird das Objekt Linie vom Objekt Ball berührt? Falls dies geschieht, soll ein Ereignis ausgelöst werden: das Spiel soll enden. Das passende Skript lautet:

 rfg

Startet man jetzt das Programm, so sieht man, dass der Ball fliegt und das Paddle sich bewegen lässt. Berührt der Ball die rote Linie, endet das Spiel. In der Programmvorgabe war gefordert worden, dass mit Hilfe des Paddles der Ball zurück geworfen werden kann. Dieses funktioniert aber noch nicht. Hatte man eben den Fall, dass die rote Linie mit dem Ball interagiert, müssen jetzt die Objekte Paddle und Ball miteinander agieren. Die Bewegung des Balles hängt von der Position des Paddles ab. Wird das Paddle berührt, wird der Ball zurück geworfen. Im Skript für den Ball führt man einen neuen Block ein, der genau dieses Zusammentreffen untersuchen soll. Wenn der Ball vom Paddle berührt wird, muss eine Reaktion erfolgen. Die erste Reaktion ist, das der Score-Zähler um eins erhöht wird. Dieser Zähler wird dadurch erstellt, dass man eine neue Variable Score erstellt. Diese Variable wird automatisch auf dem Bühnenbild angezeigt. Möchte man dies nicht, muss der entsprechende Haken gelöscht werden. Die Anweisungen setze Variable auf x und ändere Variable um x helfen bei der Zähllösung. Wird das Spiel gestartet, muss die Variable auf 0 gesetzt werden. Dies kann durch einen eigenen Block geschehen. Das Hochzählen erfolgt dann im Berührungsblock. Die zweite Reaktion, die hier erfolgen muss, ist die Reflexion des Balles. Dazu muss man wissen, aus welcher Richtung der Ball kommt. Zwei Richtungen kommen in Frage: entweder kommt er schräg in einem Winkel 45 Grad von links oben (Drehrichtung >0 Grad) oder schräg in einem Winkel von rechts oben (Drehrichtung <0 Grad). In beiden Fällen muss die Richtung um 90 Grad geändert werden. Das Skript lautet dann:

 ds

Hier noch das Skript für den Scorezähler:

fd

Ping-Pong

Auf Dauer wird dieses Spiel etwas langweilig.

53

Das nächste Programm ist eine Erweiterung des vorherigen. Man kann Pong jetzt gegen den Computer oder gegen einen anderen Spieler spielen. Auf dem Bild sieht man, dass man zwei weitere Schläger benötigt, eine zweite rote Linie, einen zweiten Zähler und einen etwas kleineren Ball. Außerdem hat man zwei Schaltflächen, mit deren Hilfe man auswählen könne, ob man gegen den Computer ( 1 Spieler) oder gegen jemand anders spielen wollen. Warum zwei weitere Schläger? Der eine Schläger ist für einen menschlichen Gegner, der andere für den Computer. Näheres wird gleich besprochen. Die Größe des Balls kann man mit dem Kostümeditor ändern. Im Bild hat er eine Größe von 18*18.

Zuerst beschäftigt man sich mit den beiden Schaltflächen. Mit ihrer Hilfe wird bestimmt, ob gegen den Computer oder gegen eine weitere Person gespielt wird. Nachdem dies erfolgt ist, sollen die beiden Schaltflächen verschwinden. Da in dem Skript neue Befehle verwendet werden, soll zuerst das Skript vorgestellt werden:

re

Man benutzt hier Befehlsblöcke  aus der Palette Aussehen. Zuerst wird die Position von Button1 festgelegt. Dann erfolgt die Anweisung gehe zu vordersten Ebene. Jedes Objekt auf der Bühne befindet sich in einer anderen Ebene. Objekte können sich also überlagern. In welcher Ebene sich ein Objekt befindet, hängt vom Zeitpunkt seiner Entstehung ab. Man will aber, dass zu Beginn des Spiels der Button von keinem anderen Objekt verdeckt wird. Deshalb wird er ganz nach vorne gestellt und überdeckt eventuell andere Objekte. Außerdem soll sich das Objekt zeigen. Dies ist ein Sicherheitsbefehl, da die Sichtbarkeit eines Objektes durch Voreinstellung verhindert werden kann. Wenn der Button angeklickt wird, soll die Nachricht Spieler:1 an alle anderen Objekte geschickt werden. Die Geschwindigkeit des Ball wird auf den Wert 4 gesetzt. Dazu muss die Variable vorher definiert werden. Ist die Nachricht versandt worden, kann der Button verschwinden. Ebenso muss der Button1 verschwinden, wenn Button2 gedrückt wurde. Dies geschieht durch den Empfang einer Nachricht von Button 2, nämlich Spieler:2. das Skript für Button2 sieht ähnlich aus:re

Die Skripte für den Ball kennt man schon teilweise.

fd

Zuerst wird das Objekt initialisiert. Die Geschwindigkeit wird auf 0, die Position wird auf x=0|y=0 und die Errichtung auf 90 Grad gesetzt. Ein weiterer Block übernimmt die Steuerung der Zähler. Der Inhalt ist selbsterklärend. Aus dem Block ergibt sich aber auch, dass man für die beiden Linien keine Skripte schreiben muss; denn im Gegensatz zum Pong-Spiel erfolgt kein Programmabbruch. Das Spiel läuft unendlich.

ef

Damit das Spiel nicht zu langweilig wird, soll bei jeder Berührung eines Schlägers Geschwindigkeit und Richtung geändert werden.

42

 

Das rechte Paddle wird wie bei dem Pong-Spiel durch die Maus gesteuert; nur wird hier der Schläger vertikal bewegt. Damit ist die y-Position der Maus wichtig. Man kann dieses Skript natürlich noch so abändern, dass die Steuerung des Paddles über Tasten erfolgt. Dies wäre eigentlich fairer, wenn man gegen einen Mitspieler spielt. Das Skript ist kurz:

gd

Paddle2 wird bei dem Spiel gegen einen Partner benötigt. Zur Steuerung werden zwei tasten benötigt. Welche man auswählt, ist völlig egal.  Ob dieses Paddle benötigt wird, erfährt das Objekt durch eine Nachricht, die von Buitton1 oder Button2 gesandt wurde.

fd

Nun kommt man  zum letzten Objekt, Paddle3. Dieses Paddle wird durch den Computer gesteuert. Dazu werden ab einer bestimmten Position des Balls die Koordinaten abgefragt und das Paddle entsprechend verschoben.

 

Flying Cat

Nun noch einmal die Scratch-Katze.

Catwalk1

Die Scratch-Katze soll, gesteuert durch die Pfeiltasten, von links nach rechts und zurück laufen. Dies sollte jetzt kein Problem mehr sein. Es soll aber hier eine weitere Scratch-Eigenschaft vorgestellt werden: der Kostümwechsel. Wenn man sich einmal mit Hilfe des Kostümeditors das Katzenobjekt angesehen hat, wird man festgestellt haben, das auf der linken Seite des Editors zwei Katzenbilder angezeigt werden. Es gibt also zwei Kostüme. Zwischen diesen Kostümen kann das Objekt wählen. Wechselt man ständig zwischen diesen beiden Kostümen, hat man das Gefühl, dass die Katze sich bewegt. Das ist im Prinzip nichts anderes als eine Animation. Würde man noch mehr Bilder benutzen, könnte die Bewegung flüssiger dargestellt werden. Wir begnügen uns aber mit den von Scratch vorgegebenen Bildern.

gd

Nun erweitert man dieses Programm um weitere Kostüme und Bewegungen. Wenn im oberen Programm die Katze nach rechts läuft, läuft sie vorwärts. Läuft sie nach links, dann ist es rückwärts. Man will aber, dass sie immer vorwärts läuft. Deshalb benötigt man ein Kostüm, dass die andere Gehrichtung deutlich macht. In den Vorlagen für Objekte gibt es weitere Katzenobjekte. Das eine zeigt die Katze, als ob sie wie Supermann starten wollte, und das andere, wie sie fliegt. Diese Bilder wollen wir in einer Animation verwenden. Das Programm soll wie folgt ausgebaut werden: Wenn die Katze auf der Grundlinie von rechts nach links bzw. von links nach rechts bewegt wird und sie sich auf der Grundlinie befindet, soll sie laufen. Wird sie nach oben oder unten bewegt soll sie wie Supermann starten und landen. Hat sie die Grundlinie nach oben verlassen, soll sie bei Betätigung der linken oder rechten Pfeiltaste nach links oder rechts fliegen.

Dazu braucht man für das Objekt Katze weiter Kostüme. Wenn man diese als Katzenobjekte laden würden, könnte man keinen Kostümwechsel vornehmen. Ein Kostümwechsel kann nur innerhalb eines Skriptes, also nur bei einem Objekt erfolgen. Stattdessen öffnet man den Kostümeditor und lädt  mit Hilfe des Menüs in der linken Spalte alle benötigen Bilder. Wie bekommt man aber die Bilder mit der richtigen Bewegungsrichtung? Man lädt z.B. das normale Katzenbild in den Editor und dreht es um die eigene Achse. Dieses Bild wird dann abgespeichert. Auf diese Art und Weise bekommt man alle gewünschten Bilder.

jg

Die Grundlinie, auf der die Katze laufen muss, wird beliebig definiert. Verändert sich die y-Koordinate der Katze, dann hat sie die Grundlinie verlassen und befindet sich in der Start/Lande-Position oder im Flug. Pfeiltaste nach oben bzw. Pfeiltaste nach unten bedeuten Start oder Landung. Pfeiltaste nach rechts bzw. nach links bedeuten Flug nach rechts oder links, wenn nicht die Grundlinie erreicht ist. Ist sie erreicht dann läuft die Katze. Beim Landevorgang muss also überprüft werden, wann die Katze den Boden berührt. Hier nun das Skript:

hf

Man kann das Programm noch erweitern. Unter den vorgegeben Objekten gibt es auch einen Papagei. Diesen kann man einbauen usw.

ew

Turtle-Graphik

Schleifen in Schleifen, Fallunterscheidungen in Schliefen, Schleifen in Fallunterscheidungen: alles ist möglich. Ein beliebtes Beispiel für die Einführung von Programmiersprachen ist die Turtle-Graphik. Eine Schildkröte (Turtle) bewegt sich auf dem Bildschirm und zeichnet eine Linie. Zum Zeichnen benötigt man einen Stift und entsprechende Befehle zur Steuerung dieses Stiftes. Dazu muss man eine Erweiterung laden. Links unterhalb der Palettenbibliothek gibt es einen entsprechenden Schalter. Wird dieser angeklickt wählen wir aus den angebotenen Möglichkeiten Malstift.

e

Wie entsteht solch eine Graphik? Es wird immer eine gerade Linie in einer bestimmten Länge gezeichnet. Anschließen dreht sich das Objekt um einen entsprechenden Winkel. Diesen kann man über den Schieberegler einstellen. Es wird wieder eine Linie gezeichnet, das Objekt dreht sich wieder. Diese beiden Vorgänge passieren beliebig oft. Bei bestimmten Winkel, die ganzzahlige Teiler von 360 sind, ergeben sich sehr schnell geschlossene Figuren. In dem Beispiel sieht man, dass die Stiftfarbe sich kontinuierlich verändert; man aber auch durch entsprechende Programmänderung monochrome Graphiken zeichnen. Welches Objekt benutzen wir zum Zeichnen? Dies ist vollständig egal, da wir zum Zeichnen das Objekt ausblenden. Wir wollen nur seine Spur sehen.

Da während der Laufzeit der Winkel geändert werden kann, braucht man zwei Variablen, Winkel und Winkel_alt. Die Variable Winkel soll über einen Schieberegler eingestellt werden. Wie kann man diese erreichen? Wir haben schon gesehen, dass Variablen sichtbar auf der Bühne angezeigt werden. Durch Löschen des entsprechenden Hakens bei den Variablen kann man das Sichtbarsein verhindern. Für die Variable Winkel_alt löscht man deshalb den Haken.

dw

Klickt man mit der rechten Maustaste auf die Variablenanzeige, öffnet sich ein Menü. Dort wählt man Schieberegler aus. Wer möchte, kann auch den Wertebereich festlegen. Dieser sollte von 90 bis 180 eingestellt werden. Zuerst nun das Programm, die Erläuterungen folgen dann.

fs

Zuerst wird das Objekt versteckt. Welches Objekt man wählt, ist egal. Bedingung für das Zeichnen ist, dass es nicht sichtbar ist. Dadurch, dass Winkel_alt auf 0 gesetzt wird, werden im Skript die Anweisungen unter "sonst" durchgeführt, da der Winkel_alt ungleich dem Winkel ist. Diese Anweisungen definieren den Startpunkt der Figur, die Startfarbe und die Strichdicke. Dadurch dass nun Winkel_alt den Wert von Winkel erhält, haben beide Variablen denselben Wert. In Zukunft werden also nur noch die "dann" Anweisungen durchgeführt. Stellt man den Turbomodus ein, wird das Zeichnen extrem beschleunigt. Die verwendeten Schrittweiten können natürlich verändert werden.