HomeTortue graphiqueGPanelRobotique WebTigerPython
 Python - Online
reversi
Deutsch   English   Français   

REVERSI

 

 

DESCRIPTION DU JEU

 

Sur un plateau de 8 × 8 cases, deux joueurs placent à tour de rôle des pions jaunes et rouges. Au début du jeu, deux pions jaunes et deux pions rouges sont placés au centre du plateau.

Les joueurs peuvent placer leurs pions dans les cases vides en cliquant avec la souris, à condition qu'au moins une des cases voisines, située au-dessus, au-dessous, à gauche ou à droite, soit déjà occupée.

 
 
Non autorisé
 
Autorisé
 
Résultat
 

Lorsqu'un pion est placé, tous les pions adverses situés sur une même ligne ou diagonale entre le nouveau pion et un pion déjà placé de la même couleur sont retournés. Le but du jeu est d'avoir le plus grand nombre possible de pions de sa propre couleur sur le plateau à la fin de la partie. Le jeu se termine lorsque toutes les cases sont occupées.

Programme:

# Reversi.py
from gamegrid import *

# Checks endOfGame
def endOfGame():
    countYellow = 0
    countRed = 0
    all = getOccupiedLocations()
    for lc in all:
        if getOneActorAt(lc).getIdVisible() == 0:
           countYellow += 1
        else:
           countRed += 1

    if len(all) == 64:
        if countRed > countYellow:
            setTitle("Red wins - "+str(countRed)+":"+str(countYellow))
        elif countRed < countYellow:
            setTitle("Yellow wins - "+str(countYellow)+":"+str(countRed))
        else:
            setTitle("The game ended in a tie")

#Checks if cell has a neighbour in the north, east, south or west
def hasNeighbours(loc):
    locs = toList(loc.getNeighbourLocations(0.5))
    for i in range(4):
        if getOneActorAt(locs[i]) != None:
            return True
    return False

# set stone
def onMousePressed(e):
    global imageID
    location = toLocationInGrid(e.getX(), e.getY())
    if getOneActorAt(location) == None and hasNeighbours(location):
        stone = Actor("sprites/token.png", 2)
        addActor(stone, location)
        stone.show(imageID)
    # Check stones in all 8 directions and if can be turned add list
        for c in range (0, 360, 45):
            actors = []
            loc = location.getNeighbourLocation(c)
            a = getOneActorAt(loc)
            hasSameImageID = False
            while a != None and not hasSameImageID:
                if a.getIdVisible() != imageID:
                    actors.append(a)
                    loc = loc.getNeighbourLocation(c)
                    a = getOneActorAt(loc)          
                else:    
                    if a.getIdVisible() == imageID:
                        hasSameImageID = True
            # Turn stones 
            if hasSameImageID:
                for actor in actors:
                    actor.show(imageID)        
            refresh()
        
    # Change player
    if imageID == 0:
        imageID = 1
        setTitle("Red plays")
    else:
        imageID = 0
        setTitle("Yellow plays")
    endOfGame()
    refresh()    
    return True 

makeGameGrid(8, 8, 60, Color.gray, False,
    mousePressed = onMousePressed)
setTitle("Reversi")
yellow = Actor("sprites/token.png", 2)
yellow2 = Actor("sprites/token.png", 2)
red = Actor("sprites/token.png", 2)
red2 = Actor("sprites/token.png", 2)
addActor(yellow, Location(3, 3))
addActor(yellow2, Location(4, 4))
addActor(red, Location(4, 3))
addActor(red2, Location(3, 4))
yellow.show(0)
yellow2.show(0)
red.show(1)
red2.show(1)
imageID = 0
show()
doRun()
► Copy to clipboard

 

 

Explications du code

 
1.

Création d'un pion
stone = Actor("sprites/token.png", 2)
addActor(stone, location) :  Un Actor nommé stone est créé et placé à la position du clic de souris.

2.

Recherche des cases voisines
locs = toList(loc.getNeighbourLocations(0.5)): Cette instruction fournit une liste des quatre cases directement voisines.

3.

Parcours des huit directions
for c in range (0, 360, 45) : La boucle parcourt les huit directions : 0°, 45°, 90°, 135°, 180°, 225°, 270° et 315°.

4.

Recherche d'une case voisine dans une direction donnée
loc = location.getNeighbourLocation(c) : Cette instruction renvoie la case voisine située dans la direction c.

5.

Recherche des cases occupées
all = getOccupiedLocations() : Cette instruction fournit une liste de toutes les cases occupées du plateau de jeu.

6.

Nombre de cases occupées
len(all) : La fonction len(all) renvoie le nombre d'éléments contenus dans la liste all.