Advertisement
Kaadem-85

pendu.py

Aug 21st, 2016
474
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.00 KB | None | 0 0
  1. #!/usr/bin/python3
  2. # -*- coding: utf8 -*-
  3.  
  4. #==== IMPORTATION DES MODULES =============================================================================
  5.  
  6. from tkinter import* # Importation du module tkinter
  7. from random import choice # importation de choice du module  random
  8. from PIL import Image, ImageTk  # Module PIL (traitement des images importées)
  9.  
  10. #==== FONCTIONS ===========================================================================================
  11.  
  12. def header(titre) :
  13.     "Fonction qui fait réapparaitre le titre principal"
  14.     # Méthode de reconfiguration du widget titre :
  15.     titre.configure(text='Bienvenue dans le jeu du pendu', fg = 'navy', font='Times 30 italic')
  16.  
  17. #----------------------------------------------------------------------------------------------------------
  18.  
  19. def effacer(label):
  20.     "Fonction qui détruit le widget label"
  21.     label.destroy() # Méthode de destruction
  22.  
  23. #----------------------------------------------------------------------------------------------------------
  24.  
  25. def comparaison(entry, label, mot_choisi, mot_cache, prenom_joueur, bouton_mot_choisi) :
  26.     "Fonction qui compare la lettre choisie avec celles du mot-mystère"
  27.     global fenetre # Variables globales
  28.     global nb_coups
  29.     global liste_mots  
  30.     global scores
  31.     get_entry = entry.get() # On récupère et on stocke dans une variable la lettre entrée dans                                           le widget Entry.
  32.  
  33. #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  34.  
  35.     if get_entry.lower() == "non" and nb_coups == 0 and mot_cache != mot_choisi : # Si le joueur répond "non" (avec éventuellement des majuscules) , on met le mot en minuscule grâce à la méthode lower()
  36.         entry.delete(0, 'end') # Effacement du contenu du widget entry
  37.         with open('prenoms', 'r') as prenoms : # Ouverture du fichier 'prénoms' en mode lecture
  38.             readfile = prenoms.readlines()  # Stockage de l'intégralité du fichier sous la forme d'une                                                liste, dans une variable.
  39.             if not (prenom_joueur + '\n') in readfile : # : Si c'est un nouveau joueur
  40.                 scores[prenom_joueur] = nb_coups # Création d'un dictionnaire avec comme clé le prénom du                                            joueur et comme valeur, le nombre de points à l'issue de la partie
  41.                 with open('prenoms', 'a') as prenoms : # Création d'un fichier pour stocker les prénoms                                                       des joueurs et leurs résultats.
  42.                     prenoms.write(prenom_joueur+'\n'+str(scores[prenom_joueur])+'\n') # Méthode 'write'
  43.             elif prenom_joueur + '\n' in readfile : # Si le joueur est déjà dans le fichier
  44.                 for i in range(0, len(readfile)) :
  45.                     if prenom_joueur == readfile[i][:-1]:
  46.                         if nb_coups > int(readfile[i+1][:-1]) : # Si le score est meilleur
  47.                             scores[prenom_joueur] = nb_coups # Il remplace l'ancien record personnel
  48.                             readfile[i+1] = str(scores[prenom_joueur]) + '\n'
  49.                 with open('prenoms', 'w') as prenoms : # Ouverture du fichier en mode écriture après avoir                                                            tout effacé
  50.                     for i in range(0, len(readfile)) :                         
  51.                         prenoms.write(readfile[i]) # Ecriture du nouveau fichier.
  52.         label.configure(text='Dommage... A bientôt!')
  53.         main_frame.after(1500, fenetre.quit) # Appel de la méthode after() pour fermer l'application après 1500 millisecondes grâce à la fonction passée en arguments.
  54.  
  55. #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  56.  
  57.     if get_entry.lower() == 'oui' and mot_choisi == ''.join(mot_cache) or nb_coups == 0 :
  58.         bouton_mot_choisi.config(state='normal') # Déblocage du bouton "Choisir un mot"
  59.         entry.delete(0, 'end') # VOIR LES COMMENTAIRES PLUS HAUT
  60.         with open('prenoms', 'r') as prenoms :
  61.             readfile = prenoms.readlines() 
  62.             if not (prenom_joueur + '\n') in readfile :
  63.                 scores[prenom_joueur] = nb_coups # Création d'un dictionnaire avec comme clé le prénom du                                            joueur et comme valeur, le nombre de points à l'issue de la partie
  64.                 with open('prenoms', 'a') as prenoms : # Création d'un fichier pour stocker les prénoms                                                       des joueurs et leurs résultats.
  65.                     prenoms.write(prenom_joueur+'\n'+str(scores[prenom_joueur])+'\n')
  66.             elif prenom_joueur + '\n' in readfile :
  67.                 for i in range(0, len(readfile)) :
  68.                     if prenom_joueur == readfile[i][:-1]:
  69.                         if nb_coups > int(readfile[i+1][:-1]) :
  70.                             scores[prenom_joueur] = nb_coups
  71.                             readfile[i+1] = str(scores[prenom_joueur]) + '\n'
  72.                 with open('prenoms', 'w') as prenoms :
  73.                     for i in range(0, len(readfile)) :                         
  74.                         prenoms.write(readfile[i])
  75.             nb_coups = 15 # Réinitialisation du compteur de coups.
  76.         for child in main_frame.winfo_children() :
  77.             if child == label :
  78.                 child.grid_remove() # Effacement du widget label
  79.         for i in range (0, len(mot_choisi)) :
  80.             mot_cache.append('*') # Création d'un mot composé d'astérisques qui correspond à la                                         longueur du mot choisi.
  81.         label.configure(text=mot_cache) # Affichage du mot composé d'astérisques
  82.  
  83. #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  84.  
  85.     elif get_entry.lower() == "non" and mot_choisi == ''.join(mot_cache) : # Si le joueur répond "non" (avec éventuellement des majuscules) , on met le mot en minuscule grâce à la méthode lower()
  86.         entry.delete(0, 'end')
  87.         with open('prenoms', 'r') as prenoms : # VOIR LES COMMENTAIRES PLUS HAUT
  88.             readfile = prenoms.readlines() 
  89.             if not (prenom_joueur + '\n') in readfile :
  90.                 scores[prenom_joueur] = nb_coups # Création d'un dictionnaire avec comme clé le prénom du                                            joueur et comme valeur, le nombre de points à l'issue de la partie
  91.                 with open('prenoms', 'a') as prenoms : # Création d'un fichier pour stocker les prénoms                                                       des joueurs et leurs résultats.
  92.                     prenoms.write(prenom_joueur+'\n'+str(scores[prenom_joueur])+'\n')
  93.             elif prenom_joueur + '\n' in readfile :
  94.                 for i in range(0, len(readfile)) :
  95.                     if prenom_joueur == readfile[i][:-1]:
  96.                         if nb_coups > int(readfile[i+1][:-1]) :
  97.                             scores[prenom_joueur] = nb_coups
  98.                             readfile[i+1] = str(scores[prenom_joueur]) + '\n'
  99.  
  100.                 with open('prenoms', 'w') as prenoms :
  101.                     for i in range(0, len(readfile)) :                         
  102.                         prenoms.write(readfile[i])
  103.             nb_coups = 15 # Réinitialisation du compteur de coups.
  104.         label.configure(text='Dommage... A bientôt!')
  105.         main_frame.after(1500, fenetre.quit) # Appel de la méthode after() pour fermer l'application après 1500 millisecondes grâce à la fonction passée en arguments.
  106.  
  107. #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  108.  
  109.     else :
  110.         i = 0 # Variable d'incrémentation
  111.         while i < len(mot_choisi) : # Boucle qui compare la lettre choisie avec chaque lettre du mot-mystère
  112.             if mot_choisi[i] == get_entry : # Si la lettre est présente, on l'affiche en remplaçant                                               l'astérisque par la lettre.
  113.  
  114.                 if not get_entry in mot_cache : #S'il y a plusieurs fois la même lettre le compteur est                                                        décrémenté une seule fois.
  115.                     nb_coups -= 1 # Décrémentation du compteur de coups et affichage du nombre de coups restants.
  116.                 mot_cache[i] = mot_choisi[i] # Remplacement de l'astérisque par la lettre trouvée.   
  117.                 label.configure(text="".join(mot_cache)+'\nIl vous reste {0} coups.'.format(nb_coups))
  118.                 entry.delete(0, 'end') # Effacement de la lettre choisie dans le widget Entry
  119.             i+=1 #Incrémentation de la boucle
  120.  
  121.         if not get_entry in mot_choisi and get_entry != 'non': # Si la lettre est absente, un message d'avertissement s'affiche
  122.             nb_coups-=1 # Décrémentation du compteur de coups et affichage du nombre de coups restants.
  123.             label.configure(text="".join(mot_cache)+'\nCette lettre est absente du mot.\nIl vous reste {0} coups.'.format(nb_coups))
  124.             entry.delete(0, 'end')  # Effacement de la lettre choisie dans le widget Entry
  125.  
  126.         if mot_choisi == ''.join(mot_cache) : # Si toutes les lettres ont été découvertes, affichage d'un                                        message de félicitations et on demande au joueur s'il veut rejouer.   
  127.             entry.delete(0, 'end')
  128.             mot_choisi = choice(liste_mots) # Choix d'un nouveau mot-mystère
  129.             mot_cache = [] # Réinitialisation du mot caché
  130.             label.configure(text='Bravo! Vous avez gagné!\nVoulez-vous rejouer?')
  131.                
  132.         if nb_coups == 0 and '*' in mot_cache : # Si le joueur a épuisé son compteur de coups, affichage                                                  d'un avertissement
  133.             entry.delete(0, 'end')
  134.             mot_cache = [] # Réinitialisation du mot caché
  135.             label.configure(text='Malheureusement, vous avez perdu!\nVoulez-vous rejouer?')
  136.            
  137. #----------------------------------------------------------------------------------------------------------
  138.  
  139. def trouver_mot(prenom_joueur, bouton_mot_choisi, entry, illustration) :
  140.     "Fonction qui permet au joueur d'entrer une lettre"
  141.     # Création des widgets Label et Entry
  142.     global scores # dictionnaire contenant les prénoms des joueurs et leurs points.
  143.     global liste_mots # Liste des mots mystère
  144.     global nb_coups # Compteur de coups.
  145.     nb_coups = 15
  146.     bouton_mot_choisi.config(state='disabled') # Blocage du bouton "Choisir un mot"
  147.     mot_choisi = choice(liste_mots) # Choix aléatoire d'un mot-mystère
  148.     mot_cache = [] # Création d'un mot composé d'astérisques correspondant à la longueur du mot mystère et                             qui se découvira à mesure que le joueur trouvera les bonnes lettres.
  149.     for i in range (0, len(mot_choisi)) : # Boucle qui créé un mot caché composé d'astérisques.
  150.         mot_cache.append('*')  
  151.     label = Label(main_frame, bg='white', fg='navy', text=mot_cache, font='Times 16 italic', padx = 10, pady = 5) # Instanciation du widget Label.
  152.     illustration.grid(row = 1, column = 0, rowspan = 3, padx = 10, pady = 5)
  153.     label.grid(row=2, column=1, padx = 10, pady = 5, sticky='ns')
  154.     entry.grid(row =3, column = 1, padx=10, pady=5, sticky='n')
  155.     entry.bind('<Return>', lambda event : comparaison(entry, label, mot_choisi, mot_cache, prenom_joueur, bouton_mot_choisi))
  156.  
  157. #----------------------------------------------------------------------------------------------------------
  158.  
  159. def enregistrer_nom(entry, titre, illustration):
  160.     "Fonction permettant d'enregistrer le prénom du joueur"
  161.     prenom_joueur = entry.get().capitalize() # La méthode capitalize() transforme la 1ère lettre en                                                       majuscule.
  162.     with open('prenoms', 'r') as prenoms :
  163.         readfile = prenoms.readlines()
  164.         for i in range(0, len(readfile)):
  165.             if prenom_joueur == readfile[i][:-1] :
  166.                 titre.config(fg = 'green', font = 'Times 18 bold', text = 'Bonjour {0}!\nTon record personnel est de '.format(prenom_joueur) + (readfile[i+1][:-1]) + ' coups restants.')  
  167.             elif not prenom_joueur + '\n' in readfile :
  168.                 titre.config(fg = 'green', font = 'Times 18 bold', text = 'Bonjour {0}! A toi de jouer...'.format(prenom_joueur))
  169.     main_frame.after(3500, lambda : header(titre))
  170.     titre.grid(row=0, column=0, columnspan = 2, padx=10, pady= 5)
  171.     illustration.grid(row = 1, column = 0, rowspan = 2, padx = 10, pady = 5)
  172.     # Instanciation d'un widget Button
  173.     bouton_mot_choisi = Button(main_frame, text='choisir un mot', bg='navy', fg ='white', font='times 18', command = lambda : trouver_mot(prenom_joueur, bouton_mot_choisi, entry, illustration)) # Expression lambda permettant de passer des arguments à la fonction "trouver_mot" sans que cette dernière soit appelée immédiatement.
  174.     bouton_mot_choisi.grid(row = 1, column = 1, padx= 10, pady = 5)
  175.     entry.delete(0, 'end')
  176.     entry.grid(row =2, column = 1, padx=10, pady=5, sticky='n')
  177.    
  178. #==== PROGRAMME PRINCIPAL =================================================================================
  179.  
  180. fenetre = Tk() # Fenêtre mère
  181. main_frame = Frame(fenetre, bg='white', bd = 4, pady = 15) # Cadre principal
  182. main_frame.grid()
  183.  
  184. # Liste des mots-mystère
  185. liste_mots = [
  186.     "armoire",
  187.     "boucle",
  188.     "buisson",
  189.     "bureau",
  190.     "chaise",
  191.     "carton",
  192.     "couteau",
  193.     "fichier",
  194.     "garage",
  195.     "glace",
  196.     "journal",
  197.     "kiwi",
  198.     "lampe",
  199.     "liste",
  200.     "montagne",
  201.     "remise",
  202.     "sandale",
  203.     "taxi",
  204.     "vampire",
  205.     "volant",
  206. ]
  207. scores = {} # dictionnaire contenant les prénoms des joueurs et leurs points.
  208. nb_coups = 15 # Compteur de coups.
  209. mon_image = "/home/benoit/Bureau/illustration.jpg" # Importation de l'image
  210. image = Image.open(mon_image)
  211. size = 256, 256 # Réduction de la taille de l'image
  212. image.thumbnail(size)
  213. photo = ImageTk.PhotoImage(image)
  214.  
  215. # Création des widgets Label et Entry :
  216.  
  217. titre = Label(main_frame, text='Bienvenue dans le jeu du pendu', bg = 'white', fg = 'navy', font='Times 30 italic')
  218. titre.grid(row=0, column=0, padx=10, pady= 5)
  219. entry = Entry(main_frame, bg='white', fg='navy', bd = 2, font='Times 16 italic')
  220. entry.grid(row =1, column = 0, padx=10, pady=5, sticky='n')
  221. entry.insert(0, 'Entrez votre prénom')
  222. entry.bind('<Button-1>', lambda event : entry.delete(0, 'end'))
  223. entry.bind('<Return>', lambda event : enregistrer_nom(entry, titre, illustration))
  224. illustration = Label(main_frame, image = photo, bg = 'navy', bd = 2)
  225. illustration.grid(row=2, column = 0, padx=10, pady=5)
  226.  
  227. fenetre.mainloop() # Gestionnaire d'événements.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement