Memory Game


16 Karten, die paarweise übereinstimmen, sind zu Beginn verdeckt aufgelegt. Der Spieler deckt mit zwei Mausklicks zwei Karten auf. Wenn er zwei gleiche Karten trifft, bleiben die Karten aufgedeckt und der Zug wird fortgesetzt. Sonst werden beide Karten wieder verdeckt und es beginnt ein neuer Zug. Das Ziel ist es, in möglichst wenig Zügen alle Karten aufzudecken.

Im Hauptteil werden die Karten verteilt und das Programm wird mit einer Endlosschleife weitergeführt. In dieser wird die Programmausführung zuerst mit putSleep() angehalten, bis zwei unterschiedliche Karten aufgedeckt sind. Die Programmausführung wird dann mit wakeUp() fortgesetzt. In der Schleife wird zuerst geprüft, ob das Spiel durch Klicken des Close-Buttons vorzeitig beendet wurde. Nach einer Verzögerung von 1 Sekunde werden die zwei Karten wieder zugedeckt.

 

# Memory.py

from gamegrid import *

# ---------------- class MemoryCard ----------------
class MemoryCard(Actor):
    def __init__(self, cardNb):
        Actor.__init__(self, ["sprites/cardback.gif", "sprites/card" + str(cardNb) + ".gif"])
        self.cardNb = cardNb
    def getCardNb(self):
        return self.cardNb 
            
def pressCallback(e):
    global card1, card2, takeFirst, nbMoves, isMouseEnabled
    if not isMouseEnabled:
        return
    loc = toLocationInGrid(e.getX(), e.getY())  
    card = getOneActorAt(loc)

    if card.getIdVisible() == 1: # card already visible->ignore
        return True
        
    card.show(1) # make card visible
    if takeFirst: # first card taken
        takeFirst = False
        card1 = card
        setStatusText("# of moves: " + str(nbMoves))
    else:  # second card taken
        card2 = card
        if card1.getCardNb() == card2.getCardNb(): # test if cards have same image
            if isGameOver():
                setStatusText("Game over in " + str(nbMoves) + " trials")
            else:
               takeFirst = True  # yes->may continue with next move
               setStatusText("# of moves: " + str(nbMoves) + ". Pair accepted.")
        else: # no->reject this move, hide the two cards
            isMouseEnabled = False
            wakeUp()

def isGameOver():
   gameOver = True
   for card in getActors():
       if card.getIdVisible() == 0:
          gameOver = False
   return gameOver
   
# ---------------- main ----------------------
takeFirst = True
isMouseEnabled = True
nbMoves = 1
makeGameGrid(4, 4, 115, Color.black, False,  mousePressed = pressCallback)
addStatusBar(30)
setStatusText("Make your choice of card pairs with mouse clicks")
setTitle("Memory")
for i in range(16):
    if i < 8:
        card = MemoryCard(i)
    else:
        card = MemoryCard(i - 8)
    loc = getRandomEmptyLocation()
    addActor(card, loc)   
    card.show(0)  
show()
doRun()

while True:
    putSleep()
    if isDisposed():
       break
    delay(1000)
    card1.show(0)
    card2.show(0)
    takeFirst = True
    setStatusText("# of moves: " + str(nbMoves) + ". Pair rejected. Perform next move.")
    nbMoves += 1
    isMouseEnabled = True
  
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

Actor.__init__(self, ["sprites/cardback.gif", "sprites/card" + str(cardNb) + ".gif"]): Zu jeder Karte gehören zwei Bilder: die Vorderseite (z.B. card1.gif) und die Rückseite cardback.gif. Diese müssen in eckigen Klammern (Liste) zusammengefasst werden
getCardNb() gibt die Kartennummer zurück
addActor(card, loc): die Karten werden zufällig auf die 16 Felder verteilt
if card1.getCardNb() == card2.getCardNb(): prüft, ob die beiden Karten gleich sind
putSleep(): wartet, bis die Karten zurückgedreht sind
wakeUp(): Das Spiel wird fortgesetzt
setMouseEnabled(False): Deaktiviert die Maus-Events

 

Die Karten-Bilder sind in der Distribution tigerjython.jar enthalten. Sie sind gespeichert unter den Dateinamen card0.gif, card1.gif, .....card7.gif und cardback.gif. Wenn andere Memory-Karten erwünscht sind, muss man die Sprite-Bilder in das Unterverzeichnis sprites im Ordner, in dem tigerjython.jar gespeichert ist, kopieren.