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

Info für Lehrende

Eingeloggte Lehrer*innen 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. In GamBu-Skript heißen solche Blöcke, in denen mehrere Befehle zusammengefasst werden, block.

block [blockname] [befehl 1] [anderer Befehl] [beliebig viele weitere Befehle] blockende

Aufruf eines Blocks:

blockname
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 Blocknamen 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-Skript 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
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!
Assets
Texturen Sounds
Wenn alle Texturen, Bilder und Grafiken von dir selbst erstellt, gemalt oder gezeichnet worden sind, dann stehen sie bei einer Veröffentlichung automatisch unter CC BY-ND. Außer den selbst gemachten dürfen auch Grafiken enthalten sein, die ausdrücklich OHNE NAMENSNENNUNG frei verwendbar sind, dann stehen alle Grafiken, auch deine eigenen, nach Veröffentlichung unter CC0.
Die Texturen sollten genau 62 x 62 Pixel groß sein
Wenn alle Musikstücke und Geräusche von dir selbst erstellt, gesungen, gespielt und komponiert worden sind, dann stehen sie bei einer Veröffentlichung automatisch unter CC BY-ND. Außer den selbst gemachten dürfen auch Sounds enthalten sein, die ausdrücklich OHNE NAMENSNENNUNG frei verwendbar sind, dann stehen alle Sounds, auch deine eigenen, nach Veröffentlichung unter CC0.
Patrouille – Vorlage
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!
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 und auch 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 so:

function patrouilliere() {  [ Bewegung einer Maus in Java-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 (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.

gefressenerkaese = 0 bei berührung von ziel 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:

block gehe_und_sage wenn futter < 10 dann rechts 1 sonst links 1 sage futter blockende wiederhole 100 sekunden gehe_und_sage Zu definieren ist noch:
  1. die Variable des Futters (Wie viel Futter hat die Maus zu Beginn gefressen?)
  2. die Zeile "bei berührung von"
Info für Lehrende
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!

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 den Block so definieren, dass ein Bot unterschiedlich patrouillieren kann:

block patrouilliere geschwindigkeit, dauer wiederhole dauer sekunden hinauf geschwindigkeit wiederhole dauer sekunden hinunter geschwindigkeit blockende

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

Und so kann man einen gestressten schnellen Wächter erstellen:

patrouilliere 10, 1
patrouilliere unterschiedlich Kommandanten-Roboter 2
Aufruf eines Blocks mit Parameter

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
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!

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 gleich bewegt! Die beste Lösung besteht aus nur 11 Code-Zeilen und zwei verschiedenen Blöcken. (Du findest eine Liste der wichtigsten Befehle im Scriptfenster rechts.)

Tipps:

  1. Programmiere einen Block für den Rundgang mit Parametern, die vorgeben, wie schnell und wie lange die Schlange in eine Richtung im Block gehen soll!
  2. Dann programmiere einen Block, in dem der erste Block mit unterschiedlichen Werten hintereinander aufgerufen wird.
  3. Am Schluss programmiere eine Schleife, wo der zweite Block oft hintereinander aufgerufen wird!

Info für Lehrende
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!
Komischer Rundgang - Vorlage
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!
Komischer Rundgang - Aufgabe

Erstelle für die Expertenaufgabe „Maus im Keller” am Ende der Seite einen Block, der eine Bot-Spielfigur schräg gehen lässt! Definiere bei der Blockdefinition zwei Parameter so, dass man beim Blockaufruf angeben kann, wie schräg die Maus geht. So kommt die Maus nämlich besser bis zum vierten Käse. Der Block soll „schräg“ heißen und so aufgerufen werden: wiederhole 5 sekunden schräg 1,1 Du hast diese Aufgabe geschafft, wenn die Maus mit diesem wiederholten Blockaufruf den Käse rechts oberhalb der Maus frisst und weiter schräg bis oben geht.

Info für Lehrende
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!

Erweitere dein Script von der letzten Aufgabe! Rufe den Block wiederholt trickreich so auf, dass die Maus die ersten drei Käse durch drei schräge Bewegungen 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.

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 zwei Ereignisse: Ein Bot kann entweder etwas berühren oder etwas sehen.

bei berührung von [Elementtyp oder ein Element] [Befehl]
bei sicht von [Elementtyp oder ein Element] [Befehl]

also zum Beispiel:

bei berührung von spielfigur sage "Hallo :-)" bei berührung von wand sage "aua"

oder

bei sicht von tod zurück 100 bei sicht von element 10 sage "Ohh, was sehen meine müden Augen. Ein seltener Freund."

Alle Elementtypen, die ein Bot unterscheiden kann, sind: wand, ball, spielfigur, ziel, tod, ++. 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 sieht!

Info für Lehrende
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!

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 drei einfache GamBu-Befehle und ein Zahlenwert sehr nützlich:
    richtung 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.
    vor x „vor” bewegt den Bot in seine Blickrichtung und „zurück” in die entgegengesetzte Richtung.
    zurück x ACHTUNG: Beim Zurückbewegen dreht sich der Bot um und ändert damit seine Blickrichtung.
    der Wert: entfernung von element x Mithilfe der Entfernung 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.
  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
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!

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
GamBu Konsole
Gewonnen!
Bots starten?
Verloren!
Der Seppibär is los!

Hacks und Tricks

Syntax
Beispiel
Anmerkung
block [blockname] [p1, p2, ..] [befehl 1] [anderer Befehl] [beliebig viele weitere Befehle] blockende
block schraeg x,y rechts x hinauf y blockende
p1, p2 sind Parameter. Man kann eigene Namen erfinden und sie im Block wie Variablen verwenden.
[blockname] [w1, w2]
schraeg 1,1 schraeg 10, -10
Mit diesem Aufruf des eigenen Blocks mit dem Namen „schraeg” bewegt sich der Bot ein bisschen nach rechts oben oder im zweiten Beispiel schneller nach rechts unten.
[variablenname] = [Information]
alter = 12 satz = "Mein Freund ist ein Bot"
Der Variablenname kann alles außer ein GamBu-Script-Befehlswort sein.
bei berührung von [Elementtyp oder ein Element] [Befehl]
bei berührung von spielfigur sage "Hallo" bei berührung von wand sage "aua"
Das Event wird bei Berührung ausgelöst
bei sicht von [Elementtyp oder ein Element] [Befehl]
bei sicht von tod zurück 100 bei sicht von element 10 sage "Ohh, mein Lieblings Wuzi"
Das Event wird bei Sicht ausgelöst
richtung element n
richtung element 103
Der Bot dreht sich ein kleines Stück in die Richtung zum Element.
richtung element n, kraft
richtung element 103, 2
Der Bot dreht sich ein kleines Stück in die Richtung zum Element und bewegt sich hin.
vor x
vor 10
Der Bot macht einen Sprung vor.
zurück x
zurück 10
Der Bot macht einen Sprung zurück.
entfernung von element x
wenn entfernung von element 1 < 100 dann sage "Ich komme näher."
Eine solche wenn .. dann - 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 zu einem zusammengefasst.

Versteckte Möglichkeiten

Die folgenden Befehle sind nicht auf SchuBu-Seiten beschrieben. Sie sind nicht notwendig, um gute Spiele zu machen. Sie ermöglichen aber spezielle Spielmechaniken für Experten.

Syntax
Beispiel
Anmerkung
wiederhole bis [Bedingung wahr ist] [Befehl]
wiederhole bis entfernung von element 1 < 2 vor 1
Der Bot beschleunigt nach vor, bis er zwei Felder neben dem Element 1 ist.
lade textur von element n
lade textur von element 5
Der Bot übernimmt die Textur von Element 5
lade textur von element n für element m
lade textur von element 5 für element 0
Das Element 0 bekommt die Textur von Element 5
bei taste [Taste] [Befehl]
bei taste "g" sage "g wurde gedrückt"
Mit diesem Event kann man auf Keyboard-Tasten reagieren.
Hier eine Taste drücken, um den Tastenwert in die Zwischenablage zu kopieren:
global.[variablenname] = [information]
global.punkte = global.punkte + 1
Wenn ein Variablenname mit .global anfängt, dann kann man auf diese Variable von allen Skripts aller Bots zugreifen.

11. Funktionen und Events
Tools
Zeit
Zufall
Zeigen
Rechnen
Antworten
Quiz
Über SchuBu
1.1.5.a
Meine Lösung prüfen
später prüfen
Tipp 1
Tipp 2
Lösung
   
Ok
erledigt
Juhu!
Du hast alle Aufgaben abgeschlossen.
Dein Ergebnis:
Genug für heute
leider falsch
Oje!
Das ist leider nicht ganz richtig.
Noch einmal versuchen
richtig
Bravo!
Deine Lösung ist richtig.
Nächste Aufgabe