Funktionen und Events
Funktionen und Events sind besonders nützliche Möglichkeiten in Programmiersprachen. Mit Funktionen kann man komplizierte Vorgänge vereinfachen und Code leichter wiederverwenden. Mit Events kann man auf Vorgänge reagieren, die sich während des Ablaufs eines Programms ereignen. Diese zentralen Themen werden hier für Menschen erklärt, die noch nicht programmieren können. Alles Gelernte kann man direkt spielerisch ausprobieren und vertiefen.
Info für Lehrende
Mehr zu SchuBu+
Funktionen
Ein Computerprogramm ist oft komplex. Damit man mit dem Programmieren überhaupt anfangen kann, muss man Probleme zuerst vereinfachen.
Kompliziertes vereinfachen. Wie geht das?
Tipp: Nicht alles auf einmal lösen!
Man muss also zuerst darüber nachdenken, aus welchen kleineren Problemen das Ganze besteht.
In der nächsten Übung wird ein Spiel programmiert, in dem sich Computergegner automatisch bewegen. Dafür müssen alle NPCs programmiert werden. Die Bewegung jedes einzelnen Bots einzeln zu programmieren, ist sehr aufwendig. Deshalb ist es viel besser, dieses Problem in Teilprobleme zu zerlegen. Ein guter Start ist hier, zwei Bot-Scripts für unterschiedliche Bewegungsabfolgen zu schreiben:
So kann man sich zuerst darauf konzentrieren, wie patrouillieren zu programmieren ist. Im nächsten Schritt programmiert man den Rundgang. Am Schluss kann man einfach jedem NPC sagen, was er machen soll, indem man die Funktionen aktiviert.
In vielen Programmiersprachen heißt so etwas Funktion oder Modul. Auch in GamBu-Script heißen solche Blöcke, in denen mehrere Befehle zusammengefasst werden, function.
Beachte, dass nach dem Funktionsnamen zwei Klammern () stehen und dann alle Befehle, die in der Funktion zusammengefasst werden, in geschwungenen Klammern stehen.
Aufruf einer Funktion dann mit dem Funktionsnamen samt der zwei Klammern. Hier ein Beispiel einer Funktion, die hallo_und_los heißt.
Sobald ein Block in dieser Weise definiert wurde, kann man ihn in allen Skripten des Spiels aufrufen, indem man einfach den Funktionsnamen schreibt, als wäre es ein Befehl. So ist es auch, Blöcke sind selbst programmierte Befehle. Auch sie können in Schleifen wiederholt werden.
Programmiere die Schlange so, dass sie sich genauso wie die Schlange in der Vorlage bewegt!
Tipp: Im Bot-Script der Vorlage wird zuerst ein Block definiert, der die Schlange einmal hinunter- und hinaufgehen lässt. Dieser Block wurde patrouilliere genannt und dann in einer Wiederholung 100 mal ausgeführt. Der Block hätte auch jeden anderen Namen bekommen können.
Auch in Scratch gibt es Funktionen, dort heißen sie Blöcke:
In Java-Script schreibt man Funktionen gleich, wie in GamBu-Script:
Als Nächstes soll ein Rundgang programmiert werden: Beim Aufruf des Rundgangs soll festgelegt werden, wie schnell und groß der Rundgang sein soll. Solche Zusatzinformationen beim Aufruf eines Blocks nennt man Parameter.
Variablen und Parameter
Eine Variable ist beim Programmieren ein kleiner Speicher, der eine Information (
So wird eine Variable in GamBu-Script definiert:
Zum Beispiel kann man in einer Variable speichern, wie viel Käse eine Maus schon gefressen hat. Jedes Mal, wenn die Maus einen Käse berührt, muss im Programm der gespeicherte Wert um eins erhöht werden. Diesen Punktestand kann man am Schluss von einem Spiel anzeigen. („on touch goal“ ist ein Event und wird unten erklärt.)
Käferstraße: Ergänze folgendes Script! Die Maus soll alle Käfer der Reihe nach fressen und dabei immer sagen, wieviel sie schon gefressen hat. Außerdem soll sie beim zehnten Käse automatisch umdrehen, um die Käfer auf der anderen Seite auch noch zu erwischen. Der Block ist hier bereits vorgegeben:
- die Variable des Futters (Wie viel Futter hat die Maus zu Beginn?)
- eine Zeile "on touch goal () => ..."
Parameter
Ein Parameter ist eine spezielle Art einer Variable. Auch in Parametern wird Information gespeichert. Der Unterschied ist, dass sie zu einem Block gehören. Sie werden immer zusammen mit einer Funktion definiert.
Man kann die Funktion „patrouilliere“ so definieren, dass ein Bot unterschiedlich patrouillieren kann:
Mehrere Parameter werden mit Beistrichen getrennt.
Jetzt kann man praktischerweise beim Aufruf einen sehr langsamen und müden Wächter patrouillieren lassen:
Und so kann man einen gestressten schnellen Wächter erstellen:
Schlangenwelle: Befiehl den Schlangen, der Maus aus dem Weg zu gehen! Verwende dazu in allen Scripts aller Schlangen den Block patrouilliere! Dieser Block ist bereits definiert, du brauchst ihn nur noch aufzurufen. Hier funktioniert er aber ein bisschen anders, er hat nur einen Parameter, der die Wartezeit angibt, bevor die Schlange losgeht.
Hier wartet die Schlange zum Beispiel zweieinhalb Sekunden, bevor sie wegmarschiert:Bisher waren in den Programmieraufgaben nur einzelne Aspekte zu lösen. Jetzt wird das Programmieren anspruchsvoller:
Beobachte genau, was die Schlange macht!
Programmiere die zweite Schlange so, dass sie sich möglichst ähnlich bewegt!
(Du findest eine Liste der wichtigsten Befehle rechts, sobald du das Scriptfenster öffnest.)
Tipps:
- Programmiere eine Funktion für den Rundgang. Die Schlange soll also zuerst nach rechts dann nach unten, dann links und dann hinauf gehen. Verwende Parametern, die vorgeben, wie schnell und wie lange die Schlange in jeweils eine Richtung gehen soll!
- Dann programmiere eine Funktion, in der die erst Funtion mit unterschiedlichen Parameter-Werten hintereinander aufgerufen wird.
- Am Schluss programmiere eine Schleife, wo die zweite Funktion oft hintereinander aufgerufen wird!
Erstelle für die Expertenaufgabe „Maus im Keller” am Ende der Seite eine function, die eine Bot-Spielfigur zu einem Element gehen lässt! Definiere bei der Funktionsdefinition einen Parameter so, dass man beim Aufruf angeben kann, zu welchem Element die Maus gehen soll.
So kommt die Maus nämlich besser bis zum vierten Käse. Der Block soll „gehe_zu“ heißen und so aufgerufen werden:
Für die Funktion sind diese Beiden Befehle hilfreich:
Erweitere dein Script von der letzten Aufgabe! Füge der Funktion „gehe_zu“ noch einen Parameter „Dauer“ hinzu. Rufe sie dann wiederholt trickreich so auf, dass die Maus auch noch den vierten Käse frisst.
Ereignisse
Events sind Ereignisse. Ereignisse sind sehr mächtige Möglichkeiten in Programmiersprachen. Damit kann man festlegen, welcher Code ausgeführt werden soll, wenn ein bestimmtes Ereignis eintrifft. Ereignisse ermöglichen einem Programm eine Reaktion.
Ein typisches Beispiel wäre das Ereignis: [eine Taste wurde gedrückt]
oder bei Touch-Screens: [der Bildschirm wurde berührt]
oder [die linke Maustaste wurde geklickt]
In GamBu gibt es zum Beispiel diese Ereignisse: Ein Bot kann entweder etwas berühren oder etwas sehen.
on appear [Elementtyp oder ein Element] () => [Befehl]
also zum Beispiel:
oder
Alle Elementtypen, die ein Bot unterscheiden kann, sind:
wall, ball, player, goal, death, ++, switch, stop. Wenn man nicht auf alle Elemente eines Typs, sondern nur auf ein Einzelelement reagieren will, kann man auch die Elementnummer angeben
Programmiere die Schlange so, dass sie sich nach unten bewegt, sobald sie eine Spielfigur (player) sieht!
KLASSENTURNIER „Das große Fressen“
Jetzt ist es soweit. Programmiere deine Maus möglichst schlau!
-
SpielzielZiel ist es, dass deine Maus viele Käfer und viel Käse frisst, bevor sie entweder stirbt oder die Zeit (1 Minute) aus ist.
-
Tipps fürs ProgrammierenFür das Programmier-Turnier „Das große Fressen” sind zwei einfache GamBu-Befehle und ein Zahlenwert sehr nützlich:
face element (x) Der Befehl dreht den Bot leicht in Richtung des Elements mit der Nummer x. Wenn man das oft wiederholt, schaut er genau zu diesem Element. move forward (0, speed) „move forward“ bewegt den Bot in seine Blickrichtung und „move forward (0, -speed)“ in die entgegengesetzte Richtung. move forward (rechts, 0) Seitwärts: Der erste Parameter (hier „rechts“) gibt an, wie schnell sich der Bot seitlich nach rechts bewegen soll. Bei Minuswerten bewegt er sich, von sich aus gesehen, nach links. der Wert: distance to element (x) Mithilfe der Entfernung (distance to) von einem Element kann ein Script zum Beispiel unterscheiden, ob es die linke oder die rechte Maus steuert. TIPPS: Alle Befehle für GamBu findet man in Abschnitt D (Hacks und Tricks). Wenn man das PDF ausdruckt, hat man seinen eigenen Schummelzettel. Jedes Scriptfenster hat auch rechts einen Bereich mit allen wichtigsten Befehlen.
In Gambu gibt es unter HILFE-Anleitung auch eine Dokumentation aller Scriptbefehle. -
Vorbereitung
- Jede Schülerin und jeder Schüler programmiert eine Maus und kopiert das Script in ein Text-File. So, dass es gut gespeichert bleibt.
- Sobald das Turnier startet, darf niemand mehr sein Script verändern. Die Scripts sollten vorher ausprobiert und getestet werden. Am besten auch gegen Scripts von Klassenkolleginnen oder Kollegen!
- Bildet Zweiergruppen! Bei ungerader Zahl darf es genau eine Dreiergruppe geben.
- Nur ein Gruppenmitglied kopiert beide Scripts in die Script-Fenster der Mäuse des Turnierspiels. Die Startposition der Maus (links oder rechts) kann entweder einvernehmlich oder im Streitfall mit Los entschieden werden.
-
Turnierregeln
-
Startet euer Spiel mit dem Button Bots starten!
(In der Dreiergruppe wird dreimal gespielt und als Ergebnis darf jeder sein besseres Ergebnis behalten.) - Nur die jeweils erfolgreicheren Mäuse steigen in die nächste Runde auf, wenn sie zumindest einen Käfer oder Käse gefressen haben. Bei Gleichstand können auch mehrere Mäuse aufsteigen.
- Alle Gewinnermäuse bilden wieder Zweiergruppen und spielen gegeneinander. Dieser Vorgang wird wiederholt, bis nur noch eine Maus übrig ist oder in einer gesamten Runde niemand mehr ausgeschieden ist. (Dann haben alle übrig gebliebenen Schülerinnen oder Schüler das Turnier gewonnen.)
-
Startet euer Spiel mit dem Button Bots starten!
Maus im Keller
SPEZIALAUFGABE: Für alle, die eine besondere Herausforderung suchen: Erstelle ein Script, damit die Bot-Maus alle Käsestücke im Keller fressen kann, ohne zu sterben!
Es ist mit dem Schalter möglich, die Wächter vom Käseschatz wegzuschicken. Bei schwierigen Problemen ist es oft sehr hilfreich, wenn man zusammenarbeitet und gegenseitig bespricht, wie man eine Lösung finden könnte.