Jeu du pendu

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 192 fois - Téléchargée 15 fois

Contenu du snippet

Voici une version du jeu du pendu très simpliste.

Je sais que j'ai tendance à faire des rallonges de code, je corrige ça petit à petit.
Ca reste de la programmation linéaire, je n'ai programmé aucune classe.

C'est mon premier post alors soyez indulgents !

Source / Exemple :


# -*- coding: utf-8 -*-

import random

def masque(chaine,liInd=0):
        
        i = 0
        lenght = len(chaine)

        listeetalon = []
        
        ch = chaine[0]
        
        for i in range (1,lenght-1,1):

                if type(liInd)==type(listeetalon):
                        
                        if len(liInd)==0:
                                ch = ch + '*'

                        else:
                                j = 0
                                for j in range(len(liInd)):

                                        if liInd[j] == i:
                                                ch = ch + chaine[i]
                                                

                                if i+1 != len(ch):
                                        ch = ch + '*'
                                                
                else:
                        ch = ch + '*'

        ch = ch + chaine[lenght-1]
        return ch

def test_lettre(car, mot):

        i = 0
        lenght = len(mot)
        li = []
        
        for i in range(1,lenght-1,1):

                if mot[i] == car:
                        li.append(i)
        return li

def testmot(motor,mot2):
        i = 0
        compteur = 0
        lenghtor = len(motor)
        lenght2 = len(mot2)
        
        if lenghtor != lenght2:
                return False
        
        else:
                for i in range(lenghtor):
                        if mot2[i] == motor[i]:
                                compteur = compteur + 1
                if compteur == lenghtor:
                        return True
                else:
                        return False

def revenir():
        
            oui = "oO"
            non = "nN"
            choix = "?"
            i = 0
            print "\nRevenir au menu principal ? (O/N)"
            choix = raw_input()

            while(choix != oui[0] and choix != non[0] and choix != oui[1] and choix != non[1]):
                    print"Je n'ai pas compris votre saisie. O/N ?"
                    choix = raw_input()

            for i in range (2):
                if(choix == oui[i]):
                    menu()
                elif(choix == non[i]):
                    return 0

def verif_saisie(liste,saisie):
        i = 0
        lenght = len(liste)-1
        
        for i in range(lenght):
                if liste[i]==saisie:
                        print "Vous avez déjà tenté la lettre",saisie,
                        print "ainsi que les lettres",liste[0:lenght]
                        return False

                
def choixmot():
        
        liste = ["fromage","alambique","casserole","programme","television","logiciel","avion","gourmandise"\
        ,"telechargement","illegalite","instrument","tondeuse","ordinateur","programmation","technologie",\
        "diffusion","estampage","navigation","hasardeux","fondations","artistique","utilisation","imbuvable",\
        "legume","innovation","constitution","iconique","evidence","invitation","cavite","lampadaire","limonade"\
                ,"bouteille","concours","culture","psychologie","cardiologue","pharmaceutique","laboratoire","scolaire"\
                ,"rasoir","medicament","perfusion","pansement","forage","aiguille","costume","danser","contemporain"\
                ,"mondialisation","environnement","ombrelle","vetement","sentiment","congelateur","spatule","chandelier"\
                ,"bateau","commandant","paquerette","coquelicot","robinetterie","armoiries","boutique","fantome","plaisanterie"\
                ,"ironique","electricite","ingenieur","infirmiere","informatique","biologie","citoyennete","chaussette","confiseries"\
                ,"glacier","bistrot","opticien","elegant","aquatique","piscine","romantique","antiquite","automobile","italienne"]

        hasard = random.randint(0,len(liste)-1)
        motchoisi = liste[hasard]
        
        print "\nUn mot a été choisi parmi la base de donnée\n"
        print masque(motchoisi),"(",len(motchoisi),"lettres )"
        
        i = 0
        nbessai = 13

        liste2= []
        lisaisie = []
        
        for i in range(nbessai):
                
                print 'Proposition',i+1,"(",nbessai-i,"essais restants ) :"
                saisie = raw_input()
                                
                if len(saisie)==1:
                        lisaisie.append(saisie)
                        if verif_saisie(lisaisie,saisie) == False:
                                lisaisie.remove(saisie)
                                print "Saisissez une autre lettre"
                                saisie = raw_input()
                                lisaisie.append(saisie)
                                
                
                if len(saisie)==len(motchoisi):
                        if testmot(motchoisi,saisie) == True:
                                print "\nBravo, le mot à trouver est bien",motchoisi
                                break
                else:
                        liste2 = liste2 + test_lettre(saisie,motchoisi)
                        a = masque(motchoisi,liste2)
                        if testmot(motchoisi,a) == True:
                                print "\nBravo, le mot à trouver est bien",a
                                break
                        else:
                                print '\n',a
                
        
        if i == (nbessai-1):    
                print"\nGame Over - Vous avez été pendu !"
                print"Le mot était :",motchoisi
        revenir()
                

def menu():
                
        print'\t\t-- LE PENDU --\n'
        print'1. Jouer'
        print'2. Instructions'
        print'3. Quitter'
                
        saisie = raw_input()
        saisie = int(saisie)
                
        while saisie < 1 or saisie > 3:
                print'Erreur, 1 pour Jouer, 2 pour Quitter'
                saisie = raw_input()
                saisie = int(saisie)
                
        if saisie == 1:
                choixmot()
        elif saisie == 2:
                print "\n\t\t-- Règles du jeu --"
                print "Des mots sont tirés au sort parmi une base de donnée. Seule la première et dernière lettre\
                sont affichées, les autres lettres étant remplacées par des étoiles. Le but du jeu est d'essayer de\
                retrouver le mot. Vous pouvez saisir vos réponses lettres par lettre ou avec l'intégralité du mot.\
                Les majuscules et les caractères spéciaux (accents,...) sont volontairement omis pour plus de facilité.\n"
                menu()
        else:
                return 0
                        
                        
menu()

Conclusion :


Voilà, une bonne amélioration serait de gérer les mots aléatoirement à partir d'un fichier texte.

J'ai fait ce post pour me faire une idée de ma façon de programmer. Critiquez-moi !

A voir également

Ajouter un commentaire

Commentaires

lilington
Messages postés
158
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
12 mars 2009

on est tout a fait sur le meme bord et je pense a 100%. si j'ai parle de POO c'est parceque beaucoup de gens pensent justement et a tord que Classes = etre competent. pourquoi je fais ce commentaire sur cette source? parque l'auteur ecrit je cite: "Ca reste de la programmation linéaire, je n'ai programmé aucune classe." peut être que je comprend mal mais j'ai l'impression que ce message veut dire que quand il sera plus avance il y ajoutera des classes. Bon d'un point de vu pédagogique çà peut être utile de mettre des classes dans des exemples simple mais pour ma part et c'est mon point de vu: les classes ont été créées pour faciliter la vie au programmeur.exemple on peut bien écrire des classes en C mais faut reconnaitre que c'est fastidieux et sources de beugs. Moi personnellement j'en abuse que rarement et je trouve que etre compétent c'est écrire un programme qui plante le point possible avec un code claire (sans blocs sinueux ou ténébreux) et sans étalage de connaissance inutile. sur ceux cette source est bien surtout pour moi qui début python et qui vient de langage comme C. et a part vouloir montrer a d'autres débutants (comme moi) comment on utilise des classes en python je suggère a son auteur de ne pas se prendre la tête a ajouter des classes ou tout autre superflu a son programme.
aera group
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
10
En réalité un programme linéaire est un problème dans lequel intervient des équations linéaires (donc non différentiel : sans dérivé ou intégration) et des contrainte sur les variables. En gros, tous programmes ne contenant pas de classes, d'objets et une simple équation mathématiques (une suite de test) - en fait ça ne concerne que la partie algorithme, les entrées de donnée (raw_input ou input en Python) et même d'une certaine façon les vérifications des données sont difficile à classé du fait que l'on attend l'entrée de l'utilisateur ...

Mais au lieu de s'embêter avec des définitions, je préfère parlé du programme en lui même. Utilisé des objets n'est pas une preuve de compétence ! Ici dans ce programme ça n'a aucun intérêt, le programme n'a pas de réel but en soit si ce n'est divertir de manière simple l'utilisateur ! On pourrait imaginer une classe Jeu qui géré les points du joueur, en vu d'en amélioré la "porté" et pourquoi pas ensuite tenté la gestion du jeu en réseau.

Le fait que le noyau linux soit sans objets m'étonne, mais cela dit, tous langage de haut niveau tel que Python ne peut fonctionner directement avec un micro-processeur, il faut d'abord le compiler en un langage plus simple généralement l'assembleur qui n'a pas de classes ! Une classe peut être convertit (de manière compliquer certes) en un programme classique.

En résumer, utiliser les classes la où ça n'apporte aucun intérêt est tous simplement idiot, ici la source ne demande pas cela (à voir pour de possible améliorations dans le future) !
lilington
Messages postés
158
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
12 mars 2009

le defaut de ton programme c'est vraiment le manque de commentaires.
et je crois sans etre trop sur que tu n'as pas fait de programmation lineaire. je crois que la programmation lineaire c'est quand t'as un main et c'est tout. l'utilisation des fonctions suffit, et je comprend pas pourquoi les gens pensent que programmer sans classes c'est mal, ou que c'est debutant. je rappelle que le noyau linux est programmer sans classes. donc il n'a rien de debutant a faire de la programmation sans classes mais avec des fonctions.
aera group
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
10
Il y a une erreur : lorsque l'on trouve le mot en dernière chance, i = 12. Le résultat affiche "bravo" et ensuite le test suivant trouve que 13-1 = 12 = i et il en déduit à tore que j'ai perdu !
De plus il n'y a pas de vérification réel de l'entrée de l'utilisateur : C'est une bonne chose d'avoir vérifié que l'utilisateur utilise 1, 2 ou 3 dans le menu, mais si je rentre une lettre, ton programme bug quand il faut le transformer en entier autant utilisé input plutôt que raw_input !
De même si j'utilise des majuscules dans les propositions, il ne reconnait pas les caractères.
Voici ce qui aurait été souhaitable :

# -*- coding: cp1252 -*-

import random

def cache(mot,lettre):
"Cacher les lettres inconnues avec nb lettres > 2 "
nb = len(mot)
resultat = ""
for i in range(nb): if i 0 or i nb-1 or mot[i] in lettre:
resultat += mot[i]
else:
resultat += "*"
return resultat

def liste_element(liste,espace=1):
"Créé une liste de carractères des lélément d'une suite"
if len(liste) == 0:
t = "Aucune\n"
else:
t = ""
for i in liste:
t += i + "\n"
if espace: # On passe une ligne ?
return t
else:
return t[:len(t)-1]

def detreminer_mot():
"Renvoie un mot au hazard"
liste = ["fromage","alambique","casserole","programme","television","logiciel","avion","gourmandise"\
,"telechargement","illegalite","instrument","tondeuse","ordinateur","programmation","technologie",\
"diffusion","estampage","navigation","hasardeux","fondations","artistique","utilisation","imbuvable",\
"legume","innovation","constitution","iconique","evidence","invitation","cavite","lampadaire","limonade"\
,"bouteille","concours","culture","psychologie","cardiologue","pharmaceutique","laboratoire","scolaire"\
,"rasoir","medicament","perfusion","pansement","forage","aiguille","costume","danser","contemporain"\
,"mondialisation","environnement","ombrelle","vetement","sentiment","congelateur","spatule","chandelier"\
,"bateau","commandant","paquerette","coquelicot","robinetterie","armoiries","boutique","fantome","plaisanterie"\
,"ironique","electricite","ingenieur","infirmiere","informatique","biologie","citoyennete","chaussette","confiseries"\
,"glacier","bistrot","opticien","elegant","aquatique","piscine","romantique","antiquite","automobile","italienne"]
return liste[random.randint(0,len(liste)-1)]

def lettre_in_mot(mot,lettre):
"Vérifie que tous les carractère d'un mot soit dans une liste"
err = 0
for i in mot:
if i in lettre:
err = 0
else:
err = 1
break
return not(err)

def question(question,rep_possible=[],lettre=[],err="Cette réponse n'était pas attendu"):
"Pose une question à l'utilsateur et vérifie sa réponse"
while 1:
a = raw_input(question + "\n>> ") if (a in rep_possible or rep_possible []) and (lettre_in_mot(a,lettre) or lettre []):
return a
else:
print "\nErreur : " + err + '\n'

def jeu():
"Lance le jeu"
nb_essai = 13
lettre_use = []
mot_use = []
gagne = 0
l=[] # Liste de toute les lettres de l'alphabet sans accent
for i in range(65,91):
l.append(chr(i))
for i in range(97,123):
l.append(chr(i))

print "Début de la séance de jeu"
mot = detreminer_mot()
print "Un mot à été déterminer au hazard\n"

while nb_essai > 0:
print cache(mot,lettre_use) + " (" + str(len(mot)) + " lettres)"
q = "Faites une proposition (" + str(nb_essai) + " essais)"
r = question(q,lettre=l,err="Seules les lettres sans accent sont autorisées")

if len(r)==1 and not(r.lower() in lettre_use):
lettre_use.append(r.lower())
if r.lower() in mot:
print "Lettre trouvée\n"
else:
print "Cette lettre n'appartient pas au mot recherché \n"
nb_essai = nb_essai - 1

elif len(r)==1 and r in lettre_use:
print "Vous avez déja utilisé cette lettre !\nRappel : Lettres déja utilisées :"
print liste_element(lettre_use,0)
print "Rappel : Mots déja proposés :"
print liste_element(mot_use)

elif len(r)>1 and not(r.lower() in mot_use) and r.lower()<>mot:
mot_use.append(r.lower())
print "Ce mot n'est pas le mot recherché\n"
nb_essai = nb_essai - 1

elif len(r)>1 and r.lower()==mot:
gagne = 1
break

elif len(r)>1 and r.lower() in mot_use:
print "Vous avez déja utilisé ce mot !\nRappel : Lettres déja utilisées :"
print liste_element(lettre_use,0)
print "Rappel : Mots déja proposés :"
print liste_element(mot_use)

if gagne:
print "Bravo, vous avez trouvé le bon mot"
else:
print "Domage, vous n'avez pas trouvé le mot qui été : " + mot

print "\n\n Fin de la séance de jeu \n\n\n"
menu()

def menu():
"Menu du jeu"
texte = """\t\t-- LE PENDU --
1. Jouer
2. Instructions
3. Quitter"""

saisie = question(texte,rep_possible=["1","2","3"],err="Les réponses attendu sont 1, 2 ou 3")

if saisie == "1":
print "\n\n"
jeu()
elif saisie == "2":
print """\n\t\t-- Règles du jeu --
Des mots sont tirés au sort parmi une base de donnée. Seule la première et dernière lettre\
sont affichées, les autres lettres étant remplacées par des étoiles. Le but du jeu est d'essayer de\
retrouver le mot. Vous pouvez saisir vos réponses lettres par lettre ou avec l'intégralité du mot.
Les majuscules et les caractères spéciaux (accents,...) sont volontairement omis pour plus de facilité.\n"""
menu()
else:
print "\nAu revoir"

menu()

Je met 6/20 tout de même, vois si tu peux améliorer
cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
259
dommage que le code ne soit pas commenté, l'idée était pourtant bonne

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.