IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

pyReversi


précédentsommairesuivant

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

 
Sélectionnez
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).
 
Sélectionnez
    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 :
 
Sélectionnez
    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()

précédentsommairesuivant

Copyright © 2008 Guillaume Duriaud. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.