HomeTurtlegrafikGPanelRobotikGameGrid WebTigerPython
 Python - Online
memory

MEMORY

 

 

SPIELBESCHREIBUNG

 

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.

Programm:

# 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(): 
            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) + ".Next move.")
    nbMoves += 1
    isMouseEnabled = True
  
► In Zwischenablage kopieren

 

 

Erklärungen zum Programmcode

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

2. getCardNb() gibt die Kartennummer zurück

3.
addActor(card, loc): die Karten werden zufällig auf die 16 Felder verteilt

4. if card1.getCardNb() == card2.getCardNb(): prüft, ob die beiden Karten gleich sind

5. putSleep(): wartet, bis die Karten zurückgedreht sind

6. wakeUp(): Das Spiel wird fortgesetzt

7. isMouseEnabled(False): Deaktiviert die Maus-Events