lightsout

LIGHTS OUT GAME

 

 

SPIELBESCHREIBUNG

 

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.

Programm:

# 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()
doRun()
► In Zwischenablage kopieren

 

 

Erklärungen zum Programmcode

 
1. Das Spielfenster besteht aus 5 Zeilen und 5 Spalten. Zuerst erzeugen wir in jeder der 25 Zellen eine eingeschaltete Lampe (lamp.show(1)

2. In der Callbackfunktion pressCallback() wird zuerst die Location loc des Mausklicks bestimmt. Diese hat die Koordinaten x, y.

3.
Dann wird eine Liste mit den Locations der 5 betroffenen Lampen erstellt:
locs = [0] * 5
erzeugt eine Liste mit 5 Elementen (Locations).
Die Locations der benachbarten Zellen werden gemäss rechts stehender Skizze festgelegt.
 
4. 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.

5. refresch() Da wir keine Animation starten, müssen wir nach jedem Klick die Spielsituation aktualisieren