TigerJython xx
für Gymnasien

16. Arbeitsblätter


Arbeitsblatt 1: Python-City



Das Arbeitsblatt (Autor: Martin Schellenberg) stellt ein realistisches Szenario in der Informatik-Branche dar: Sie sind in einer Firma als Programmierer angestellt und müssen ein Projekt ihres Vorgängers weiter führen. Als Vorlage erhalten Sie ein komplexes, lauffähiges Programm. Ihre Aufgabe ist es, das Programm zu verstehen und bestimmte Anpassungen vorzunehmen. Das Programm zeichnet ein Bild einer Stadt. Da der Programmcode zufällige Elemente enthält, wird bei jedem Ausführen des Programms die Stadt anders aussehen.

Programmcode zum Downloaden: pythonCity.zip

1. Lade das Programm herunter, packe es aus, kopiere es in den TigerJython und lasse es mehrmals laufen.

2. Schaue dir das Programm genau an. Die Kommentare helfen dir, den Programmaufbau zu verstehen.

3. Ändere die Anzahl Häuser. Es sollten zuerst nur 30, dann 70 und schlussendlich 45 Häuser gezeichnet werden.

4. Die Fenster sollen rot nicht gelb sein.

5.

Die gelben Fenster gefallen dir besser, es sollen aber nicht alle Fenster beleuchtet sein. 30% der Fenster sollen schwarz sein, der Rest gelb. Setzte dazu folgenden Code an der richtigen Stelle ein

if random() < 0.4: meineFarbe = [0, 0, 0]

6. Auch die Häuser müssen nicht alle grau sein. Die Hälfte der Häuser sollte eine rötliche Farbe haben (z.B. [170, 100, 100]).

7. Ein kleiner Stern soll neben dem Mond zu sehen sein. Du zeichnest den Stern rund mit dem Befehl fillCircle().

8. Zeichne 100 zufällige Sterne am Nachhimmel.

9. Die Sterne sind nicht gleich gross. 30% hat Durchmesser 3, die restlichen 2.

10. Ergänze das Bild nach eigenen Ideen ( Schiffe am Wasser, Häuser im Wasser spiegeln...)

 

Arbeitsblatt 2: Brain Game



Spielbeschreibung

Das Spielfeld besteht aus einer Lampe, welche in den Farben rot, gelb, grün und blau leuchten kann, und im ausgeschalteten Zustand weiss ist. Es gibt zudem 4 kreisförmige Schaltflächen (Buttons), mit den Farben rot, gelb, grün und blau.

Die Lampe zeigt immer längere Sequenzen mit zufälligen Farben: Zuerst mit einer Farbe, dann mit zwei Farben, usw. Der Spieler muss nach jeder gezeigten Sequenz durch Drücken der Buttons die gezeigte Sequenz wiederholen. Macht er dies richtig, so wird die Länge der Sequenz um 1 erhöht, macht er einen Fehler, so wird das Spiel beendet. Ziel ist es, eine möglichst lange Sequenz zu erreichen.

Das Problem wird in 5 Schritten gelöst.

 

Phase 1: Darstellung des Spielfeldes
Verwende das folgende Programmgerüst

from gpanel import *

def showLamp(col):
    pass

def showButton(number):
    pass

def setup():
    for i in range(4):
        showButton(i)
    showLamp(-1)
  
makeGPanel(-200, 200, -200, 200)
setColor("black")
fillRectangle(400, 400)
addStatusBar(30)
setup()
► In Zwischenablage kopieren
 

Schreibe die Funktionen gemäss folgender Dokumentation:

showLamp(col) Zeichnet die Lampe - einen gefüllten Kreis mit dem Durchmesser 100 (Radius 50) in der Mitte des Spielfeldes. Der Parameter col bestimmt die Füllfarbe. Rot (col = 0), gelb (col = 1), grün (col = 2), blau (col = 3), weiss (sonst, z.B. col = -1)
showButton(number)

Zeichnet einen Button - farbigen Kreis mit dem Durchmesser 50 (Radius 25)

number
Farbe
Position
0
rot
(100, 0)
1
gelb
(0, -100)
2
grün
(-100, 0)
3
blau
(0, 100)
sonst
nichts

setup() Erstellt Spielfeld in Ausgangsituation


Phase 2: Mit der Maus die Lampe in den 4 verschiedenen Farben ein- und ausschalten
Der Benutzer soll durch Drücken auf die Farbbuttons die Lampe mit der gleichen Farbe einschalten können. Beim Loslassen wird die Lampe wieder weiss. Verwende die Callbacks: onMousePressed(x, y) und onMouseReleased(x, y), die du bei makeGPanel() registrieren musst. Verwende dazu eine Variable buttonIndex im Bereich 0...3 für Klicks auf Buttons und -1 und -2 für Klicks auf  weisse und schwarze Flächen.

def onMousePressed(x,y):    
    if getPixelColorStr(x, y) == "red":
        buttonIndex = 0
    elif ...

    elif getPixelColorStr(x, y) == "white":
        buttonIndex = -1
    else:
        buttonIndex = -2    
    if buttonIndex >= 0:
        showLamp(buttonIndex)

def onMouseReleased(x,y):
    showLamp(-1)                
  
makeGPanel(-200, 200, -200, 200, mousePressed = onMousePressed, 
                                 mouseReleased = onMouseReleased)

Phase 3: Zufällige Sequenzen mit Farben rot, gelb, grün und blau erstellen
Importiere die ganzzahligen Zufallszahlen mit from random import randint. Füge im Hauptteil die folgenden Zeilen ein, die eine Liste seq mit n zufälligen Zahlen im Bereich 0..3 erstellt. Die Anzahl der Elemente in der Sequenz wird zum Testen n = 3 gesetzt

seq = []
n = 3
for i in range(n):
    seq.append(randint(0, 3))
setStatusText("Showing sequence with length " + str(n))    
showSequence()

Schreibe die Funktion showSequence() , die diese Sequenzen darstellt. Die Anzeigedauer wird hier auf 1000 Millisekunden gesetzt.
def showSequence():
    for k in seq:
        delay(1000)
        showLamp(k)
        delay(1000)
        showLamp(-1)

Phase 4: Die Sequenz überprüfen

Nach der Anzeige der Sequenz mit 3 Farben beginnt der Benutzer mit der Wiederholung der Farbsequenz durch Drücken der Buttons. Macht er einen Fehler, so bricht das Spiel sofort mit einer IsOver-Meldung ab, macht er es richtig, so wird eine Erfolgsmeldung ausgeschrieben.

Der Test auf die richtige Sequenz erfolgt bei jedem Loslassen der Maus, also im Callback onMouseReleased(x, y).  Dazu muss man mit der Variablen clickCount die bereits gemachten Mausklicks zählen und  mit

if seq[clickCount] == buttonIndex: 
      clickCounr += 1

überprüfen, ob der richtige Klick gemacht wurde. Ist dies der Fall, so erhöht man clickCount, andernfalls setzt man ein Flag isOk = False. Damit das Hauptprogramm informiert wird, wenn der Test zu Ende ist, verwendet man ein Flag isUserActive.

global clickCount, isUserActive, isOk
if seq[clickCount] == buttonIndex: 
    clickCounr += 1
else:
    isUserActive = False
    isOk = False
if clickCount == len(seq):
    isUserActive = False
    isOk = True

Hat man die ganze Sequenz erfolgreich getestet, so setzt man isOk = True. Die Variablen clickCount, isOk und isUserActive müssen als global definiert und im Hauptprogramm initialisiert werden. Im Hauptprogramm fügst du eine Warteschleife ein, die solange läuft, bis die Benutzeraktion beendet ist.

isUserActive = True
isOk = False
while isUserActive:
    delay(10)
if isOk:
    setStatusText("Sequence confirmed")
else:
    setStatusText("Sequence false")    
delay(2000)

Phase 5: Die Sequenz verlängern
Bisher hast du mit einer festen Sequenzlänge von 3 gespielt. Jetzt musst du noch gemäss der Spielvorgabe die Sequenzlänge von 1 an erhöhen, falls der Benutzer sie richtig erraten hat. Dies tust du solange, bis er einen Fehler macht.

Du hast das Programm so gut vorbereitet, dass diese Erweiterung einfach zu implementieren ist. Nach dem setup() und der Initialisierung von n = 1 fügst du den Rest des Programms in eine endlose while-Schleife und erhöhst darin n, wenn der Benutzer erfolgreich ist. Macht er einen Fehler, so brichst du die Schleife mit break ab.
setup()
n = 1
while True:
    clickCount = 0
    setStatusText("Showing sequence with length: " + str(n) + "...")
    delay(2000)
    seq = []
    for i in range(n):
        ....

    if isOk:
        setStatusText("Sequence confirmed")
        delay(2000)
        n += 1
    else:    
        break

Phase 6: Das Spiel robust machen

Mit der Phase 5 kann man das Spiel bereits spielen, wenn sich der Benutzer an bestimmte Regeln hält und nicht in einem falschen Moment mit der Maus klickt. Darum musst du das Programm noch so verbessern, dass ein Mausklick zum falschen Zeitpunkt zu keiner Katastrophe führt. Dazu führst du im Hauptprogramm ein weiteres Flag isMouseEnabled ein. Diese wird zu Beginn der while True Schleife auf False gesetzt und nur dann auf True steht, wenn der Benutzer die Maus verwenden darf, also wenn er die Sequenz zurückgeben muss. Ist isMouseEnabled = False, so kehrst du einfach in den beiden Callbacks ohne weitere Aktion zurück.

 if not isMouseEnabled:
      return


Phase 7: Verbesserungen, Ergänzungen
Du kannst das Spiel noch nach deinen Ideen verbessern, beispielsweise:
- Optimiere die Anzeigedauer, 2 Sekunden sind für schnelle Spieler zu lang
- Ergänze das Spiel mit akustischen Signalen
- Mehr als 4 Farben verwenden
- Sehr einfache Sequenzen (z. B. rot, rot, rot) ausschliessen