VIII. Reversi.py - La classe Reversi▲
Vous pouvez visualiser le contenu du fichier en cliquant sur le lien Reversi.py.
Ce fichier initialise le jeu et gère le changement de joueur. Il comprend une unique classe Reversi.
Cette classe possède les attributs suivants :
- plate : liste représentant le plateau de jeu en mémoire ;
- player1 : objet Player.Player représentant le joueur ayant les pions noirs ;
- player2 : objet Player.Player représentant le joueur ayant les pions blancs ;
- playermain : pointeur sur player1 ou player2, représentant le joueur ayant la main ;
- wReversi : objet wxReversi.wxReversi représentant le plateau de jeu à l'écran ;
- lastMove : entier représentant le dernier coup joué.
Cette classe possède les méthodes suivantes :
- __init__(self) : constructeur de la classe Reversi ;
- Initialize(self, black, white) : initialise le jeu ;
- ChangePlayerMain(self, n = 0) : donne la main à l'adversaire ;
- EndGame(self) : affiche le score en fin de partie.
Le jeu est lancé par les dernières lignes du fichier en créant une instance de Reversi
random.seed
(
)
app =
wx.PySimpleApp
(
)
rev =
Reversi
(
)
app.MainLoop
(
)
VIII-1. Initialize(self, black, white)▲
Cette fonction initialise le tout début du jeu. Cette fonction est très simple à lire :
- on arrête tout d'abord les threads gérant la réflexion des deux précédents joueurs (self.player1.endreflexion = True et self.player1.endgame = True) ;
- nous recréons ensuite les deux joueurs en fonction de s'il s'agit de joueurs humains ou d'ordinateurs ;
- on réinitialise le plateau de jeu ;
- on lance dans un thread la phase d'attente du joueur 2 s'il s'agit d'un ordinateur (pour qu'il puisse commencer à réfléchir sur son prochain coup) ;
- on lance dans un thread la phase de jeu du joueur 1 s'il s'agit d'un ordinateur (pour qu'il puisse jouer).
def
Initialize
(
self, black, white):
self.player1.endreflexion =
True
self.player2.endreflexion =
True
self.player1.endgame =
True
self.player2.endgame =
True
while
self.player1.isWaiting: continue
while
self.player2.isWaiting: continue
## self.player1.endreflexion = False
## self.player2.endreflexion = False
if
black ==
'player'
: self.player1 =
Player.Player
(
self, 'black'
)
else
: self.player1 =
Player.Computer
(
self, 'black'
)
if
white ==
'player'
: self.player2 =
Player.Player
(
self, 'white'
)
else
: self.player2 =
Player.Computer
(
self, 'white'
)
self.plate =
PLATEINIT[:]
glovar['freemove'
] =
FREEMOVEINIT[:]
glovar['platemove'
] =
PLATEMOVEINIT[:]
self.playermain =
self.player1
if
isinstance(
self.player2, Player.Computer):
self.player2.Initialize
(
)
threading.Thread
(
None
, self.player2.Waiting, None
).start
(
)
if
isinstance(
self.player1, Player.Computer):
self.player1.Initialize
(
)
threading.Thread
(
None
, self.player1.Play, None
).start
(
)
VIII-2. ChangePlayerMain(self, n = 0)▲
Cette fonction est toujours appelée depuis une instance de wxReversi.wxReversi et les méthodes pnlPlateLDown ou pnlPlateMove qui effectuent l'ajout d'un pion sur le plateau de jeu puis le changement de main.
- Si personne ne peut jouer, on quitte (n == 2).
- Pour ne pas avoir de mauvaise surprise, on stoppe la réflexion de tous les ordinateurs en jeu.
- On change le joueur ayant la main.
- On vérifie que celui-ci peut jouer, sinon, on rechange la main.
- On relance l'attente du joueur ne jouant pas et on relance la phase de jeu pour l'autre :
def
ChangePlayerMain
(
self, n =
0
):
if
n ==
2
:
self.EndGame
(
)
return
## On stoppe la réflexion de tout le monde
self.player1.endreflexion =
True
self.player2.endreflexion =
True
while
self.player1.isWaiting: continue
while
self.player2.isWaiting: continue
self.player1.endreflexion =
False
self.player2.endreflexion =
False
## On inverse les joueurs
if
self.playermain.joueur ==
1
: self.playermain =
self.player2
else
: self.playermain =
self.player1
if
DoitPasser
(
self.plate, self.playermain.joueur):
return
self.ChangePlayerMain
(
n +
1
)
## On relance le jeu
if
self.playermain.joueur ==
1
:
if
isinstance(
self.player2, Player.Computer):
self.player2.Initialize
(
)
threading.Thread
(
None
, self.player2.Waiting, None
).start
(
)
self.wReversi.timerBlack.Start
(
1000
)
self.wReversi.timerWhite.Start
(
1000
)
if
isinstance(
self.player1, Player.Computer):
threading.Thread
(
None
, self.player1.Play, None
).start
(
)
else
:
if
isinstance(
self.player1, Player.Computer):
self.player1.Initialize
(
)
threading.Thread
(
None
, self.player1.Waiting, None
).start
(
)
self.wReversi.timerBlack.Start
(
1000
)
self.wReversi.timerWhite.Start
(
1000
)
if
isinstance(
self.player2, Player.Computer):
threading.Thread
(
None
, self.player2.Play, None
).start
(
)