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.

Arbeitsmittel
gesperrter SchuBu+ Inhalt
gesperrter SchuBu+ Inhalt

Info für Lehrende

Eingeloggte Lehrer*innen mit Lizenz für dieses Buch werden hier durch Unterrichtsvorschläge und Zusatzinformationen zur Seite und zu Lernzielen unterstützt.
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:

patrouilliere
und
rundgang

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.

function [Funktionsname] () { [Befehl 1] [anderer Befehl] [beliebig viele weitere Befehle] }

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.

function hallo_und_los(){ say ("Hallo!") repeat seconds(10) move forward (0,5) } //hier der aufruf: hallo_und_los()
patrouilliere Kommandanten-Roboter gibt vor seinen Roboter-Untergebenen den Befehl patrouilliere
Aufruf eines Blocks

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.

Info für Lehrende
Patrouille – Vorlage
Patrouille – Aufgabe
Ändere die Geschwindigkeit der Schlange oben jetzt so, dass sie doppelt so schnell hinunter und hinaufgeht!
Info für Lehrende

Auch in Scratch gibt es Funktionen, dort heißen sie Blöcke:

Screenshot aus der 2D-Engine Scratch, der ein kurzes Script zeigt.
Links die Definition eines Blocks in Scratch, rechts der Aufruf.

In Java-Script schreibt man Funktionen gleich, wie in GamBu-Script:

function patrouilliere() {  [ Bewegung einer Maus in Java-Script ] } // Aufruf der Funktion patrouilliere()

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 (z. B. eine Zahl, einen Text, ein Bild, …) speichert. Dieser Speicher bekommt für die spätere Verwendung einen Namen.

So wird eine Variable in GamBu-Script definiert:

[variablenname] = [information]
zum Beispiel
alter = 12

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.)

gefressenerkaese = 0 on touch goal () => gefressenerkaese = gefressenerkaese + 1
Die Variable ist ein kleiner Informationsspeicher.

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:

function gehe_und_sage(){ if (futter < 10) move (1,0) else move (-1,0) say (futter) } repeat seconds (100) gehe_und_sage() Zu definieren ist noch:
  1. die Variable des Futters (Wie viel Futter hat die Maus zu Beginn?)
  2. eine Zeile "on touch goal () => ..."
Info für Lehrende

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:

function patrouilliere (geschwindigkeit, dauer){ repeat seconds(dauer) move (0, geschwindigkeit) repeat seconds(dauer) move (0, -geschwindigkeit) }

Mehrere Parameter werden mit Beistrichen getrennt. Jetzt kann man praktischerweise beim Aufruf einen sehr langsamen und müden Wächter patrouillieren lassen: patrouilliere (0.5, 5) Beachte, dass Kommazahlen in GamBu-Script mit einem Punkt geschrieben werden!

Und so kann man einen gestressten schnellen Wächter erstellen: patrouilliere (10, 1)

patrouilliere unterschiedlich Kommandanten-Roboter 2
Die Roboter gehorchen aufs Wort.

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: patrouilliere (2.5)

Info für Lehrende

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:

  1. 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!
  2. Dann programmiere eine Funktion, in der die erst Funtion mit unterschiedlichen Parameter-Werten hintereinander aufgerufen wird.
  3. Am Schluss programmiere eine Schleife, wo die zweite Funktion oft hintereinander aufgerufen wird!

Info für Lehrende
Komischer Rundgang - Vorlage
Komischer Rundgang - Aufgabe

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: gehe_zu (element_num) Du hast diese Aufgabe geschafft, wenn die Maus alle drei Käse frisst nachdem die Funktion dreimal für die Elemente 26, 29 und 108 aufgerufen wurde.
Für die Funktion sind diese Beiden Befehle hilfreich: //um sich zu einem Element zu drehen: face element (element_num) //um nach vorne zu gehen: move forward (0, 1) Vergiss nicht, diese Befehle in einer Schleife auszuführen, damit die Maus auch wirklich bis zum Element geht!

Info für Lehrende

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.

Info für Lehrende

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]

Drück mich! Event auslösen
Ein Event auslösen

In GamBu gibt es zum Beispiel diese Ereignisse: Ein Bot kann entweder etwas berühren oder etwas sehen.

on touch [Elementtyp oder ein Element] () => [Befehl]
on appear [Elementtyp oder ein Element] () => [Befehl]

also zum Beispiel:

on touch player () => say ("Hee!") on touch wall () => say ("aua")

oder

on appear death () => move (0,-100) on appear element (10) () => say ("Ohh, was sehen meine müden Augen. Ein seltener Freund.")
Info für Lehrende

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 (z. B. element (42)). Die Elementnummern sieht man immer auf allen Elementen, sobald man ein Scriptfenster öffnet.

Programmiere die Schlange so, dass sie sich nach unten bewegt, sobald sie eine Spielfigur (player) sieht!

Info für Lehrende

KLASSENTURNIER „Das große Fressen“

Jetzt ist es soweit. Programmiere deine Maus möglichst schlau!

  1. Spielziel
    Ziel ist es, dass deine Maus viele Käfer und viel Käse frisst, bevor sie entweder stirbt oder die Zeit (1 Minute) aus ist.
  2. Tipps fürs Programmieren
    Fü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.
  3. 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.
  4. 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.)
Info für Lehrende

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!

Tipp:
GamBu Schalter GamBu Schalter

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.

Info für Lehrende

Hacks und Tricks

Syntax
Beispiel
Anmerkung
function [bezeichnung] ([p1, p2, ..]) { [befehl 1] [anderer Befehl] [beliebig viele weitere Befehle] }
function kreis (drehung , geschwindigkeit) { rotate (drehung) move forward (0, geschwindigkeit) }
p1, p2 sind Parameter. Man kann eigene Namen erfinden und sie in der Funktion wie Variablen verwenden.
[Funktionsbezeichnung] ([w1, w2])
kreis (1,1) kreis (10, -10)
Mit diesem Aufruf der eigenen Funktion mit dem Namen „kreis” bewegt sich der Bot ein bisschen in einem Kreis weiter. Damit er einen ganze Kreis fährt, muss man diese Funktion wiederholt aufrufen.
[variablenname] = [Information]
alter = 12 satz = "Mein Freund ist ein Bot"
Der Variablenname kann alles außer ein GamBu-Script-Befehlswort sein.
on touch [Elementtyp oder ein Element oder finger] ([event_info oder nichts]) => [Befehl]
on touch player () => say ("Hallo") on touch wall () => say ("aua") on touch element (9) () => say ("Oh. du bist es.") on touch finger () => say ("Du hast mich angeklickt.")
Das Event wird bei Berührung ausgelöst. Element-Typen: ball, player, goal, death, ++, wall, stop, switch, bot – finger bedeutet, dass man das Element angeklickt hat.
on appear [Elementtyp oder ein Element] ([event_info oder nichts]) => [Befehl]
on appear death () => move forward (0, -100) on appear element (10) () => say ("Hallo, mein Lieblings Wuzi!")
Das Event wird bei Sicht ausgelöst.
face element (n)
face element (103)
Der Bot dreht sich ein kleines Stück in die Richtung zum Element.
move forward (rechts, vor)
move forward (0, 10)
Der Bot bewegt sich etwas nach vor. Bei minus (0, 10) würde er sich zurück und bei (10,0) von sich aus gesehen nach rechts bewegen.
rotate (x)
rotate (10)
Der Bot dreht sich ein bisschen im Uhrzeigersinn. Achtung: Elemente, die Lebewesen darstellen, drehen sich in die Richtung, in die sie sich bewegen. Das kann der Grund sein, wenn rotate keine Auswirkung zeigt.
distance to element (x)
if (distance to element (x) < 100) say ("Ich komme näher.")
Eine solche if () .. Konstruktion muss in einer Schleife wiederholt werden, damit der Bot im richtigen Augenblick reagieren kann.
log ("text" + "text2" + x)
log ("Der Wert der Variable my_v = " + my_v)
Mit log kann man Texte und Werte in die GamBu-Konsole schreiben. Das hilft beim Fehlerfinden. Mit + werden mehrere Texte verbunden.

12. Funktionen und Events
gesperrter SchuBu+ Inhalt Tools
Zeitgesperrter SchuBu+ Inhalt
Zufallgesperrter SchuBu+ Inhalt
Zeigengesperrter SchuBu+ Inhalt
Rechnengesperrter SchuBu+ Inhalt
Antwortengesperrter SchuBu+ Inhalt
Quizgesperrter SchuBu+ Inhalt
Info
Buchauswahl Digitale Grundbildung 2 - Inhaltsverzeichnis
Tools
Zeitgesperrter SchuBu+ Inhalt
Zufallgesperrter SchuBu+ Inhalt
Zeigengesperrter SchuBu+ Inhalt
Rechnengesperrter SchuBu+ Inhalt
Antwortengesperrter SchuBu+ Inhalt
Quizgesperrter SchuBu+ Inhalt
Über SchuBu
Zwischenstand gespeichert
Meine Lösung prüfen
erledigt
Juhu!
Du hast das Aufgabenpaket abgeschlossen.
Erledigt:
Genug für heute