Das Spiel besteht aus 25 Lampen, die in einem 5 x 5 Grid angeordnet sind. Zu Beginn des Spiels sind alle Lampen eingeschaltet. Wenn man auf eine Lampe klickt, wird sie und die 4 benachbarten Lampen "invertiert", z. B.: Ziel des Spiels ist es, alle Lampen auszuschalten. |
|
# LightsOut.py from gamegrid import * def pressCallback(e): loc = toLocationInGrid(e.getX(), e.getY()) locs = [0] * 5 locs[0] = Location(loc.x, loc.y) locs[1] = Location(loc.x, loc.y - 1) locs[2] = Location(loc.x, loc.y + 1) locs[3] = Location(loc.x - 1, loc.y) locs[4] = Location(loc.x + 1, loc.y) for i in range(5): a = getOneActorAt(locs[i]) if a != None: a.showNextSprite() refresh() return True makeGameGrid(5, 5, 50, Color.black, False, mousePressed = pressCallback) setTitle("LightsOut") for i in range(5): for k in range(5): lamp = Actor("sprites/lightout.gif", 2) addActor(lamp, Location(i, k)) lamp.show(1) show() |
Erklärungen zum Programmcode:
Das Spielfenster besteht aus 5 Zeilen und 5 Spalten. Zuerst erzeugen wir in jeder der 25 Zellen eine eingeschaltete Lampe (lamp.show(1) | ||||
In der Callbackfunktion pressCallback() wird zuerst die Location loc des Mausklicks bestimmt. Diese hat die Koordinaten x, y. | ||||
|
||||
Schliesslich werden die betroffenen Lampen, mit showNextSprite() invertiert. Da beim Klick in die Randzellen einige benachbarte Zellen ausserhalb des Spielfensters liegen, muss mit if a != None: überprüft werden, ob eine Lampe in dieser Zelle existiert. |
||||
refresh(): Da wir keine Animation starten, müssen wir nach jedem Klick die Spielsituation aktualisieren |
Mit der Methode getNeighbourLocations(distance), die alle benachbarten Locations im gegebenen Abstand zurückgibt, ergibt sich eine zweite, elegantere Lösungsvariante:
# LightsOut1.py from gamegrid import * def pressCallback(e): loc = toLocationInGrid(e.getX(), e.getY()) locs = toList(loc.getNeighbourLocations(0.5)) locs.append(loc) for i in range(5): a = getOneActorAt(locs[i]) if (a != None): a.showNextSprite() refresh() return True makeGameGrid(5, 5, 50, Color.black, False, mousePressed = pressCallback) setTitle("LightsOut") for i in range(5): for k in range(5): lamp = Actor("sprites/lightout.gif", 2) addActor(lamp, Location(i, k)) lamp.show(1) show() |
Erklärungen zum Programmcode:
|
||||
Die Invertierung der Zellen ist gleich programmiert, wie in der Lösungsvariante 1 |
Aufgaben: |
1) |
Für die Markierung der Felder verwendest du die Sprites mark_0.gif und mark_1.gif.
|
In der einfachsten Version des Spieles setzen die Spieler abwechslungweise ihre Marken und kontrollieren selbst das Ergebnis. |
2) |
Ergänze das Tic-Tac-Toe-Spiel mit einer Überprüfung der Spielsituation. Diese kann zum Beispiel nach jedem Zug mit folgendem Trick erfolgen: Die horizontale, vertikale und diagonale Belegung des Spielbretts wird in einem kommagetrennten Stringmuster der Form XOX,XX- ,O-O, ... dargestellt (leere Zellen erhalten das Zeichen '-'). Wenn XXX bzw. OOO in diesem String vorkommen, hat ein Spieler gewonnen. |