Algorithmen in Scratch

Die vorliegenden Materialien wurden von André Tempel erstellt und von Daniel Hoherz geprüft. Sollten andere Editoren die Materialien erstellt haben, werden diese explizit genannt.

Die Stadt "OsnaByte" möchte sich als moderne, futuristische, zukunftsweisende und saubere Stadt präsentieren. Die Aufgaben des täglichen Lebens sollen in der Stadt zukünftig von Robotern übernommen werden. Es soll Roboter für die Reinigung geben, aber auch Roboter für die Navigation in der Stadt sollen den Bewohnerinnen und Bewohnern und den Besuchern und Besucherinnen in verschiedenen Sprachen helfen.

Doch noch hat OsnaByte diese Roboter noch nicht bzw. es gibt sie schon, nur müssen sie noch programmiert werden und da kommst du ins Spiel. Du hast die ehrenvolle Aufgabe OsnaByte in die Zukunft zu führen - versemmel es nicht. Die zur Programmierung der Roboter genutzte Programmiersprache ist Scratch3.

Mit Scratch3 lassen sich Programme schreiben. Du kannst es unter diesem Link aufrufen und direkt in deinem Browser nutzen (was wir aber jetzt nicht machen werden!).

Ähnliche wie in OpenRoberta Lab lassen sich auch hier die Blöcke in den mittleren Bereich ziehen und aneinderkleben. Durch das Ausführen des Programms wird die Figur oben rechts in Aktion gebracht.

  1. Als erstes sollst du dich darum kümmern, dass die Saugroboter (CleanBots) durch die Stadt gesteuert werden können.
  2. Als erstes legst du dir über diesen Link einen Account an und anschließend startest du durch einen Klick hierdrauf das Projekt. Du siehst den "CleanBot". Er muss nun programmiert werden. Mache mit Aufgabenteil b weiter.

    Die Mitarbeitenden sitzen in der Zentrale und sollen die CleanBots aus der Ferne steuern können. Mit den Pfeiltasten soll ein CleanBot gesteuert werden.
    Implementiere mithilfe der folgenden Blöcke die Steuerung des CleanBots. Hinweis: Manche der Blöcke wirst du mehrfach gebrauchen müssen.

    Momentan schauen die CleanBots noch nicht nach links, wenn sie nach links fahren (sie gucken immer noch nach rechts), das ist auch schon einigen Passanten aufgefallen und das finden sie befremdlich.
    Wenn du oben links neben Skripte auf Kostüme klickst (s. 1. im Bild unten), kannst du das Aussehen des CleanBots anpassen.

    Wende folgende Schritte an, um den CleanBot ein passendes Kostüm für das Nach-links-gehen zu verpassen:

    1. Auf "Kostüme" klicken.
    2. Rechtsklick auf das Bild des CleanBots und auf "Duplizieren" klicken (s. 1. im Bild).
    3. Wähle den zweiten CleanBot aus und klicke auf das Symbol für "Horizontal spiegeln" (s. 2. im Bild).
    4. Benenne das Kostüm um in "CleanBotLeft".

    Nachdem du das gemacht hast, sorge mit den folgenden Blöcken dafür, dass der CleanBot beim Gehen nach links auch nach links schaut, also das Kostüm für links (CleanBotLeft) genutzt wird. Achte auch darauf, dass er wieder nach rechts schaut (CleanBotRight), wenn er nach rechts geht.

    Erweitere dein Programm entsprechend der Anforderungen.

    Der Azubi hat für die Steuerung die untenstehende Alternative erstellt.

    Beurteile seine Lösung schriftlich.

    Ein Kollege macht für die Steuerung der CleanBots den folgenden Vorschlag.

    Analysiere die Funktionsweise des Programms schriftlich.
    Prüfe anschließend, ob deine Analyse korrekt ist, indem du das Programm hierüber öffnest und ausführst.

  1. Die CleanBots können nun gesteuert werden. Jetzt sollen sie auch noch Müll in der Stadt aufsammeln.
  2. Starte durch einen Klick hierdrauf das Projekt. Du siehst den "CleanBot" und den Müll im Park. Dieser soll gleich aufgesammelt werden. Mache mit Aufgabenteil b weiter.

    Wenn der CleanBot einen Müllgegenstand berührt und die A-Taste gedrückt wird, soll dieser vom CleanBot aufgesammelt werden - also verschwinden (sich verstecken). Dazu wird beim Aufsammeln des Gegenstandes eine entsprechende Nachricht gesendet, die der entsprechende Gegenstand empfängt und dann verschwindet. Für das Senden und Empfangen der Nachricht brauchst du die folgenden Blöcke:

    Um zu prüfen, ob ein Gegenstand berührt wurde und die Taste gedrückt wurde, brauchst du diese Blöcke hier. Wobei du bei den orangenen Blöcken entscheiden musst, welchen du benutzt.

    Ergänze diese Anforderungen erst für nur einen einzigen Gegenstand und sobald das funktioniert, für alle anderen.

    Der CleanBot hat nun den ganzen Müll aufgesammelt und soll nun auf Knopfdruck (Leertaste) allen Müll an der aktuellen Position fallen lassen, damit sie schnell entleert werden können. Dazu muss erneut eine Nachricht gesendet werden, die von den Müllgegenständen empfangen wird und diese muss dafür sorgen, dass der Müll an der aktuellen Position wieder erscheint (sich zeigt).
    Erweitere dein Programm entsprechen der Anforderungen.

Nachdem die Stadt nun von den CleanBots gereinigt wird, hast du dafür gesorgt, dass die Stadt sauber ist. Nun muss sie nur noch modern, futuristisch und zukunftsweisend werden. Dafür werden die NavBots eingeführt. Sie sollen die Besuchenden von OsnaByte vom Park+Ride der Stadt abholen und durch die Stadt führen. Unten siehst du den vereinfachten Stadtplan von OsnaByte. Unten links wartet der NavBot auf die Besuchenden, die er dann zu den einzelnen Attraktionen der Stadt führt.

Deine Kollegin hat bereits einen ersten Vorschlag für das Programm gemacht. Bisher kann es aber nur dafür sorgen, dass der NavBot einen Besuchenden in die City führt, wenn dieser es korrekt einfordert.

Analysiere den Vorschlag deiner Kollegin - wie funktioniert dieser Algorithmus und was macht er?

Deine Kollegin fragt dich, wie sie es hinbekommt, einen weiteren Ort abzufragen, sodass der NavBot den Besuchenden dorthin bringt?

Damit ein Computerprogramm nicht nur starr abläuft, sondern auf den Nutzer reagieren kann, benötigt es Eingaben. In Scratch wird diese sogenannte Mensch-Maschine-Interaktion hauptsächlich durch ein Paar aus zwei speziellen Blöcken realisiert: dem Steuerungsblock frage ... und warte und dem Wertblock Antwort.
Hier ist der genaue Ablauf, wie in der Grafik dargestellt:

  1. Die Eingabeaufforderung (frage ... und warte): Der hellblaue Block frage ... und warte initiiert den Dialog. Wenn das Programm diesen Block erreicht, passieren drei Dinge gleichzeitig:
    • Die Ausgabe: Die Figur stellt die im Block eingetragene Frage (z.B. „Wie heißt du?“) in einer Sprechblase auf der Bühne.
    • Das Eingabefeld: Am unteren Rand der Bühne erscheint ein Textfeld, in das der Benutzer etwas eintippen kann.
    • Der Programmstop: Das Wichtigste ist das „und warte“. Das gesamte Skript pausiert an dieser Stelle. Es läuft erst weiter, wenn der Benutzer eine Eingabe gemacht und diese bestätigt hat (z.B. durch Drücken der Enter-Taste oder Klick auf das Häkchen).
  2. Die Datenspeicherung (Antwort): Sobald der Benutzer die Eingabe bestätigt hat, verschwindet das Eingabefeld. Der eingegebene Text (im Beispiel „Felix“) wird nun automatisch vom System entgegengenommen und in einem speziellen, bereits eingebauten Platzhalter gespeichert. Dieser Platzhalter ist der runde, hellblaue Block Antwort. Man kann ihn sich als eine Speicherort vorstellen, der immer genau einen Textwert enthält – nämlich die letzte getätigte Benutzereingabe.
  3. Die Verarbeitung: Nach der Eingabe läuft das Skript weiter. Nun kann der Wert, der im Block (Antwort) gespeichert ist, an beliebiger Stelle im Programm verwendet werden. Im Beispiel der Grafik wird der (Antwort)-Block in einen verbinde [Hallo ] und [...]-Operator gezogen. Das Programm nimmt den gespeicherten Namen („Felix“), verknüpft ihn mit der Begrüßung und lässt die Figur das Ergebnis („Hallo Felix!“) sagen.

Kurze Audiozusammenfassung

  1. Der NavBot schafft es nun, die Leute in die City zu führen, doch was ist mit den anderen Attraktion in der Stadt?
  2. Starte durch einen Klick das Programm aus dem Einstieg und mache mit Aufgabenteil b weiter.

    Wenn der Besuchende nun Zoo, Indoor-Park oder Stadion, welche sich bei den Koordinaten (-160,-20), (-120,90) und (130,-100) befinden, eingibt, soll der NavBot ihn dorthin führen (zu der Stelle gleiten).
    Erweitere das Programm entsprechend.

    Manchmal geben die Besuchenden auch etwas Falsches ein, dann macht der NavBot nichts und fragt einfach nur wieder wohin es als nächstes gehen soll. Der NavBot soll aber den Besuchenden sagen, dass er den ort nicht bekannt und erst dann fragen, wohin es als nächstes gehen soll.
    Erweitere das Programm, um eine Möglichkeit mit fehlerhaften Eingaben umzugehen.
    Hinweis: Es gibt grundsätzlich zwei Möglichkeiten das Problem zu lösen: Entweder man verwendet statt einfachen bedingten Anweisungen (falls...dann...) Verzweigungen (falls...dann...sonst...) oder man formuliert eine Bedingung, die lautet, wenn nicht Zoo oder nicht Citiy oder ... dann sage "kenne ich nicht".

    Die Besuchende wird nun super durch die Stadt geführt, aber bisher führt der NavBot ihn noch nicht wieder zum Park+Ride zurück, sodass er seinen Besuch beenden kann. Wenn der Besuchende nun P+R eingibt, soll der NavBot ihn zurück zum Park+Ride führen, sich verabschieden und das Programm stoppen.

    Ein Kollege hat einen Alternativ-Vorschlag gemacht und die Geschäftsleitung hat seinen Vorschlag abgelehnt. Er versteht leider nicht warum.

    Beurteile seinen Vorschlag.

  1. Die NavBots werden eigentlich ganz gut angenommen, aber eine Umfrage hat ergeben, dass die Besuchenden sich eine persönliche Ansprache mit ihrem Namen wünschen. Daher hat man das Programm etwas geändert, sodass erst nach dem Namen des Besuchenden gefragt wird und dieser bei den weiteren Fragen und Antworten genutzt wird.
  2. Starte durch einen Klick das verbesserte Programm. Die Attraktionen Zoo, Indoor-Park und Stadion wurden der übersichtlichkeithalber rausgenommen, du kannst davon ausgehen, dass diese in der finalen Version wieder enthalten sind. Mache mit Aufgabenteil b weiter.

    Analysiere das Programm, ob es funktioniert, wie es soll und beschreibe etwaige Probleme.

    Erläutere allgemeinsprachlich, ausgehend von dem Problem, was passieren müsste, damit das Programm korrekt funktioniert.

    Analysiere den Lösungsvorschlag deiner Kollegin. Was machen die Blöcke "setze name auf Antwort" und "name"?

Untersuchungen zeigen, dass Stadtbesucher sich dank der NavBots mehr bewegen. Der Bedarf an Imbissläden steigt, weil die Leute mehr Hunger und Durst haben. Leider gibt es nicht genug Mitarbeitende für die Imbissläden. Daher sollen jetzt ImbissBots diese Aufgabe übernehmen.

Deine Aufgabe ist es, diese ImbissBots zu programmieren.

In einem der Imbisse sieht es so aus.

Die ImbissBots erfragen den Namen und was man essen möchte und bringen es einem dann. Dafür hat deine sehr engagierte Kollegin bereits einen ersten Entwurf erstellt.

Analysiere die Funktionsweise des Programms und gehe auch darauf ein, weshalb die Blöcke "setze name auf Antwort" und "setze bestellung auf Antwort" für den späteren Programmablauf notwendig sind.

Wären hier zwei Variablen nötig? Welchen Vorteil hat das vllt. trotzdem?

Bisher kann der Roboter nur Essen bringen. Was müsste passieren, damit der Roboter zusätzlich zum Essen auch noch Limo oder Wasser als Getränk bringt?

Variablen sind einer der wichtigsten Bausteine in der Programmierung. Ohne sie wäre ein Programm „statisch“ – es könnte sich nichts merken und nicht auf Veränderungen reagieren. Für Projekte in Scratch lässt sich das Konzept wie folgt verstehen:

Was ist eine Variable?
Man kann sich eine Variable wie eine beschriftete Box vorstellen. In dieser Box liegt ein Wert (zum Beispiel eine Zahl oder ein Wort).
  • Der Name: Das Etikett auf der Box (z. B. „punkte“). So weiß das Programm, welche Box es öffnen muss.
  • Der Inhalt: Der aktuelle Wert in der Box (z. B. „10“). Dieser Inhalt kann sich während der Programmlaufzeit jederzeit ändern – deshalb heißt sie „Variable“.
Die drei wichtigsten Schritte in Scratch
In Scratch befinden sich die Variablen-Befehle in der orangen Kategorie. Um mit einer Variablen zu arbeiten, ist ein logisches Vorgehen notwendig:
  • Erzeugen/Deklarieren (Die Box bauen): Bevor eine Variable genutzt werden kann, muss sie über den Button „Neue Variable“ erstellt und ihr ein eindeutiger Name gegeben werden. Variablen-Namen werden immer kleingeschrieben.
  • Initialisieren (Den Startwert festlegen): Ein häufiger Fehler ist es, eine Variable ohne definierten Startwert zu nutzen. Zu Beginn eines Programms oder Spiels sollte die Variable explizit festgelegt werden (z. B. setze punkte auf 0).
  • Verändern (Den Inhalt anpassen): Wenn während des Ablaufs etwas passiert (z. B. eine Figur berührt ein Ziel), wird der Wert angepasst (z. B. ändere punkte um 1).
Anwendung im Algorithmus
In der 10. Klasse werden Variablen oft in Kombination mit Kontrollstrukturen genutzt. Sie dienen als „Gedächtnis“ des Programms, um den aktuellen Zustand zu speichern und zu prüfen, ob Bedingungen für den nächsten Schritt erfüllt sind.
  • Beispiel: Falls die Variable punkte größer als 10 ist, dann wechsle in das nächste Level.
  1. Der ImbissBot kann bisher nur Essen bringen. Nun soll er auch noch Getränke bringen. Entscheide dich, ob du die Basisvariante machst, wo die Bestellungen nur in Form von Textausgaben dargestellt werden (wie im Einstieg) oder ob du eine Challenge-Variante machst, in der die Bestellung auch richtig gebracht wird.
  2. Lade dir zunächst das Programm für die Challengevariante herunter und analysiere, was die sende-Blöcke und die beiden Figuren burger und salat machen.

    Der ImbissBot soll nun noch fragen, ob man eine Limo oder ein Wasser trinken möchte und die Entscheidung soll in einer neuen Variablen getränk gespeichert werden. Der ImbissBot soll die Bestellung nochmal zusammenfassen, dann in die Küche „gehen“ und zurückkehren und dann erstmal nur mitteilen ("sage"-Block), was er gebracht hat.
    Erweitere das Programm entsprechend und fahre dann mit Aufgabenteil c fort.

    Mithilfe der bedingten Anweisungen wurde das passende Essen geholt. Nachdem das Essen gebracht wurde, soll der ImbissBot nochmal losgehen und das Getränk holen.
    Implementiere nun analog zum „Bringen“ des Essens das „Bringen“ der Getränke.

    Wenn die Kunden etwas Falsches eingeben, passiert bisher nichts.
    Implementiere eine Möglichkeit falsche Benutzereingabe zu berücksichtigen.

    Momentan werden Essen und Getränk nacheinander gebracht. Kannst du es auch umsetzen, dass beide Sachen zeitgleich gebracht werden?
    Implementiere, dass Essen und Getränke gleichzeitig kommen.

    Starte durch einen Klick das Programm aus dem Einstieg und mache mit Aufgabenteil b weiter.

    Der ImbissBot soll noch fragen, ob man eine Limo oder ein Wasser trinken möchte und die Entscheidung soll in einer neuen Variablen getränk gespeichert werden. Der ImbissBot soll die Bestellung nochmal zusammenfassen ("sage..."-Block), dann in die Küche "gehen" und zurückkehren und dann mitteilen ("sage..."-Block), was er gebracht hat.
    Erweitere dein Programm entsprechend und fahre dann mit Aufgabenteil c fort.
    Hinweis: Die untenstehenden Blöcke wirst du für die Abfrage gebrauchen, zum Teil auch mehrfach.

    Wenn die Kunden etwas Falsches eingeben, passiert bisher nichts.
    Implementiere eine Möglichkeit falsche Benutzereingabe zu berücksichtigen.
    Hinweis: Um die Überprüfung falsche Eingabe abzuprüfen, können dir folgende Blöcke helfen.

    Der Azubi hat zwei Ideen für eine Lösung eingebracht.

    Aufgabe 1d Vorschlag 1
    Vorschlag 1
    Aufgabe 1d Vorschlag 2
    Vorschlag 2

    Analysiere die Programme und gib an, sofern zutreffend, ob die Programme funktionieren oder nicht.

  1. Die ImbissBots können nun, dank dir, Bestellungen aufnehmen, aber sie sollten auch in der Lage sein, mit den Kundinnen und Kunden abzurechnen.
  2. Entweder du machst mit deinem Ergebnis aus Aufgabe 1 weiter oder du öffnest das Programm für diese Aufgabe und machst mit Aufgabenteil b weiter.

    Der ImbissBot soll nun noch jeweils fragen, wie viele Burger/Salate bzw. Limo/Wasser man bestellen möchte und sich die Anzahl merken (neue Variable anzahlEssen und anzahlTrinken).
    Erweitere dein Programm erstmal um diese Funktion. In der nächsten Aufgabe geht es dann weiter.
    Hinweis: Folgende Blöcke könnten für eine Abfrage interessant sein und es wäre natürlich sinnvoll die Abfrage nach der Anzahl direkt nach der Bestellung des Essens und des Trinkens zu machen.

    Jetzt muss der ImbissBot das Essen und das Trinken bringen. Er soll entsprechend oft zwischen Küche und Tisch hin und her laufen, wie er Bestellungen erhalten hat. Also wenn er bspw. 2 Burger und 1 Limo als Bestellung erhalten hat, dann soll er 3 Mal zwischen Küche und Tisch hin und her laufen.
    Erweitere dein Programm entsprechend.

    Nachdem der ImbissBot die Sachen gebracht hat, kassiert er ab. Burger kosten 5€ und Salat 4€, Limo 2€ und Wasser 1€. Die Summe soll berechnet und in der Variablen summe gespeichert werden, dann soll erstmal nur gesagt werden, wie viel Geld man schuldet.
    Erweitere dein Programm entsprechend.

    Aufgabe 2d Hinweis
    Nützliche Blöcke

    Bis jetzt hat der ImbissBot dem Besuchenden nur gesagt, was dieser ihm schuldet. Jetzt soll der Besuchende auch das Geld geben (er soll es eingeben, also braucht man einen frage-Block).Nun kann es aber sein, dass die Kundin oder der Kunde zu wenig Geld gibt (eine zu kleine Zahl eingibt), dann soll der ImbissBot solange die ausstehende Summe einfordern, bis das restliche Geld gegeben wurde. Wenn allerdings zu viel Geld gegeben wurde, dann soll sich der ImbissBot höflich bedanken.
    Implementiere diese Erweiterung.

    Aufgabe 2e Hinweis
    Nützliche Blöcke
  1. Die NavBots wurden zu Datenanalysezwecken umgebaut und protokollieren nun die Aufenthaltsdauer der Besuchenden in der Stadt.
  2. Analysiere zunächst wie die Datenerhebung in diesem Programm umgesetzt wurde.

    Begründe, dass es im Programm aus a) nicht zwingend notwendig ist, die Aufenthaltsdauer in einer Variablen zu speichern.
    Begründe daneben auch, dass es Variablen braucht, wenn für jedden Ort die Zeit einzelnd gespeichert werden soll.

    Die Datenanalyse-Abteilung möchte gerne, dass für jeden Ort separat die Aufenthaltsdauer bestimmt wird. Es soll also herausgefunden werden, wie lange der Besuchende bei seinem Besuch im Zoo, in der City, im Stadion oder im Indoor-Park war.
    Entwickle zunächst erstmal Ideen, welche Blöcke du benötigt und ob du weitere Variablen brauchst und wofür. Hier soll noch nichts implementiert werden. Die folgenden drei Aspekte sollen dir helfen. Notiere deine Überlegungen:

    1. Stell dir vor, der NavBot besucht erst den Zoo für 10 Minuten und danach das Stadion für 20 Minuten. Wenn wir nur eine einzige Variable aufenthaltsdauer haben, was passiert mit der Zeit vom Zoo, sobald der Bot im Stadion ankommt? Beschreibe das Problem, das entsteht, wenn man nur eine Variable für alle Orte hat.
    2. Wir haben im Stadtplan die Orte: Zoo, City, Stadion und Indoor-Park. Erstelle eine Liste mit Namen für Variablen, die wir bräuchten, um für jeden dieser Orte die Zeit exakt zu stoppen. Wie würdest du sie nennen, damit man sie nicht verwechselt?
    3. Schau dir den Ablauf des bisherigen Programms an: Der NavBot fragt nach dem Ziel, gleitet dorthin und wartet, bis der Besucher fertig ist. Überlege dir: Muss die Zeit-Variable erhöht werden, bevor der Bot losfährt, während er dort wartet oder erst, wenn er zum nächsten Ort aufbricht? Begründe deine Entscheidung.

    Verändere das bisherige Programm so, dass für jeden Ort die Aufenthaltsdauer in einer eigenen Variablen protokolliert wird und am Ende gesagt wird, wo man alles wie lange war. Entscheide dich für eine der beiden Variante:

    1. Gehe davon aus, dass ein Ort nur ein Mal besucht wird. (leichter)
    2. Orte können mehrmals nacheinander besucht werden und die verbrachte Zeit soll summiert werden.

    Hinweis: Implementiere zunächst die Messung der Aufenthaltsdauer für einen Ort. Hast du dieses korrekt implementiert, kannst du es für die anderen Orte kopieren und anpassen. Außerdem musst du deine Änderung nur im Rumpf der Verzweigungen (dann-Teil) einfügen.

    Am Ende soll nicht mehr mitgeteilt werden, wie lange man an einem Ort war, sondern, an welchem Ort man sich am längsten aufgehalten hat.

    Analysiere die folgenden Sachverhalten, inwiefern sich Variablen dafür eignen oder nicht:

    1. Angenommen in OsnaByte kommen noch weitere Orte hinzu und mithilfe der Variablen sollen die einzelnen Verweildauern protokolliert werden.
    2. Angenommen für jeden Ort soll jeder Besuch einzelnd protokolliert werden, sodass man bspw. sehen kann, dass ein Besuchender den Zoo 3 Mal für unterschiedliche Dauer besucht hat. Geht das mit Variablen?