Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- # -*- coding: utf8 -*-
- #==== IMPORTATION DES MODULES =============================================================================
- from tkinter import* # Importation du module tkinter
- from random import choice # importation de choice du module random
- from PIL import Image, ImageTk # Module PIL (traitement des images importées)
- #==== FONCTIONS ===========================================================================================
- def header(titre) :
- "Fonction qui fait réapparaitre le titre principal"
- # Méthode de reconfiguration du widget titre :
- titre.configure(text='Bienvenue dans le jeu du pendu', fg = 'navy', font='Times 30 italic')
- #----------------------------------------------------------------------------------------------------------
- def effacer(label):
- "Fonction qui détruit le widget label"
- label.destroy() # Méthode de destruction
- #----------------------------------------------------------------------------------------------------------
- def comparaison(entry, label, mot_choisi, mot_cache, prenom_joueur, bouton_mot_choisi) :
- "Fonction qui compare la lettre choisie avec celles du mot-mystère"
- global fenetre # Variables globales
- global nb_coups
- global liste_mots
- global scores
- get_entry = entry.get() # On récupère et on stocke dans une variable la lettre entrée dans le widget Entry.
- #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 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()
- entry.delete(0, 'end') # Effacement du contenu du widget entry
- with open('prenoms', 'r') as prenoms : # Ouverture du fichier 'prénoms' en mode lecture
- readfile = prenoms.readlines() # Stockage de l'intégralité du fichier sous la forme d'une liste, dans une variable.
- if not (prenom_joueur + '\n') in readfile : # : Si c'est un nouveau joueur
- 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
- with open('prenoms', 'a') as prenoms : # Création d'un fichier pour stocker les prénoms des joueurs et leurs résultats.
- prenoms.write(prenom_joueur+'\n'+str(scores[prenom_joueur])+'\n') # Méthode 'write'
- elif prenom_joueur + '\n' in readfile : # Si le joueur est déjà dans le fichier
- for i in range(0, len(readfile)) :
- if prenom_joueur == readfile[i][:-1]:
- if nb_coups > int(readfile[i+1][:-1]) : # Si le score est meilleur
- scores[prenom_joueur] = nb_coups # Il remplace l'ancien record personnel
- readfile[i+1] = str(scores[prenom_joueur]) + '\n'
- with open('prenoms', 'w') as prenoms : # Ouverture du fichier en mode écriture après avoir tout effacé
- for i in range(0, len(readfile)) :
- prenoms.write(readfile[i]) # Ecriture du nouveau fichier.
- label.configure(text='Dommage... A bientôt!')
- 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.
- #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- if get_entry.lower() == 'oui' and mot_choisi == ''.join(mot_cache) or nb_coups == 0 :
- bouton_mot_choisi.config(state='normal') # Déblocage du bouton "Choisir un mot"
- entry.delete(0, 'end') # VOIR LES COMMENTAIRES PLUS HAUT
- with open('prenoms', 'r') as prenoms :
- readfile = prenoms.readlines()
- if not (prenom_joueur + '\n') in readfile :
- 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
- with open('prenoms', 'a') as prenoms : # Création d'un fichier pour stocker les prénoms des joueurs et leurs résultats.
- prenoms.write(prenom_joueur+'\n'+str(scores[prenom_joueur])+'\n')
- elif prenom_joueur + '\n' in readfile :
- for i in range(0, len(readfile)) :
- if prenom_joueur == readfile[i][:-1]:
- if nb_coups > int(readfile[i+1][:-1]) :
- scores[prenom_joueur] = nb_coups
- readfile[i+1] = str(scores[prenom_joueur]) + '\n'
- with open('prenoms', 'w') as prenoms :
- for i in range(0, len(readfile)) :
- prenoms.write(readfile[i])
- nb_coups = 15 # Réinitialisation du compteur de coups.
- for child in main_frame.winfo_children() :
- if child == label :
- child.grid_remove() # Effacement du widget label
- for i in range (0, len(mot_choisi)) :
- mot_cache.append('*') # Création d'un mot composé d'astérisques qui correspond à la longueur du mot choisi.
- label.configure(text=mot_cache) # Affichage du mot composé d'astérisques
- #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 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()
- entry.delete(0, 'end')
- with open('prenoms', 'r') as prenoms : # VOIR LES COMMENTAIRES PLUS HAUT
- readfile = prenoms.readlines()
- if not (prenom_joueur + '\n') in readfile :
- 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
- with open('prenoms', 'a') as prenoms : # Création d'un fichier pour stocker les prénoms des joueurs et leurs résultats.
- prenoms.write(prenom_joueur+'\n'+str(scores[prenom_joueur])+'\n')
- elif prenom_joueur + '\n' in readfile :
- for i in range(0, len(readfile)) :
- if prenom_joueur == readfile[i][:-1]:
- if nb_coups > int(readfile[i+1][:-1]) :
- scores[prenom_joueur] = nb_coups
- readfile[i+1] = str(scores[prenom_joueur]) + '\n'
- with open('prenoms', 'w') as prenoms :
- for i in range(0, len(readfile)) :
- prenoms.write(readfile[i])
- nb_coups = 15 # Réinitialisation du compteur de coups.
- label.configure(text='Dommage... A bientôt!')
- 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.
- #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- else :
- i = 0 # Variable d'incrémentation
- while i < len(mot_choisi) : # Boucle qui compare la lettre choisie avec chaque lettre du mot-mystère
- if mot_choisi[i] == get_entry : # Si la lettre est présente, on l'affiche en remplaçant l'astérisque par la lettre.
- 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.
- nb_coups -= 1 # Décrémentation du compteur de coups et affichage du nombre de coups restants.
- mot_cache[i] = mot_choisi[i] # Remplacement de l'astérisque par la lettre trouvée.
- label.configure(text="".join(mot_cache)+'\nIl vous reste {0} coups.'.format(nb_coups))
- entry.delete(0, 'end') # Effacement de la lettre choisie dans le widget Entry
- i+=1 #Incrémentation de la boucle
- if not get_entry in mot_choisi and get_entry != 'non': # Si la lettre est absente, un message d'avertissement s'affiche
- nb_coups-=1 # Décrémentation du compteur de coups et affichage du nombre de coups restants.
- label.configure(text="".join(mot_cache)+'\nCette lettre est absente du mot.\nIl vous reste {0} coups.'.format(nb_coups))
- entry.delete(0, 'end') # Effacement de la lettre choisie dans le widget Entry
- 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.
- entry.delete(0, 'end')
- mot_choisi = choice(liste_mots) # Choix d'un nouveau mot-mystère
- mot_cache = [] # Réinitialisation du mot caché
- label.configure(text='Bravo! Vous avez gagné!\nVoulez-vous rejouer?')
- if nb_coups == 0 and '*' in mot_cache : # Si le joueur a épuisé son compteur de coups, affichage d'un avertissement
- entry.delete(0, 'end')
- mot_cache = [] # Réinitialisation du mot caché
- label.configure(text='Malheureusement, vous avez perdu!\nVoulez-vous rejouer?')
- #----------------------------------------------------------------------------------------------------------
- def trouver_mot(prenom_joueur, bouton_mot_choisi, entry, illustration) :
- "Fonction qui permet au joueur d'entrer une lettre"
- # Création des widgets Label et Entry
- global scores # dictionnaire contenant les prénoms des joueurs et leurs points.
- global liste_mots # Liste des mots mystère
- global nb_coups # Compteur de coups.
- nb_coups = 15
- bouton_mot_choisi.config(state='disabled') # Blocage du bouton "Choisir un mot"
- mot_choisi = choice(liste_mots) # Choix aléatoire d'un mot-mystère
- 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.
- for i in range (0, len(mot_choisi)) : # Boucle qui créé un mot caché composé d'astérisques.
- mot_cache.append('*')
- label = Label(main_frame, bg='white', fg='navy', text=mot_cache, font='Times 16 italic', padx = 10, pady = 5) # Instanciation du widget Label.
- illustration.grid(row = 1, column = 0, rowspan = 3, padx = 10, pady = 5)
- label.grid(row=2, column=1, padx = 10, pady = 5, sticky='ns')
- entry.grid(row =3, column = 1, padx=10, pady=5, sticky='n')
- entry.bind('<Return>', lambda event : comparaison(entry, label, mot_choisi, mot_cache, prenom_joueur, bouton_mot_choisi))
- #----------------------------------------------------------------------------------------------------------
- def enregistrer_nom(entry, titre, illustration):
- "Fonction permettant d'enregistrer le prénom du joueur"
- prenom_joueur = entry.get().capitalize() # La méthode capitalize() transforme la 1ère lettre en majuscule.
- with open('prenoms', 'r') as prenoms :
- readfile = prenoms.readlines()
- for i in range(0, len(readfile)):
- if prenom_joueur == readfile[i][:-1] :
- 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.')
- elif not prenom_joueur + '\n' in readfile :
- titre.config(fg = 'green', font = 'Times 18 bold', text = 'Bonjour {0}! A toi de jouer...'.format(prenom_joueur))
- main_frame.after(3500, lambda : header(titre))
- titre.grid(row=0, column=0, columnspan = 2, padx=10, pady= 5)
- illustration.grid(row = 1, column = 0, rowspan = 2, padx = 10, pady = 5)
- # Instanciation d'un widget Button
- 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.
- bouton_mot_choisi.grid(row = 1, column = 1, padx= 10, pady = 5)
- entry.delete(0, 'end')
- entry.grid(row =2, column = 1, padx=10, pady=5, sticky='n')
- #==== PROGRAMME PRINCIPAL =================================================================================
- fenetre = Tk() # Fenêtre mère
- main_frame = Frame(fenetre, bg='white', bd = 4, pady = 15) # Cadre principal
- main_frame.grid()
- # Liste des mots-mystère
- liste_mots = [
- "armoire",
- "boucle",
- "buisson",
- "bureau",
- "chaise",
- "carton",
- "couteau",
- "fichier",
- "garage",
- "glace",
- "journal",
- "kiwi",
- "lampe",
- "liste",
- "montagne",
- "remise",
- "sandale",
- "taxi",
- "vampire",
- "volant",
- ]
- scores = {} # dictionnaire contenant les prénoms des joueurs et leurs points.
- nb_coups = 15 # Compteur de coups.
- mon_image = "/home/benoit/Bureau/illustration.jpg" # Importation de l'image
- image = Image.open(mon_image)
- size = 256, 256 # Réduction de la taille de l'image
- image.thumbnail(size)
- photo = ImageTk.PhotoImage(image)
- # Création des widgets Label et Entry :
- titre = Label(main_frame, text='Bienvenue dans le jeu du pendu', bg = 'white', fg = 'navy', font='Times 30 italic')
- titre.grid(row=0, column=0, padx=10, pady= 5)
- entry = Entry(main_frame, bg='white', fg='navy', bd = 2, font='Times 16 italic')
- entry.grid(row =1, column = 0, padx=10, pady=5, sticky='n')
- entry.insert(0, 'Entrez votre prénom')
- entry.bind('<Button-1>', lambda event : entry.delete(0, 'end'))
- entry.bind('<Return>', lambda event : enregistrer_nom(entry, titre, illustration))
- illustration = Label(main_frame, image = photo, bg = 'navy', bd = 2)
- illustration.grid(row=2, column = 0, padx=10, pady=5)
- fenetre.mainloop() # Gestionnaire d'événements.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement