Esempio n. 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"
Esempio n. 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)
Esempio n. 3
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é
Esempio n. 4
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'),
        }
Esempio n. 5
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')
Esempio n. 6
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()
Esempio n. 7
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)