TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
braingame

ARBEITSBLATT 3: 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  durch schrittweisen Ausbau gelöst. Es werden also immer mehr Anforderungen erfüllt.

 

 

 

PHASE 1: DARSTELLUNG DES SPIELFELDES

 

Vorgehen: Verwende das folgende Programmgerüst.

# Ex1.py

from gturtle import *

def showLamp(col):
	pass

def showButton(number):
	pass

def setup():
	pass

# ------------------ main ------------------
Options.setPlaygroundSize(400, 400)    
makeTurtle()
ht()
penUp()
clear("black")
setTitle("Brain Game")
addStatusBar(30)
setup()
► In Zwischenablage kopieren


Schreibe die Funktionen gemäss folgender Dokumentation:

Funktion showLamp(col)
Zeichnet farbigen Kreis mit Durchmesser 100 in Spielfeldmitte:

col
Farbe
0
rot
1
gelb
2
grün
3
blau
sonst
weiss


Funktion showButton(number)

Zeichnet farbigen Kreis mit Durchmesser 50:

col
Farbe
Position
0
rot
rechts
1
gelb
unten
2
grün
links
3
blau
oben
sonst
nichts
 


Funktion setup()

Erstellt Spielfeld in Ausgangssituation.

 

 

PHASE 2: DARSTELLUNG DES SPIELFELDES

 

Vorgehen:
Füge im Hauptteil die folgenden Zeilen ein, die eine Liste seq mit n zufälligen Zahlen im Bereich 0..3 erstellt und die Sequenz mit der Funktion showSequence() darstellt.

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

 

 

PHASE 3: MIT DER MAUS DIE LAMPE EIN-/AUSSCHALTEN

 

Nach der Anzeige der Sequenz mit 3 Farben, soll der Benutzer durch Drücken auf die Farbbuttons die Lampe mit derselben Farbe einschalten können. Beim Loslassen erlischt die Lampe wieder.

Vorgehen:
Verwende die Callbacks: pressed() und released(), die du mit den Annotationen registrierst. 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.

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

@onMouseReleased
def released(x,y):
    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.

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

if seq[clickCount] == buttonIndex:

überprüfen, ob der richtige Klick gemacht wurde. Ist dies der Fall, so erhöht man clickCount, andernfalls setzt man ein Flag isOk = False. Hat man die ganze Sequenz erfolgreich getestet, so setzt man isOk = True. Damit das Hauptprogramm informiert wird, wenn der Test zu Ende ist, verwendet man ein Flag isUserActive und fügt eine Warteschleife ein, die solange läuft, bis die Benutzeraktion beendet ist, also:

clickCount = 0
isUserActive = True
isOk = False
while isUserActive:
    delay(10)
if isOk:
    setStatusText("Sequence confirmed")
else:    
    setStatusText("Sequence failed")

Vergiss nicht,  im Callback released() die Variablen clickCount, isUserActive und isOk global zu machen.

 

 

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.

 

 

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 ein weiteres Flag isMouseEnabled ein, dass nur dann auf True steht, wenn der Benutzer die Maus verwenden darf. Ist isMouseEnabled False, so kehrst du einfach in den Callbacks ohne weitere Aktion zurück.

def pressed(x,y):
    if not isMouseEnabled:
        return
    ...
   

def released(x,y):
    if not isMouseEnabled:
        return
    ...

 

 

VERBESSERUNGEN, ERGÄNZUNGEN

 

Du kannst das Spiel noch nach deinen Ideen erweitern, beispielsweise:

  • Wiederholtes Spielen ohne das Programm neu zu starten
  • Veränderung des Schwierigkeitsgrades (schnelleres Anzeigen der Farbsequenz, Testen, ob man die Sequenz innerhalb einer bestimmten Zeit bestätigt hat, usw.) Das Einstellen des Schwierigkeitsgrades könnte vor Spielbeginn durch Mausklicks auf den weissen Kreis erfolgen
  • Statt einer Farbsequenz kannst du eine Tonsequenz abspielen, die man durch Klicken auf die 4 Buttons wiedergeben muss
  • Mehr als 4 Farben/Töne verwenden
  • Statt eine Farbsequenz kannst du eine Zahlsequenz mit den Zahlen 1, 2, 3 und 4 anzeigen
  • Statt Farben kannst du kleine Bilder verwenden, die mit drawImage("sprites/bildname") angezeigt werden
  • Sehr einfache Sequenzen (z. B. rot, rot, rot, rot) ausschliessen.