#pendu5.py from tkinter import * from random import randint from formes import * class ZoneAffichage(Canvas): def __init__(self, parent, w, h, c): Canvas.__init__(self, master=parent, width=w, height=h, bg=c) # Listes des formes du pendu, dans l'ordre du dessin self.__listeShape = [] # Base, Poteau, Traverse, Corde self.__listeShape.append(Rectangle(self, 50, 270, 200, 26, "brown")) self.__listeShape.append(Rectangle(self, 87, 83, 26, 200, "brown")) self.__listeShape.append(Rectangle(self, 87, 70, 150, 26, "brown")) self.__listeShape.append(Rectangle(self, 183, 67, 10, 40, "brown")) # Tete, Tronc self.__listeShape.append(Ellipse(self, 188, 120, 20, 20, "black")) self.__listeShape.append(Rectangle(self, 175, 143, 26, 60, "black")) # Bras gauche, droit self.__listeShape.append(Rectangle(self, 133, 150, 40, 10, "black")) self.__listeShape.append(Rectangle(self, 203, 150, 40, 10, "black")) # Jambes gauche et droite self.__listeShape.append(Rectangle(self, 175, 205, 10, 40, "black")) self.__listeShape.append(Rectangle(self, 191, 205, 10, 40, "black")) def cachePendu(self): for f in self.__listeShape: f.set_state("hidden") def dessinePiecePendu(self, i): if i<=len(self.__listeShape): self.__listeShape[i-1].set_state("normal") class MonBoutonLettre(Button): def __init__(self, parent, fen, t): Button.__init__(self, master=parent, text=t, state=DISABLED) self.__fen=fen self.__lettre=t def cliquer(self): self.config(state=DISABLED) self.__fen.traitement(self.__lettre) class FenPrincipale(Tk): def __init__(self): Tk.__init__(self) self.title('Jeu du pendu') self.configure(bg="#2687bc") # La barre d'outils barreOutils = Frame(self) barreOutils.pack(side=TOP, padx=5, pady=5) newGameButton = Button(barreOutils, text ='Nouvelle partie', width=13) newGameButton.pack(side=LEFT, padx=5, pady=5) quitButton = Button(barreOutils, text ='Quitter', width=13) quitButton.pack(side=LEFT, padx=5, pady=5) # Le canvas pour le dessin du pendu self.__zoneAffichage = ZoneAffichage(self, 320, 320, "#ec4062") self.__zoneAffichage.pack(side=TOP, padx=5, pady=5) # Le mot à deviner self.__lmot = Label(self, text='Mot :') self.__lmot.pack(side=TOP) # Le clavier clavier = Frame(self) clavier.pack(side=TOP, padx=5, pady=5) self.__boutons = [] for i in range(26): t = chr(ord('A')+i) self.__boutons.append(MonBoutonLettre(clavier, self, t)) # Placement des boutons du clavier for i in range(3): for j in range(7): self.__boutons[i*7+j].grid(row=i,column=j) for j in range(5): self.__boutons[21+j].grid(row=3,column=j+1) # Commandes associées aux boutons quitButton.config(command=self.destroy) newGameButton.config(command=self.nouvellePartie) for i in range(26): self.__boutons[i].config(command=self.__boutons[i].cliquer) # initialisation des attributs self.__mot = "" self.__motAffiche= "" self.__mots= [] self.__nbManques = 0 # Chargement du fichier de mots self.chargeMots() # On commence une nouvelle partie self.nouvellePartie() def chargeMots(self): f = open('mots.txt', 'r') s = f.read() self.__mots = s.split('\n') f.close() def nouvellePartie(self): # Boutons-lettres dégrisés for i in range(26): self.__boutons[i].config(state=NORMAL) # Nouveau mot à devnier et update self.__mot = self.__mots[randint(0,len(self.__mots)-1)] self.__motAffiche = len(self.__mot)*'*' self.__lmot.config(text='Mot : '+self.__motAffiche) # on re-init le nbre de coups manqués et on efface le précédent dessin self.__nbManques = 0 self.__zoneAffichage.cachePendu() #---> on cache le pendu en utilisant la couleur de fond def traitement(self, lettre): cpt = 0 lettres = list(self.__motAffiche) for i in range(len(self.__mot)): if self.__mot[i]==lettre: cpt +=1 lettres[i]=lettre self.__motAffiche = ''.join(lettres) if cpt ==0: self.__nbManques += 1 self.__zoneAffichage.dessinePiecePendu(self.__nbManques) #---> Dessin de l'elt suivant if self.__nbManques >= 10: self.finPartie(False) else: self.__lmot.config(text='Mot : '+self.__motAffiche) if self.__mot == self.__motAffiche: self.finPartie(True) def finPartie(self, gagne): for b in self.__boutons: b.config(state=DISABLED) if gagne : self.__lmot.config(text=self.__mot+' - Bravo, vous avez gagné') else : self.__lmot.config(text='Vous avez perdu, le mot était : '+self.__mot) if __name__ == '__main__': fen = FenPrincipale() fen.mainloop()