TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
ereignisse

11. EREIGNISSE

 

 

DU LERNST HIER...

 

dass die ereignisgesteuerte Programmierung ein neues Programmierkonzept ist, das aber den alltäglichen Erfahrungen sehr nahe kommt. Statt dass du mit einem Programm der Turtle in zeitlicher Abfolge Befehle erteilst, könntest du die Turtle so steuern, dass sie bei bestimmten Ereignissen ihren Zustand ändert.

 

 

MUSTERBEISPIEL ZU CALLBACKS

 

Nach dem Start des Programms verharrt die Turtle in der Homeposition, bis du ihr mit einem Mausklick befiehlst, an die Stelle des Mauscursors zu springen. Die Programmiertechnik, um auf einen Mausevent zu reagieren, ist die Folgende:

Du schreibst eine Funktion drawDot() (der Name ist frei wählbar). Dort legst du fest, was die Turtle beim Mausklick tun soll. Hier bewegt sie sich die Stelle des Mausklicks und zeichnet mit dot(30) einen gefüllten Kreis. Deine Funktion wird als benannte Parameter von makeTurtle() registriert. So teilst du dem System mit, dass es diese Funktion bei jedem Mausklick aufrufen soll. Dabei werden ihr die Koordinaten x, y des Mauscursors übergeben.

from gturtle import *

def drawDot(x,y):
    moveTo(x, y)
    dot(30)

makeTurtle(mouseHit = drawDot)
► In Zwischenablage kopieren
 


 

 

MERKE DIR...

 

Die neue Programmiertechnik ist daran zu erkennen, dass die Funktion drawDot(x, y) nirgends von deinem Programm aufgerufen wird. Es ist vielmehr das System, dass sie beim Auftreten eines Ereignisses aufruft. Eine solche Funktion nennen wir Callbackfunktion oder kurz Callback.

 

 

DEIN ERSTES GAME

 


Tic-Tac-Toe ist ein bekanntes Spiel, bei dem zwei Spieler abwechslungsweise Kreuze oder Kringel in die Felder eines 3x3-Gitters setzen mit dem Ziel, als erster drei eigene Zeichen in einer horizontalen, vertikalen Linie oder einer der Diagonalen zu haben.

 

Der Einfachheit halber verwendest  du im Programm keine Zeichen, sondern färbst bei einem Mausklick die Felder je nach Spieler rot oder grün. Dabei verwendest du den Füllbefehl fill(), mit dem die Turtle das geschlossene Gebiet ausfüllt, in dem sie sich gerade befindet.

Damit die Füllfarbe nach jedem Klick umschaltet, führst du eine Variable player ein, die zwischen dem Wert 1 und 2 umschaltet. player ist im Hauptprogramm definiert und ihr Wert wird zuerst auf 1 gesetzt (man sagt auch, "auf 1 initialisiert"). Verwendet wird die Variable aber in der Callbackfunktion fillSquare(x, y). Damit du die Variable in der Funktion verändern kannst, musst du sie als global bezeichnen.

 


from gturtle import *

def square():
    repeat 4:
        forward(50)
        right(90)

def drawGrid():
    for x in range(3):
        for y in range(3):
            setPos(50 * x, 50 * y)
            square()

def fillSquare(x, y):
    global player
    if player == 1:
        setFillColor("red")
        player = 2
    elif player == 2:
        setFillColor("green")
        player = 1
    setPos(x, y)
    fill()

player = 1        
makeTurtle(mouseHit = fillSquare)
hideTurtle()
drawGrid()
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Da player sowohl im Hauptprogramm wie in der Funktion fillSquare(x, y) verwendet wird, nennt man sie eine globale Variable. Eine Variable die hingegen nur in einer Funktion verwendet wird, nennt man eine lokale Variable.

Du wirst als Eigentätigkeit das Programm noch etwas verbessern.

 

 

ZUM SELBST LÖSEN

 

1.

Zeichne mit einer Wiederholstruktur den nebenstehenden Stern und fülle ihn mit Mausklicks nach deinem Geschmack aus.
 

2.
Bei jedem Mausklick soll ein gefüllter Stern entstehen. Du musst die Turtle verstecken, damit der Stern fertig gezeichnet wird, bevor du das nächste Mal klickst.  

3.

Schreibe ein Programm, um mit 5 Mausklicks ein gefülltes 5-Eck zu zeichnen. Bei jedem Klick erscheint ein kleiner Markierungspunkt und beim fünften Klick das gefüllte Polygon. Du benötigst dazu eine Zählvariable n, die du im Callback erhöhst. Das Füllen machst du mit startPath()/fillPath().

 

4.

Verbessere das Tic-Tac-Toe-Spiel:

a) Färbe den Hintergrund grau und die Felder weiss

b) Bestimme bei jedem Mausklick mit getPixelColorStr() die Farbe, auf die du gerade klickst. Führe das Füllen nur dann durch, falls du auf einen weissen Hintergrund klickst.
 
 
5*.


Erstelle ein Nim-Spiel mit 15 grünen Steinen. Jeder Spieler kann mit einem Mausklick maximal 3 Steine entfernen und muss dann auf eine rote Schaltfläche, sozusagen den OK-Button,  klicken. Dann kommt der andere Spieler zum Zug. Wer den letzten Stein entfernt, hat verloren. Wie in der Aufgabe 4 verwendest du die Hintergrundfarbe mit getPixelColorStr() . (Das Spiel wird üblicherweise mit Zündhölzern gespielt.)

 

   

 

2-1
Fachlicher Hinweis:

Es gibt in der Turtlegrafik viele weitere Callbacks für Maus- und Keyboardevents. Sie sind in der Dokumentation beschrieben.

11-2
Didaktische Hinweise:

Die Registrierung kann auch mit der Annotationszeile @onMouseHit erfolgen:

from gturtle import *

@onMouseHit
def mouseHit(x,y):
    moveTo(x, y)
    dot(30)

makeTurtle()

Es ist Geschmackssache, was man vorzieht.