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() |
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)
|
||||||||||||||||||
setup() | Erstellt Spielfeld in Ausgangsituation |
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)
seq = [] n = 3 for i in range(n): seq.append(randint(0, 3)) setStatusText("Showing sequence with length " + str(n)) showSequence()
def showSequence(): for k in seq: delay(1000) showLamp(k) delay(1000) showLamp(-1)
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)
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
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