[python] jeu du pendu

Description

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()

Codes Sources

A voir également

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.