Beispiel #1
0
    def __init__(self,
                 maitre=None,
                 n_pixels_par_case=50,
                 dictionnaire=None,
                 joueur_actif=None,
                 option_chrono=False,
                 option_aide=False,
                 **kwargs):
        """Constructeur:

        Args:
            maitre (widget):  Widget qui contiendra notre échiquier.
            n_pixels_par_case (int):  Taille des cases en pixels.
            x_coin(int):  Coordonnée x du coin supérieur gauche de l'échiquier sur le canvas.
            y_coin(int):  Coordonnée y du coin supérieur gauche de l'échiquier sur le canvas.
            **kwargs:  Options du canvas."""

        # Constructeurs des parents.
        tk.Canvas.__init__(self, maitre, **kwargs)
        Echiquier.__init__(self, dictionnaire)

        # Structure de données contenant les objets graphiques sur le canvas.
        self.dictionnaire_graphique = {}
        self.dictionnaire_cases = {}

        # Variable contenant les messages à l'utilisateur et le statut de la partie, en cours ou gagnée

        self.message = tk.StringVar()

        if not joueur_actif:
            self.joueur_actif = "blanc"
            self.message.set(
                "Début de la partie:  au tour des blancs de jouer.")
        else:
            self.joueur_actif = joueur_actif
            self.message.set(f"Au tour des {self.joueur_actif}s de jouer.")

        ##########################
        # Le dernier coup complété
        ##########################

        self.coup_joue = {}

        ##############################################################
        # Compteur de coups.  Sera suivi dans le contrôleur de partie
        ##############################################################

        self.nombre_de_coups_joues = tk.IntVar()
        self.nombre_de_coups_joues.set(0)

        ####################################################
        # Semaphore avertissant le controleur d'un évènement
        ####################################################

        self.evenement = tk.StringVar()
        self.evenement.set("debut")

        self.exception = None

        ##################################################
        # Paramètres géométriques du dessin de l'échiquier
        ##################################################

        self.n_pixels_par_case = n_pixels_par_case
        self.taille_pieces = int(round(self.n_pixels_par_case * 60 / 100))
        self.n_lignes = 8
        self.n_colonnes = 8
        self.x_coin = 2 * self.n_pixels_par_case
        self.y_coin = 2 * self.n_pixels_par_case

        ############################################################################################
        # Informations sur le mouvement demandé:  utilisé dans clic-souris pour la sélection du coup
        ############################################################################################

        self.piece_selectionnee = False
        self.piece_a_deplacer = None
        self.case_depart = ""
        self.case_arrivee = ""

        #######################################################################
        # Dessin initial de l'échiquier avec les pièces à leurs place de départ
        #######################################################################

        self.dessiner_cases()
        self.dessiner_reperes()
        self.initialiser_canvas_depart()

        # Lier l'évenement clic-souris à la méthode correspondante
        self.bind("<Button-1>", self.clic_souris)

        # Cette variable sera utilisée par un controleur de partie pour forcer l'échiquier à attendre le prochain
        # coup lorsqu'on jouera contre un adversaire.  Deux valeurs seront possible: "actif" et "attente".
        # En mode "attente" l'échiquier ne réagira plus aux clics de souris.

        self.mode = "actif"

        # Options de jeu:  chronomètre et afficher les mouvements possibles
        self.option_chrono = option_chrono
        self.option_aide = option_aide

        ##############################################################################
        # Ce dict contient les cases surlignées pour indiquer les mouvements possibles
        ##############################################################################

        self.cases_modifiees_pour_aider = {}