1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
| #!/usr/bin/python3.5
# -*-coding:utf-8 -*
import tkinter
from turtle import *
from couleurs import COLORS
from random import choice
import pickle
class Jeu():
def __init__(self, Scores_recuperes = {}, Scores_charges = 0):
self.Scores_recuperes = Scores_recuperes
self.Scores_charges = Scores_charges
self.nom = ''
self.score_joueur = 0
self.message = ''
self.message_lettre = ''
self.mot=''
self.mot_partiel = list(8 * '*')
self.compteur = 0
self.lettre = ''
self.tentativesmax = 0
def identifiant(self,nom):
self.nom = nom
if self.nom in self.Scores_recuperes.keys():
self.score_joueur = self.Scores_recuperes[self.nom]
self.message = 'Votre précédent score était de : ' + str(self.score_joueur)
else:
self.Scores_recuperes[self.nom] = self.score_joueur
self.message = 'Vous êtes enregistré ' + str(self.nom)
with open('score', 'wb') as Scores: # Enregistrement de l'identifiant dans le dictionnaire et dans scores
self.Scores_charges = pickle.dump(self.Scores_recuperes, Scores)
def chercher_lettre_dans_mot(self):
nb_occurences = self.mot.count(self.lettre)
if nb_occurences == 0 :
self.message_lettre = str(self.lettre) + ' pas dans le mot cherché.'
return False
self.message_lettre = str(self.lettre) + ' dans dans le mot cherché.'
return True
def afficher_mot_partiel(self):
for i,x in enumerate(self.mot):
if x == self.lettre : self.mot_partiel[i] = self.lettre
return self.mot_partiel
def chargement_donnees(self):
with open("donnees.py", "r") as fichier:
donnees = fichier.read()
self.mot = choice(donnees.split()[:-1]).lower()
self.tentativesmax = int(donnees.split()[-1])
self.compteur = self.tentativesmax + self.score_joueur
return
def dessiner(self, canvas_tkinter, hight, width):
'''Fonction dessiner avec Turtle'''
#Module Turtle
self.t=RawPen(canvas_tkinter)
self.t.pensize(4)
self.t.pencolor(choice(COLORS))
self.t.hideturtle()
self.t.speed('fastest')
self.X0 = -width/2
self.Y0 = -hight/2
#Début du dessin Turtle
self.t.up()
self.t.goto(self.X0+175, self.Y0)
self.t.down()
#pilier
self.t.goto(self.X0+175, self.Y0+180)
yield # utilisé avec next comme itérateur sur gibet=dessiner()
#potence
self.t.goto(self.X0+90, self.Y0+180)
yield
#corde
self.t.goto(self.X0+90, self.Y0+150)
self.t.up()
yield
#tête
self.t.goto(self.X0+90, self.Y0+130)
self.t.down()
self.t.circle(10)
self.t.up()
yield
#buste
self.t.goto(self.X0+75, self.Y0+130)
self.t.down()
self.t.forward(30)
self.t.right(90)
self.t.forward(60)
self.t.right(90)
self.t.forward(30)
self.t.right(90)
self.t.forward(60)
self.t.up()
yield
#bras gauche
self.t.goto(self.X0+75, self.Y0+120)
self.t.down()
self.t.goto(self.X0+55, self.Y0+75)
self.t.up()
yield
#bras droit
self.t.goto(self.X0+105, self.Y0+120)
self.t.down()
self.t.goto(self.X0+125, self.Y0+75)
self.t.up()
yield
#jambe droite
self.t.goto(self.X0+100, self.Y0+70)
self.t.down()
self.t.goto(self.X0+125, self.Y0+30)
self.t.up()
yield
#jambe gauche
self.t.goto(self.X0+80, self.Y0+70)
self.t.down()
self.t.goto(self.X0+55, self.Y0+30)
self.t.up()
yield
if self.compteur == 0 : yield
def core(self, lettre = ''):
self.lettre = lettre
if self.chercher_lettre_dans_mot() == True:
self.mot_partiel = self.afficher_mot_partiel()
if self.mot == ''.join(self.mot_partiel):
self.message = "Mot trouvé : {} ! Score = {}".format(''.join(self.mot_partiel), self.compteur)
return (self.message, self.mot_partiel, self.message_lettre, 1) # Envoi un tuple (lab3, lab3, lab4, réponse 0/1)
else:
return (self.message, self.mot_partiel, self.message_lettre, 1)
else:
self.compteur -= 1
if self.compteur == 0:
self.message = "Perdu. Le mot était : " + str(self.mot)
return (self.message, self.mot_partiel, self.message_lettre, 0)
else:
self.message = "Il reste {} tentatives.".format(self.compteur)
return (self.message, self.mot_partiel, self.message_lettre, 0)
# Mise à jour des scores (0 ou nombre de tentative restante
self.Scores_recuperes[self.nom] = self.compteur
with open('score', 'wb') as Scores:
Scores_charges = pickle.dump(Scores_recuperes, Scores)
class InterfaceGraphique(tkinter.Tk):
def __init__(self):
tkinter.Tk.__init__(self)
#Ouverture fenêtre
self.fenetre()
self.title('Appli Pendu')
self.mainloop()
def fenetre(self, largeur=200, hauteur=200) :
'''Une zone graphique et plusieurs boutons'''
self.largeur = largeur
self.hauteur = hauteur
#Deux frames : frame1 à gauche pour le dessin, et frame2 à droite pour les autres widgets
#Les frames sont positionnées avec grid
#Frame contenant la zone de dessin et initialisation d'un canvas
self.frame1 = tkinter.Frame()
self.frame1.grid(column=0,row=0)
#Positionnement de la zone de dessin avec la méthode grid et une seule case (extension pour plus tard)
self.zone_dessin = tkinter.Canvas(self.frame1, width=self.largeur, height=self.hauteur)
self.zone_dessin.grid(column=0,row=0)
# Instanciation de dessiner() pour itérer
self.gibet = a.dessiner(self.zone_dessin, self.largeur, self.hauteur)
#Frame contenant les boutons et labels
#Positionnement des widgets avec une deuxième méthode grid dans frame2
#frame
self.frame2 = tkinter.Frame()
self.frame2.grid(column=1,row=0)
#Boutons
b_quit = tkinter.Button(self.frame2, command = self.destroy, text = "Quitter", fg="red")
b_quit.grid(column=0,row=11)
#Champ texte nom
#Variable de contrôle
self.value = tkinter.StringVar(self)
self.value.set("Quel est votre nom ?")
#Champ
self.entree = tkinter.Entry(self.frame2, textvariable=self.value, width=30)
self.entree.grid(column=0,row=1)
#Enregistrement de la saisie
self.entree.bind("<Return>", self.affichersaisie)
#Description du champ
#self.lab1 = tkinter.Label(self.frame2, text='Résultat de la saisie')
#self.lab1.grid(column=0,row=2)
#Affichage de la saisie
self.lab2 = tkinter.Label(self.frame2, text=self.value.get())
self.lab2.grid(column=0,row=3)
#Champ texte lettre
#Variable de contrôle
self.value2 = tkinter.StringVar(self)
self.value2.set("Choix d'une lettre ?")
#Champ
self.entree2 = tkinter.Entry(self.frame2, textvariable=self.value2, width=30)
self.entree2.grid(column=0,row=4)
#Enregistrement de la saisie
self.entree2.bind("<Return>", self.affichersaisie2)
#Description du champ
self.lab3 = tkinter.Label(self.frame2, text='')
self.lab3.grid(column=0,row=5)
#Affichage de la saisie
self.lab4 = tkinter.Label(self.frame2, text='')
self.lab4.grid(column=0,row=6)
def affichersaisie(self,event):
#Charge les identifiants et compare si joueur déjà inscrit (précédent score)
a.identifiant(self.entree.get())
#Charge les données pour un nouveau jeu (y compris ancien score)
a.chargement_donnees()
#Affiche le précdent score ou message (0 si nouveau ou dernière partie perdue)
self.lab2["text"] = a.message # les widgets se comportent comme des dictionnaires ou, sinon, utiliser self.lab2.configure(text = self.entree.get())
return
def affichersaisie2(self,event):
'''Envoie la lettre saisie dans le programme pour traitement'''
#Permet de déclencher l'appel à la fonction gibet si mauvaise réponse
self.reponse = 0
#Affecte le tuple de réponse aux labels
(self.lab2["text"],self.lab3["text"],self.lab4["text"], self.reponse) = a.core(self.entree2.get())
#Si mauvaise réponse (valeur self.reponse = 0) alors itérer sur dessiner() pour afficher le gibet
if self.reponse == 0 : next(self.gibet)
if __name__ == "__main__":
# Création du fichier scores ou chargement si existant
# Instanciation de la classe "Jeu" pour pouvoir être manipuler dans la GUI
try:
with open("score", "rb") as Scores:
Scores_recuperes = pickle.load(Scores)
a = Jeu(Scores_recuperes, Scores_charges=0)
except :
Scores_recuperes = {}
with open('score', 'wb') as Scores:
Scores_charges = pickle.dump(Scores_recuperes, Scores)
a = Jeu(Scores_recuperes, Scores_charges=0)
#Lancement InterfaceGraphique ici
GUI = InterfaceGraphique() |