memory
Deutsch   English   Français   

MEMORY

 

 

DESCRIPTION DU JEU

 

Au début du jeu, 16 cartes formant 8 paires identiques sont disposées face cachée. Le joueur retourne deux cartes en effectuant deux clics de souris. Si les deux cartes sont identiques, elles restent visibles et le joueur peut continuer. Sinon, les deux cartes sont à nouveau retournées face cachée et un nouveau tour commence.

Le but du jeu est de découvrir toutes les paires de cartes en effectuant le moins de tentatives possible.

Dans le programme principal, les cartes sont distribuées et l'exécution du programme se poursuit dans une boucle infinie.

 

Dans cette boucle, l'exécution du programme est d'abord suspendue à l'aide de putSleep(), jusqu'à ce que deux cartes différentes aient été retournées. L'exécution reprend ensuite grâce à wakeUp(). La boucle vérifie d'abord si le jeu a été interrompu prématurément en cliquant sur le bouton de fermeture (Close). Après une pause d'une seconde, les deux cartes sont à nouveau retournées face cachée.

Programme:

# 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
  
► Copy to clipboard

 

 

Explications du code

 
1.

Initialisation des cartes
Actor.__init__(self, ["sprites/cardback.gif", "sprites/card" + str(cardNb) + ".gif"]): Chaque carte possède deux images : sa face avant (par exemple card1.gif) et son dos (cardback.gif). Ces deux images doivent être regroupées dans une liste, entre crochets.

2.

Numéro de la carte
getCardNb() renvoie le numéro de la carte.

3.

Distribution des cartes
addActor(card, loc): les cartes sont réparties aléatoirement dans les 16 cases de la grille.

4.

Comparaison des cartes
if card1.getCardNb() == card2.getCardNb(): Cette instruction vérifie si les deux cartes retournées sont identiques.

5.

Suspension du programme
putSleep(): suspend l'exécution du programme jusqu'à ce qu'elle soit réactivée.

6.

Reprise du programme
wakeUp(): réactive l'exécution du programme afin que les deux cartes puissent être retournées face cachée.

7.

Désactivation des événements de souris
isMouseEnabled(False): désactive temporairement la prise en compte des clics de souris. Ainsi, le joueur ne peut pas retourner d'autres cartes avant que les deux cartes différentes soient à nouveau cachées.