solitaire
Deutsch   English   Français   

JEU DE SOLITAIRE

 

 

DESCRIPTION DU JEU

 

Comme son nom l'indique, le Solitaire est un jeu qui se joue généralement seul. Au début du jeu, 32 pions sont disposés en forme de croix sur un plateau comportant 33 cases. La case centrale est vide. Le but du jeu est d'éliminer tous les pions sauf un, en sautant par-dessus un pion voisin. Pour déplacer un pion, tu le fais glisser vers sa nouvelle position en maintenant le bouton de la souris enfoncé. Les sauts sont autorisés uniquement horizontalement ou verticalement, mais jamais en diagonale.

 

 
 
 
Autorisé
 
Non autorisé
 

Lorsqu'un déplacement n'est pas autorisé, le pion est replacé à sa position initiale.

Programme:

#Solitaire.py

from gamegrid import *

def checkGameOver():
    global isGameOver
    marbles = getActors() 
    if len(marbles) == 1:
        isGameOver = True
        addActor(Actor("sprites/you_win.gif"), Location(3, 3))
    else:
        if not isMovePossible():
           isGameOver = True
           addActor(Actor("sprites/gameover.gif"), Location(3, 3))

def isMovePossible():
   for a in getActors():  # run over all remaining marbles
        for x in range(7): # run over all holes
            for y in range(7):
                loc = Location(x, y)
                if getOneActorAt(loc) == None and \
                  getRemoveMarble(a.getLocation(),Location(x,y))!= None:
                    return True
   return False
    
def getRemoveMarble(start, dest):
    if getOneActorAt(start) == None:
        return None
    if getOneActorAt(dest) != None:
        return None
    if not isMarbleLocation(dest):
        return None
    if dest.x - start.x == 2 and dest.y == start.y:
        return getOneActorAt(Location(start.x + 1, start.y))
    if start.x - dest.x == 2 and dest.y == start.y:
        return getOneActorAt(Location(start.x - 1, start.y))
    if dest.y - start.y == 2 and dest.x == start.x:
        return getOneActorAt(Location(start.x, start.y + 1))
    if start.y - dest.y == 2 and dest.x == start.x:
        return getOneActorAt(Location(start.x, start.y - 1))
    return None

def isMarbleLocation(loc):
    if loc.x < 0 or loc.x > 6 or loc.y < 0 or loc.y > 6:
        return False
    if (loc.x == 0 or loc.x == 1 or loc.x == 5 or loc.x == 6) and \
       (loc.y == 0 or loc.y == 1 or loc.y == 5 or loc.y == 6):
        return False
    return True

def initBoard():
    for x in range(7):
        for y in range(7):
            loc = Location(x, y)
            if isMarbleLocation(loc):
                marble = Actor("sprites/marble.png")
                addActor(marble, loc)
    removeActorsAt(Location(3, 3)) # Remove marble in center

def pressEvent(e):
    global startLoc, movingMarble
    if isGameOver:
        return
    startLoc = toLocationInGrid(e.getX(), e.getY())
    movingMarble = getOneActorAt(startLoc)  

def dragEvent(e):
    if isGameOver:
        return
    if movingMarble == None:
        return
    startPoint = toPoint(startLoc)
    movingMarble.setLocationOffset(e.getX() - startPoint.x, 
                                   e.getY() - startPoint.y) 

def releaseEvent(e):
    if isGameOver:
        return
    if movingMarble == None:
        return
    destLoc = toLocationInGrid(e.getX(), e.getY())
    movingMarble.setLocationOffset(0, 0)
    removeMarble = getRemoveMarble(startLoc, destLoc)
    if removeMarble != None:
        removeActor(removeMarble)
        movingMarble.setLocation(destLoc)    
        checkGameOver()

startLoc = None
movingMarble = None
isGameOver = False

makeGameGrid(7, 7, 70, None, "sprites/solitaire_board.png", False,
   mousePressed = pressEvent, mouseDragged = dragEvent, 
   mouseReleased = releaseEvent)
setBgColor(Color(255, 166, 0))
setSimulationPeriod(20)
initBoard()
show()
doRun()
► Copy to clipboard

 

 

Explications du code

 
1.

Fonction checkGameOver()
checkGameOver(): La partie est terminée lorsqu'il ne reste plus qu'un seul pion sur le plateau. Dans ce cas, le joueur a gagné. Il existe cependant aussi des situations dans lesquelles plusieurs pions se trouvent encore sur le plateau, mais où aucun déplacement n'est plus possible. Dans ce cas, la partie est également terminée, mais le joueur a perdu.

2. Fonction pressEvent(e)
pressEvent(e) : Cette fonction permet de sélectionner un pion en cliquant dessus avec la souris.
3.

Fonction dragEvent(e)
dragEvent(e)): Cette fonction permet de déplacer le pion sélectionné en maintenant le bouton de la souris enfoncé.

4. Fonction releaseEvent(e)
releaseEvent(e): Lorsque le bouton de la souris est relâché, le pion est déposé à la position actuelle. Le programme doit alors vérifier si le déplacement est autorisé.
5. Fonction getRemoveMarble(start, dest)
getRemoveMarble(start, dest): Cette fonction renvoie le pion à supprimer si le déplacement est autorisé. Si le déplacement n'est pas autorisé, elle renvoie None.