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 |
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.