Bonjour a tous,
Voici mon premier programme en POO, un simple jeu du pendu fait en pygtk.
La recherche du mot inconnu se fait depuis un fichier texte (dico.txt)
J'ai essaie d'être le plus claire possible dans mon code mais je ne sais pas si j'y suis parvenus pour autant :p
Toutes remarques ou critiques sont les bienvenues
Source / Exemple :
#!/usr/bin/python
# -*- coding: Utf-8 -*-
# source:
# dico: http://www.siteduzero.com/tutoriel-3-194478-tp-pendu.html
# images: http://www.siteduzero.com/tutoriel-3-65538-tp-le-penduz.html
from random import randrange
import sys
import pygtk
pygtk.require("2.0")
import gtk
# ========================= CLASS: FENETRE =============================== #
class Fenetre:
"Gere les widgets du jeu"
myLabel = gtk.Label()
btReset = gtk.Button("Nouveau mot")
def __init__(self):
fen = gtk.Window( type=gtk.WINDOW_TOPLEVEL )
fen.set_default_size(400, 400)
fen.connect("destroy", self.on_fen_destroy)
fen.set_title("Jeu du pendu")
# tableau contiennant tous les widgets
TabWidget = gtk.Table(rows=3, columns=3)
self.myImage = gtk.Image()
self.myImage.set_from_file("img/pendu0.gif")
btOperation = [ "Nouveau mot", "Quitter" ]
i = 0
while i < len( btOperation ):
btOperation[i] = gtk.Button(btOperation[i])
btOperation[i].connect("clicked", self.on_btOperation_clicked)
i += 1
TabWidget.attach( btOperation[0], 0,1, 2,3)
TabWidget.attach( btOperation[1], 1,2, 2,3)
# Gere les boutons alpha dans un tableau
myTabAlpha = gtk.Table(13,3) # gere les bt lettre
alpha = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "-", "'" ]
self.btLettre = [0]*len(alpha)
i = 0
# instancie les boutons alpha
while i < len( alpha ):
self.btLettre[i] = gtk.Button( "<b>", alpha[i], "</b>" )
self.btLettre[i].connect("clicked", self.on_btLettre_clicked)
#self.btLettre[i].set_alignment(0.7,0.7)
i += 1
i, j, index, flag = 0, 0, 0, 1
# place les bt lettre dans un tableau (2x13)
while i < 13:
if flag == 0:
i += 1
flag, j = 1, 0
#print j, j+1, i, i+1
myTabAlpha.attach( self.btLettre[index], j, j+1, i, i+1, 5,5, )
index += 1
while j < 1:
j += 1
#print j, j+1, i, i+1
myTabAlpha.attach( self.btLettre[index], j, j+1, i, i+1, 5,5, )
index += 1
flag = 0
#print "\n"
# place tous les widgets dans un seul tableau
TabWidget.attach( self.myLabel, 0,3, 0,1 )
TabWidget.attach( self.myImage, 0,2, 1,2 )
#TabWidget.attach( self.btReset, 0,1, 2,3 )
TabWidget.attach( myTabAlpha, 2,3, 1,2 )
fen.add(TabWidget)
fen.show_all()
def on_fen_destroy(self, widget):
gtk.main_quit()
# evenement lorsque l'on clic sur btLettre
def on_btLettre_clicked(self, widget):
self.lettre = widget.get_label()
widget.set_sensitive(False) # desactive le btLettre cliquer
Pendu.deroulement() # methode contenant le corps du jeu
def on_btReset_clicked(self, widget):
Pendu.reset()
def on_btOperation_clicked(self, widget):
if widget.get_label() == "Nouveau mot":
Pendu.reset()
else:
sys.exit()
######################### CLASS: PENDU ###############################
class Pendu:
"Classe contenue tous le code du pendu"
essaie = 0 # calcule le nb d'erreur + gestion de l'image si essaie = 3 charge image pendu3.gif
myLabel = Fenetre.myLabel
cptLettreDejaTrouvee = 0
def __init__(self):
self.inconnu = self.searchMot()
#self.inconnu = "ABBANDONNER"
self.longMot = len( self.inconnu )
self.indiceTrouve = [0]*self.longMot # stock 1 si lettre trouvee a l'indice i
self.myLabel.set_text( "<b>"+ self.inconnuConvertUnderscore()+ "</b>" )
self.myLabel.set_use_markup(True)
# converti mot en - - -
# ex: riz => - - -
def inconnuConvertUnderscore(self):
chaine, i = "", 0
while i < self.longMot:
chaine += " - "
i += 1
return chaine
# recherche un mot inconnu a partir du fichier dico.txt
def searchMot(self):
try:
file = open("dico.txt", "r")
except IOError:
print "fichier dico.txt introuvable !"
sys.exit(0)
nb, mot = randrange(22740), file.readlines()
file.close()
return mot[nb].upper().rstrip() # met le mot en MAJ + supp les espaces
# desactive tous les boutons
def desactiveAllBt(self, show=False):
i = 0
while i < len( Fenetre.btLettre ):
Fenetre.btLettre[i].set_sensitive(show)
i += 1
# N'EST PLUS UTILISEE
#def verifLettre(self):
#lettre = Fenetre.getMyEntry()
#print lettre
#l = entLettre.get().upper()
#entLettre.delete(0, END) # supp la lettre du champ entLettre
#print "long = ", len(l)
#if len(l) == 1:
#if l in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'):
#return l # lettre entrée == lettre alpha ex: a
#else:
#afficheur.configure(text="Entrez uniquement une lettre alphabetique, svp")
#return 1 # ex: (
#else:
#afficheur.configure(text="N'Entrer qu'une seule lettre, svp")
#return 2 # ex: entrée == ax
# verifie si la lettre choisit pas l'user et dans inconnu
# ou si c'est la fin de la partie
def deroulement(self):
lettre = Fenetre.lettre
i, lTrouvee, etat, chaine = 0, 0, 0, ""
self.myLabel.set_text("")
while i < self.longMot:
if self.essaie > 7:
self.myLabel.set_text("Desole, vous avez perdu :(\n le mot etait: <b>" +self.inconnu+ "</b>")
self.myLabel.set_use_markup(True)
Fenetre.myImage.set_from_file("img/pendu8.gif")
self.desactiveAllBt(show=False)
return
if lettre == self.inconnu[i]:
self.indiceTrouve[i] = 1
self.cptLettreDejaTrouvee += 1
lTrouvee = 1 # lorsqu'une lettre est trouvee on pose un flag a 1 pour ne pas decrementer plusieurs fois essaie (car on n'est dans une boucle)
else:
if lTrouvee != 1:
etat = 1
else:
etat = 0
# affiche a l'user le resultation ex: A - - A - D O - - - -
if self.indiceTrouve[i] == 1:
print self.inconnu[i],
chaine += " "+self.inconnu[i]+" "
else:
print "_ ",
chaine += " - "
i += 1
self.myLabel.set_text( "<b>"+ chaine+ "</b>" ) # affiche le resultat courrant a l'user
self.myLabel.set_use_markup(True)
print "\ninconnu ", self.inconnu, " | etat ", etat, " | longMot ", self.longMot, " | essaie ", self.essaie, " | letDejaTrouvee ", self.cptLettreDejaTrouvee
# verifie si on n'a gagnner
if self.cptLettreDejaTrouvee == len( self.indiceTrouve ):
print "VOUS AVEZ GAGNER"
self.myLabel.set_text("<b> Bravo, vous avez gagnie :) \n\tmot: "+ self.inconnu+ "</b>")
self.myLabel.set_use_markup(True)
self.desactiveAllBt(show=False)
return
# si on n'a pas trouve de lettre on perd un essaie + changement img
if etat == 1:
self.essaie += 1
Fenetre.myImage.set_from_file("img/pendu" +str(self.essaie)+ ".gif")
# remet a zero les attributs
def reset(self):
print "RESET PARTIE"
Fenetre.myImage.set_from_file("img/pendu0.gif")
#self.inconnu = "ABBANDONNER"
self.inconnu = self.searchMot()
self.longMot = len( self.inconnu )
self.myLabel.set_text( "<b>" +self.inconnuConvertUnderscore()+ "</b>" )
self.myLabel.set_use_markup(True)
self.essaie = 0
self.cptLettreDejaTrouvee = 0
self.indiceTrouve = [0]*self.longMot
self.desactiveAllBt(show=True)
if __name__ == "__main__":
Pendu = Pendu()
Fenetre = Fenetre()
gtk.main()
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.