Пример #1
0
 def load(self):
     reponse = messagebox.askquestion(
         "C'est une bonne partie...courage",
         "Si vous chargez une nouvelle partie, vous "
         "risquez de perdre la partie courante?\nCliquez sur "
         "'Oui' pour sauvegarder la partie courante ou sur 'Non' pour "
         "continuer.".format(self.partie.joueur_actif))
     if reponse == "yes":  # on affiche une fenetre pour demander si vraiment on veut quitter la partie en cours
         self.save()
     fichier_source = filedialog.askopenfilename(
         title='Choisissez le fichier où est sauvegardé vôtre '
         'partie',
         defaultextension='.txt',
         filetypes=[('text seulement', '.txt')])
     if fichier_source:
         load = open(fichier_source,
                     'r')  # le même fonctionnement que pour sel.save()
         dicos_chaine = load.readlines()
         caracteres_pieces_r = {
             'PB': Pion('blanc'),
             'PN': Pion('noir'),
             'TB': Tour('blanc'),
             'TN': Tour('noir'),
             'CB': Cavalier('blanc'),
             'CN': Cavalier('noir'),
             'FB': Fou('blanc'),
             'FN': Fou('noir'),
             'RB': Roi('blanc'),
             'RN': Roi('noir'),
             'DB': Dame('blanc'),
             'DN': Dame('noir')
         }
         pos = ''
         piece = None
         piece_class = ''
         self.canvas_echiquier.echiquier.dictionnaire_pieces = {}
         for l in range(len(dicos_chaine) - 1):
             pos = dicos_chaine[l][0:2]
             piece = dicos_chaine[l][2:4]
             for p in caracteres_pieces_r:
                 if piece == p:
                     piece_class = caracteres_pieces_r[p]
             self.canvas_echiquier.echiquier.dictionnaire_pieces[
                 pos] = piece_class
         self.partie.joueur_actif = dicos_chaine[-1]
         load.close()
         self.canvas_echiquier.delete('piece')
         self.canvas_echiquier.dessiner_pieces()
         self.messages['foreground'] = 'black'
         self.messages['text'] = 'La partie à été chargé avec succès'
         self.messages['text'] = "c'est parti"
         self.mon_label_info['text'] = "C'est au tour du joueur {}".format(
             self.partie.joueur_actif)
         self.mon_label_info['text'] = "C'est au tour du joueur blanc"
         self.prises_blanc['text'] = "Prises du\njoueur blanc"
         self.prises_noir['text'] = "Prises du\njoueur noir"
         self.depla_blanc['text'] = "Liste des déplacements\njoueur blanc"
         self.depla_noir['text'] = "Liste des déplacements\njoueur noir"
Пример #2
0
    def initialiser_echiquier_depart(self):
        """Initialise l'échiquier à son contenu initial. Pour faire vos tests pendant le développement,
        nous vous suggérons de vous fabriquer un échiquier plus simple, en modifiant l'attribut
        dictionnaire_pieces de votre instance d'Echiquier.

        """
        # Initialisation d'une liste vide de Liste des Échiquiers qui servira a revenir en arrière avec la fonction
        # d'Annulation du dernier mouvement
        self.listeDesEchiquiers = []

        self.dictionnaire_pieces = {
            'a1': Tour('blanc'),
            'b1': Cavalier('blanc'),
            'c1': Fou('blanc'),
            'd1': Dame('blanc'),
            'e1': Roi('blanc'),
            'f1': Fou('blanc'),
            'g1': Cavalier('blanc'),
            'h1': Tour('blanc'),
            'a2': Pion('blanc'),
            'b2': Pion('blanc'),
            'c2': Pion('blanc'),
            'd2': Pion('blanc'),
            'e2': Pion('blanc'),
            'f2': Pion('blanc'),
            'g2': Pion('blanc'),
            'h2': Pion('blanc'),
            'a7': Pion('noir'),
            'b7': Pion('noir'),
            'c7': Pion('noir'),
            'd7': Pion('noir'),
            'e7': Pion('noir'),
            'f7': Pion('noir'),
            'g7': Pion('noir'),
            'h7': Pion('noir'),
            'a8': Tour('noir'),
            'b8': Cavalier('noir'),
            'c8': Fou('noir'),
            'd8': Dame('noir'),
            'e8': Roi('noir'),
            'f8': Fou('noir'),
            'g8': Cavalier('noir'),
            'h8': Tour('noir'),
        }

        # Création d'une premiere liste des échiquiers pour générer un historique dès le départ
        self.listeDesEchiquiers.append(dict(self.dictionnaire_pieces))

        # Création d'un Sets de pièces blanches et noirs pour calculer la différence avec les pièces restantes
        self.setBlanc = set()
        self.setNoir = set()
        for i in self.listeDesEchiquiers[0].values():
            if i.est_blanc():
                self.setBlanc.add(i)
            else:
                self.setNoir.add(i)
Пример #3
0
 def promotion_pion(self, position_cible):
     piece = self.recuperer_piece_a_position(position_cible)
     if isinstance(piece, Pion):
         if piece.est_blanc():
             if position_cible in [
                     'a8', 'b8', 'c8', 'd8', 'e8', 'f8', 'g8', 'h8'
             ]:
                 self.dictionnaire_pieces[position_cible] = Dame('blanc')
         if piece.est_noir():
             if position_cible in [
                     'a1', 'b1', 'c1', 'd1', 'e1', 'f1', 'g1', 'h1'
             ]:
                 self.dictionnaire_pieces[position_cible] = Dame('noir')
Пример #4
0
 def save(
     self
 ):  # on ouvre une fenetre de dialogue pour le (path) de sauvegarde, (seulement .txt et prédefini),
     # et aussi un demande un nom de fichier
     destination = filedialog.asksaveasfilename(
         title='Choisissez un répertoire où sauvegarder votre '
         'partie',
         defaultextension='.txt',
         filetypes=[('text seulement', '.txt')])
     if destination:
         sauvegarde = open(destination, "w")
         for e in self.canvas_echiquier.echiquier.dictionnaire_pieces:
             sauvegarde.write(e)  # on y écrit chaque position pleine.
             piece = self.canvas_echiquier.echiquier.dictionnaire_pieces[e]
             caracteres_pieces_w = {
                 Pion('blanc'): 'PB',
                 Pion('noir'): 'PN',
                 Tour('blanc'): 'TB',
                 Tour('noir'): 'TN',
                 Cavalier('blanc'): 'CB',
                 Cavalier('noir'): 'CN',
                 Fou('blanc'): 'FB',
                 Fou('noir'): 'FN',
                 Roi('blanc'): 'RB',
                 Roi('noir'): 'RN',
                 Dame('blanc'): 'DB',
                 Dame('noir'): 'DN'
             }
             for p in caracteres_pieces_w:  # pour chque position on compare le type
                 if type(p) == type(
                         piece
                 ) and p.couleur == piece.couleur:  # de piece qu'elle contient avec le dict
                     sauvegarde.write(
                         caracteres_pieces_w[p]
                     )  # defini au dessus puis on ecrit le caract
             sauvegarde.write('\n')  # correspondant, puis on saute la ligne
         sauvegarde.write(self.partie.joueur_actif
                          )  # apres avoir parcouru toutes les piece
         sauvegarde.close()  # on ecrit le nom du joueur actif
         self.messages['foreground'] = 'black'
         self.messages[
             'text'] = 'La partie à été enregistré avec success'  # enfin on affiche un message que tout c'est bien passé
Пример #5
0
    def initialiser_echiquier_depart(self):
        """Initialise l'échiquier à son contenu initial. Pour faire vos tests pendant le développement,
        nous vous suggérons de vous fabriquer un échiquier plus simple, en modifiant l'attribut
        dictionnaire_pieces de votre instance d'Echiquier.

        """
        self.dictionnaire_pieces = {
            'a1': Tour('blanc'),
            'b1': Cavalier('blanc'),
            'c1': Fou('blanc'),
            'd1': Dame('blanc'),
            'e1': Roi('blanc'),
            'f1': Fou('blanc'),
            'g1': Cavalier('blanc'),
            'h1': Tour('blanc'),
            'a2': Pion('blanc'),
            'b2': Pion('blanc'),
            'c2': Pion('blanc'),
            'd2': Pion('blanc'),
            'e2': Pion('blanc'),
            'f2': Pion('blanc'),
            'g2': Pion('blanc'),
            'h2': Pion('blanc'),
            'a7': Pion('noir'),
            'b7': Pion('noir'),
            'c7': Pion('noir'),
            'd7': Pion('noir'),
            'e7': Pion('noir'),
            'f7': Pion('noir'),
            'g7': Pion('noir'),
            'h7': Pion('noir'),
            'a8': Tour('noir'),
            'b8': Cavalier('noir'),
            'c8': Fou('noir'),
            'd8': Dame('noir'),
            'e8': Roi('noir'),
            'f8': Fou('noir'),
            'g8': Cavalier('noir'),
            'h8': Tour('noir'),
        }
Пример #6
0
    def dessiner_pieces(self):
        # Caractères unicode représentant les pièces. Vous avez besoin de la police d'écriture DejaVu.
        self.caracteres_pieces = {
            Pion('blanc'): '\u2659',
            Pion('noir'): '\u265f',
            Tour('blanc'): '\u2656',
            Tour('noir'): '\u265c',
            Cavalier('blanc'): '\u2658',
            Cavalier('noir'): '\u265e',
            Fou('blanc'): '\u2657',
            Fou('noir'): '\u265d',
            Roi('blanc'): '\u2654',
            Roi('noir'): '\u265a',
            Dame('blanc'): '\u2655',
            Dame('noir'): '\u265b'
        }

        # Pour tout paire position, pièce:
        for position in self.echiquier.dictionnaire_pieces:
            # On dessine la pièce dans le canvas, au centre de la case. On utilise l'attribut "tags" pour être en
            # mesure de récupérer les éléments dans le canvas.
            coordonnee_y = (
                self.n_lignes - self.chiffres_rangees.index(position[1]) -
                1) * self.n_pixels_par_case + self.n_pixels_par_case // 2
            coordonnee_x = self.lettres_colonnes.index(position[
                0]) * self.n_pixels_par_case + self.n_pixels_par_case // 2
            piece = self.echiquier.dictionnaire_pieces[position]
            uni = ""
            for e in list(self.caracteres_pieces.keys()):
                if type(e) == type(piece) and e.couleur == piece.couleur:
                    uni = self.caracteres_pieces[e]
                    break
            self.create_text(coordonnee_x,
                             coordonnee_y,
                             text=uni,
                             font=('Deja Vu', self.n_pixels_par_case // 2),
                             tags='piece')
Пример #7
0
    def __init__(self, master, couleur, **kwargs):

        # Le widget est une fenêtre qui sera esclave d'un échiquier
        tk.Toplevel.__init__(self, master)

        self.master = master
        self.master.passer_en_mode_attente()
        self.transient(self.master)
        self.code_piece_choisie = tk.StringVar()
        self.couleur = tk.StringVar()
        self.couleur.set(couleur)

        # Frames contenant les widgets esclaves, pour la mise en page
        self.frameMessage = tk.Frame(self)
        self.frameBouton = tk.Frame(self)
        self.frameChoix = tk.Frame(self)

        # Les boutons et leurs handlers
        self.boutonDame = BoutonPiece(self.frameBouton, Dame(couleur))
        self.boutonDame.configure(command=lambda: self.decider("D"))

        self.boutonTour = BoutonPiece(self.frameBouton, Tour(couleur))
        self.boutonTour.configure(command=lambda: self.decider("T"))

        self.boutonFou = BoutonPiece(self.frameBouton, Fou(couleur))
        self.boutonFou.configure(command=lambda: self.decider("F"))

        self.boutonCavalier = BoutonPiece(self.frameBouton, Cavalier(couleur))
        self.boutonCavalier.configure(command=lambda: self.decider("C"))

        self.bouton_ok = tk.Button(self.frameChoix,
                                   text="Choisir",
                                   font=("default", 25, "normal"),
                                   state=tk.DISABLED,
                                   command=self.disparaitre)

        self.messagePromotion = tk.Label(
            self.frameMessage,
            text="Vous devez choisir une pièce pour promouvoir le pion",
            font=("default", 25, "normal"))

        self.boutons = {
            "D": self.boutonDame,
            "T": self.boutonTour,
            "F": self.boutonFou,
            "C": self.boutonCavalier
        }

        # Assemblage de la fenêtre
        self.messagePromotion.pack()
        self.boutonDame.pack(side=tk.LEFT, padx=20)
        self.boutonTour.pack(side=tk.LEFT, padx=20)
        self.boutonFou.pack(side=tk.LEFT, padx=20)
        self.boutonCavalier.pack(side=tk.LEFT, padx=20)
        self.bouton_ok.pack(padx=20)

        self.frameMessage.pack(side=tk.TOP, padx=20, pady=20)
        self.frameBouton.pack(side=tk.BOTTOM, padx=20, pady=20)
        self.frameChoix.pack(side=tk.BOTTOM, padx=20, pady=20)

        # On ne veut pas que le joueur puisse cliquer sur l'échiquier quand la fenêtre est affichée
        self.focus_set()
        self.grab_set()
Пример #8
0
    def deposer(self, event):

        toutes_les_position = [
            'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'b1', 'b2', 'b3',
            'b4', 'b5', 'b6', 'b7', 'b8', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6',
            'c7', 'c8', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'e1',
            'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'f1', 'f2', 'f3', 'f4',
            'f5', 'f6', 'f7', 'f8', 'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7',
            'g8', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8'
        ]

        # On trouve le numéro de ligne/colonne en divisant les positions en y/x par le nombre de pixels par case.
        ligne = event.y // self.canvas_echiquier.n_pixels_par_case
        colonne = event.x // self.canvas_echiquier.n_pixels_par_case
        global position_cible
        position_cible = "{}{}".format(
            self.canvas_echiquier.partie.echiquier.lettres_colonnes[colonne],
            int(self.canvas_echiquier.partie.echiquier.chiffres_rangees[
                self.canvas_echiquier.n_lignes - ligne - 1]))

        if self.partie.echiquier.deplacement_est_valide(
                self.position_selectionnee, position_cible) == True:
            self.sauvegarder("Revenir")

        try:
            var = 1
            if self.partie.echiquier.couleur_piece_a_position(
                    self.position_selectionnee) == self.partie.joueur_actif:
                if self.partie.echiquier.deplacer(self.position_selectionnee,
                                                  position_cible) == True:
                    self.partie.echiquier.deplacer(self.position_selectionnee,
                                                   position_cible)
                    var = 0
                    if isinstance(
                            self.partie.echiquier.recuperer_piece_a_position(
                                position_cible), Pion) == True:
                        if self.partie.echiquier.couleur_piece_a_position(
                                position_cible) == 'blanc':
                            if position_cible[1] == '8':
                                self.partie.echiquier.dictionnaire_pieces[
                                    position_cible] = Dame('blanc')
                                self.canvas_echiquier.dessiner_cases()
                                self.canvas_echiquier.dessiner_pieces()
                        elif self.partie.echiquier.couleur_piece_a_position(
                                position_cible) == 'noir':
                            if position_cible[1] == '1':
                                self.partie.echiquier.dictionnaire_pieces[
                                    position_cible] = Dame('noir')
                                self.canvas_echiquier.dessiner_cases()
                                self.canvas_echiquier.dessiner_pieces()

                    self.canvas_echiquier.dessiner_cases()
                    self.canvas_echiquier.dessiner_pieces()
                    self.partie.partie_terminee()
                    for i in toutes_les_position:
                        if self.partie.echiquier.deplacement_est_valide(
                                position_cible, i) and isinstance(
                                    self.partie.echiquier.
                                    recuperer_piece_a_position(i),
                                    Roi) == True:
                            self.partie.joueur_suivant()
                            self.messages['foreground'] = 'red'
                            self.messages[
                                'text'] = 'Le Roi ' + self.partie.joueur_actif + ' est en échec'
                            self.partie.joueur_suivant()
                            self.canvas_echiquier.dessiner_cases()
                            self.canvas_echiquier.dessiner_pieces()

                        if isinstance(
                                self.partie.echiquier.
                                recuperer_piece_a_position(i),
                                Pion) == True or isinstance(
                                    self.partie.echiquier.
                                    recuperer_piece_a_position(i),
                                    Tour) == True or isinstance(
                                        self.partie.echiquier.
                                        recuperer_piece_a_position(i),
                                        Fou) == True or isinstance(
                                            self.partie.echiquier.
                                            recuperer_piece_a_position(i),
                                            Cavalier) == True or isinstance(
                                                self.partie.echiquier.
                                                recuperer_piece_a_position(i),
                                                Dame) == True:
                            var = 1

                    self.partie.joueur_suivant()
                    self.label_temporaire[
                        'text'] = "C'est le tour au joueur " + self.partie.joueur_actif

                else:
                    raise self.DeplacementInvalide

        except self.DeplacementInvalide:
            self.messages['foreground'] = 'red'
            self.messages['text'] = 'Erreur: Deplacement invalide'
            self.canvas_echiquier.dessiner_cases()
            self.canvas_echiquier.dessiner_pieces()

        if self.partie.partie_terminee() == True:
            for i in toutes_les_position:
                if isinstance(
                        self.partie.echiquier.recuperer_piece_a_position(i),
                        Roi) == True:
                    couleur = self.partie.echiquier.couleur_piece_a_position(i)
            self.messages['foreground'] = 'red'
            self.messages['text'] = 'La partie est terminer.'
            self.label_temporaire['text'] = 'Félicitation joueur ' + couleur
            if var == 0:
                self.label_temporaire['text'] = 'Partie nulle de type pat'
                var2 = 1
                self.canvas_echiquier.dessiner_cases()
                self.canvas_echiquier.dessiner_pieces()

            self.canvas_echiquier.dessiner_cases()
            self.canvas_echiquier.dessiner_pieces()
Пример #9
0
    def deplacer(self, position_source, position_cible):
        """
            Permet de d'appeler le mouvement à la méthode déplacer du module Échiquier.
            Permet aussi de recalculer les pièces mangées qui sert dans le visuel du jeux.
            En même temps, sert à écrire ce qui sera communiquer au joueur sur la liste des déplacements
            dans le Listbox du jeux.

            Args:
                position_source (str): Position de source de la pièce
                position_cible (str): Position cible de la pièce

        """
        piece = self.echiquier.recuperer_piece_a_position(position_source)

        #Pour le roque
        if self.echiquier.deplacement_est_valide(position_source,
                                                 position_cible):
            self.hist.append(piece)

        self.echiquier.deplacer(position_source, position_cible)

        self.joueur_suivant()
        self.dernierDeplacement = [
            "(" + piece.couleur + ")" + position_source + "->" + position_cible
        ]
        self.listeDeplacements.append(self.dernierDeplacement)

        echiquierCopy = dict(self.echiquier.dictionnaire_pieces)
        self.echiquier.listeDesEchiquiers.append(echiquierCopy)

        self.dictionnaire_pieces_initial = {
            'a1': Tour('blanc'),
            'b1': Cavalier('blanc'),
            'c1': Fou('blanc'),
            'd1': Dame('blanc'),
            'e1': Roi('blanc'),
            'f1': Fou('blanc'),
            'g1': Cavalier('blanc'),
            'h1': Tour('blanc'),
            'a2': Pion('blanc'),
            'b2': Pion('blanc'),
            'c2': Pion('blanc'),
            'd2': Pion('blanc'),
            'e2': Pion('blanc'),
            'f2': Pion('blanc'),
            'g2': Pion('blanc'),
            'h2': Pion('blanc'),
            'a7': Pion('noir'),
            'b7': Pion('noir'),
            'c7': Pion('noir'),
            'd7': Pion('noir'),
            'e7': Pion('noir'),
            'f7': Pion('noir'),
            'g7': Pion('noir'),
            'h7': Pion('noir'),
            'a8': Tour('noir'),
            'b8': Cavalier('noir'),
            'c8': Fou('noir'),
            'd8': Dame('noir'),
            'e8': Roi('noir'),
            'f8': Fou('noir'),
            'g8': Cavalier('noir'),
            'h8': Tour('noir'),
        }

        self.setBlanc = set()
        self.setNoir = set()
        for i in self.dictionnaire_pieces_initial.values():
            if i.est_blanc():
                self.setBlanc.add(i)
            else:
                self.setNoir.add(i)

        self.resteBlanc = set()
        self.resteNoir = set()
        for i in self.echiquier.dictionnaire_pieces.values():
            if i.est_blanc():
                self.resteBlanc.add(i)
            else:
                self.resteNoir.add(i)

        self.gapBlanc = list(self.echiquier.setBlanc - self.resteBlanc)
        self.gapNoir = list(self.echiquier.setNoir - self.resteNoir)