IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Jeu le pendu. Je suis censé comprendre la logique du code.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Chômeur professionnel
    Inscrit en
    Novembre 2020
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chômeur professionnel

    Informations forums :
    Inscription : Novembre 2020
    Messages : 122
    Par défaut Jeu le pendu. Je suis censé comprendre la logique du code.
    Yo les gars,

    Chapitre 36 du bouquin. Le mec demande de créer un jeu. J'ai été trop gourmand je suis allé chercher un jeu de pendu dans un autre bouquin. Je galère à mort pour reverse engineer la mécanique du code. Est-ce que c'est vraiment tendu et personne ne pige ou c'est moi qui suis trop débutant encore ? Bien sûr je comprends tous les bouts de code, mais pour reconstituer la logique de l'ensemble je suis largué (surtout la fonction displayboard).
    Bref est ce que c'est normal je pige pas encore, et je dois revoir à la baisse ou ça devrait être basique à ce stade ?
    Edit : Oui le pendu est dessiné chelou quand je copie ici, pourtant avec mon idle python ça ressort net.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    # This module distributes elements randomly.
    import random
     
     
    # This is a constant variable. This is why it is written in uppercase letters.
    # This variable defines the different states of the hangman in a list.
    # There are 7 states, which means the list goes from index 0 to index 6.
    HANGMAN_PICS = ['''
            +---+
                    |
                    |
                    |
                  ===''', '''
            +---+
            0     |
                    |
                    |
                  ===''', '''
            +---+
            0     |
             |     |  
                   |
                 ===''', '''
            +---+
            0     |
           /|      |
                    |
                  ===''', '''
            +---+
            0     |
           /|\    |
                    |
                  ===''', '''
            +---+
            0     |
           /|\    |
           /       |
                  ===''', '''
            +---+
            0     |
           /|\    |
           / \    |
                 ===''']
     
    # This variable defines all the words of the game.
    words = """ant baboon badger bat bear beaver camel cat clam cobra cougar
    coyote crow deer dog donkey duck eagle ferret fox frog goat goose hawk
    lion lizard llama mole monkey moose mouse mule newt otter owl panda
    parrot pigeon python rabbit ram rat raven rhino salmon seal shark sheep
    skunk sloth snake spider stork swan tiger toad trout turkey turtle
    weasel whale wolf wombat zebra""".split() 
     
     
    # This function takes a list of strings passed to it and returns one string from it.
    def getRandomWord(wordList): 
        wordIndex = random.randint(0, len(wordList) - 1) # random.randint stores a random index in "wordIndex"
        return wordList[wordIndex] # "wordList" returns the random index
     
     
    # This function shows the current state of the board, including how much of the secret word the player has guessed so far and the wrong letters the player has guessed.
    def displayBoard(missedLetters, correctLetters, secretWord):
        print(HANGMAN_PICS[len(missedLetters)]) # will be printed the state of the hangman that corresponds to the number of letters missed
        print()
     
        print('Missed letters:', end=' ')
        for letter in missedLetters:
            print(letter, end=' ')
        print()
     
        blanks = '_' * len(secretWord)
     
        for i in range(len(secretWord)): 
            if secretWord[i] in correctLetters:
                blanks = blanks[:i] + secretWord[i] + blanks[i+1:]
     
        for letter in blanks: 
            print(letter, end=' ')
        print()
     
     
    # This function takes a string of letters the player has already guessed and will keep asking the player for a letter that isn’t in "alreadyGuessed".
    def getGuess(alreadyGuessed):
        while True:
            print('Guess a letter.')
            guess = input()
            guess = guess.lower()
            if len(guess) != 1:
                print('Please enter a single letter.')
            elif guess in alreadyGuessed:
                print('You have already guessed that letter. Choose again.')
            elif guess not in 'abcdefghijklmnopqrstuvwxyz':
                print('Please enter a LETTER.')
            else:
                return guess
     
    # This function Asks if the player wants to play another round of Hangman.
    def playAgain():
        print('Do you want to play again? (yes or no)')
        return input().lower().startswith('y')
     
     
    print('H A N G M A N')
    missedLetters = ''
    correctLetters = ''
    secretWord = getRandomWord(words)
    gameIsDone = False
     
     
    while True:
        displayBoard(missedLetters, correctLetters, secretWord)
     
        guess = getGuess(missedLetters + correctLetters)
     
        if guess in secretWord:
            correctLetters = correctLetters + guess
     
            foundAllLetters = True
            for i in range(len(secretWord)):
                if secretWord[i] not in correctLetters:
                    foundAllLetters = False
                    break
            if foundAllLetters:
                print('Yes! The secret word is "' + secretWord + '"! You have won!')
                gameIsDone = True
        else:
            missedLetters = missedLetters + guess
     
        if len(missedLetters) == len(HANGMAN_PICS) - 1:
            displayBoard(missedLetters, correctLetters, secretWord)
            print('You have run out of guesses!\nAfter ' + str(len(missedLetters)) + ' missed guesses and ' + str(len(correctLetters)) + ' correct guesses, the word was ' + secretWord + '')
            gameIsDone = True
     
        if gameIsDone:
            if playAgain():
                missedLetters = ''
                correctLetters = ''
                gameIsDone = False
                secretWord = getRandomWord(words)
            else:
                break

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 744
    Par défaut
    Salut,

    Citation Envoyé par Yuseph Voir le message
    Est-ce que c'est vraiment tendu et personne ne pige ou c'est moi qui suis trop débutant encore ? Bien sûr je comprends tous les bouts de code, mais pour reconstituer la logique de l'ensemble je suis largué
    Si vous n'avez pas réfléchit par vous même "avant" sur comment coder ça, vous n'avez aucune idées des difficultés à résoudre... Et le code que vous avez recopié sera illisible (parce que vous n'avez pas construit de grille de lecture préalable...).

    note: cela est vrai pour tous les codes récupérés sur Internet ou dans des bouquins. Soit on les utilise sans trop comprendre, soit on a un niveau équivalent a ceux qui l'ont écrit (et on peut se mettre dans leur peau pour imaginer différentes solutions et apprécier celle qu'ils ont codé..)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Yuseph Voir le message
    Yo les gars,
    Yo

    Citation Envoyé par Yuseph Voir le message
    Chapitre 36 du bouquin. Le mec demande de créer un jeu. J'ai été trop gourmand je suis allé chercher un jeu de pendu dans un autre bouquin.
    Faute avouée est à moitié pardonnée. Mais reste l'autre moitié...
    Le souci c'est qu'un exercice est fait pour s'exercer. L'auteur du bouquin n'en a rien à cirer de ton code, ce code que tu crées c'est pour former ton cerveau au mécanisme travail à effectuer => décomposition du travail en actions élémentaires => codage de ces actions dans le langage. Par exemple pour trouver "babar", il faut seulement trouver "b", "a" et "r". Il faut donc un mécanisme qui, à partir de "babar", récupère juste les lettres distinctes. C'est en devant résoudre le souci que tu trouves les astuces qui te resteront. Si tu récupères un code ben ok t'as le code mais tu n'as pas les réflexes et lorsque tu auras un vrai boulot de prog tu resteras sec.

    Maintenant si tu veux juste examiner un code peut-être un peu plus simple (sans tous ces dessins pas vraiment utiles pour l'algo)...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #!/usr/bin/env python3
    # coding: utf-8
     
    # Modules Python
    import string								# Gestion de chaines
     
    # Jeu de pendu
    def pendu(mot, *, chance=10, hard=False):
    	# Fonction d'affichage du mot masqué
    	def masque():
    		# Suffit de n'afficher que les lettres proposées
    		return "".join(l if l in propose else "*" for l in mot)
    	# masque()
     
    	# La liste des lettres proposées
    	propose=set()
     
    	# Boucle de jeu
    	mot=mot.lower()
    	trouve=None
    	while trouve is None:
    		# Affichage du mot masqué (sauf pour les lettres proposées présentes dans le mot)
    		print("Mot à trouver: [%s] (chances=%d)" % (masque(), chance))
     
    		# Choix du joueur
    		print("Lettres jouées (%d): [%s]" % (len(propose), ", ".join(sorted(propose))))
    		reste=set(string.ascii_lowercase) - propose
    		print("Lettres restantes (%d): [%s]" % (len(reste), " ".join(sorted(reste))))
    		essai=input(
    			"Entrez un mot (%d chances restantes) - Chaque lettre du mot comptera pour un essai: " % chance
    		).lower()
     
    		# Traitement des lettres proposées
    		for l in essai:
    			if l not in string.ascii_lowercase:
    				print("Lettre [%s] doit être choisie parmi [%s], non traitée" % (
    					l,
    					string.ascii_lowercase),
    				)
    				continue
    			# if
     
    			# Si la lettre a déjà été proposée
    			if l in propose:
    				# Si on n'est pas en mode hard, elle ne compte pas
    				if not hard:
    					print("Lettre [%s] déjà jouée, non traitée" % l)
    					continue
    				# if
     
    				# En mode hard elle compte
    				print("Lettre [%s] déjà jouée, tant pis pour vous" % l)
    			# if
     
    			# La lettre choisie est mémorisée
    			propose.add(l)
     
    			# Analyse lettre
    			if l not in mot:
    				chance-=1
    				print("Lettre [%s] pas présente => [%s] (chance=%d)" % (l, masque(), chance))
    				if chance <= 0:
    					trouve=False
    					break
    				# if
    			else:
    				print("Lettre [%s] ok => [%s]" % (l, masque()))
    			# if
     
    			# Si le mot est trouvé (s'il ne reste plus rien après avoir ôté les propositions)
    			if (set(mot) - propose) == set():
    				trouve=True
    				break
    			# if
    		# while
    	# while
     
    	# Résultat
    	print(
    		("Vous avez gagné, le mot était bien [%s]" if trouve else "Perdu, le mot était [%s]") % mot
    	)
    # pendu()
     
    if __name__ == "__main__":
    	import sys
     
    	param=dict()
    	if len(sys.argv) > 2: param["chance"]=int(sys.argv[2])
    	if len(sys.argv) > 3 and sys.argv[3] == "hard": param["hard"]=True
     
    	pendu(sys.argv[1], **param)
    # if

    Citation Envoyé par Yuseph Voir le message
    Je galère à mort pour reverse engineer la mécanique du code. Est-ce que c'est vraiment tendu et personne ne pige ou c'est moi qui suis trop débutant encore ?
    Bah, c'est pas un code super compliqué. Une boucle de choix de lettres, si la lettre est dans le mot on l'affiche sinon on la place dans la liste des lettres jouées et on affiche le dessin peu à peu.
    Et à la fin on repose la question. Accessoirement l'auteur de ce code n'est pas une super flèche en Python. Déjà par exemple dans la boucle pour vérifier si le mot a été trouvé, le flag "foundAllLetters" est totalement inutile si on connait le else d'une boucle (qui n'est activé que si on n'a pas quitté la boucle). Ce qui donne
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i in range(len(secretWord)):
    	if secretWord[i] not in correctLetters: break
    else:
    	print('Yes! The secret word is "' + secretWord + '"! You have won!')
    	gameIsDone = True

    Et la façon de recommencer le jeu est vraiment à chier avec ce else: break idiot !!!
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if gameIsDone
    	if not playAgain(): break
    	missedLetters = ''
    	correctLetters = ''
    	gameIsDone = False
    	secretWord = getRandomWord(words)

    Citation Envoyé par Yuseph Voir le message
    Bien sûr je comprends tous les bouts de code, mais pour reconstituer la logique de l'ensemble je suis largué (surtout la fonction displayboard).
    Bah elle affiche le dessin n° "nombre de lettres ratées". Tu as remarqué que tous les dessins sont en fait stockés dans une liste (alors qu'un tuple suffit !!!) donc si on a raté 5 lettres c'est qu'on a raté 5 fois donc on affiche alors le dessin[5]
    Et ensuite elle affiche le mot secret en remplaçant les tirets par les lettres éventuellement déjà trouvées.

    Citation Envoyé par Yuseph Voir le message
    Edit : Oui le pendu est dessiné chelou quand je copie ici, pourtant avec mon idle python ça ressort net.
    Peut-être un souci de tabulations. C'est pas l'essentiel.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre actif
    Homme Profil pro
    Chômeur professionnel
    Inscrit en
    Novembre 2020
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chômeur professionnel

    Informations forums :
    Inscription : Novembre 2020
    Messages : 122
    Par défaut
    Vous êtes des bons les gars. je vois que la frontière entre junior et senior est très marquée.

  5. #5
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Pour lire un code en diagonale et en comprendre le fonctionnement il faut être en capacité de reconnaitre les briques de sa construction et voir ce qu'elles construisent.
    Cette capacité s'acquière via l'expérience: Je comprends ton pendu car mon cerveau reconnait les briques qui le composent et en saisie le sens pour s'y être un jour confronté

    Sans cela, il est nécessaire d'avoir une lecture active du code: étudier l'évolution du code avec des print(), éventuellement faire des recherches sur un outil que l'on ne maîtrise pas, voir comment le code se comporte dans telle ou telle situation... et toujours garder une vue d'ensemble, s'interroger sur les intentions de l'auteur, sur ce que le code construit (au-delà du détail)...

    Suite à cela j'ajouterais que si l'on veut faire sien un code, vraiment l'assimiler pour qu'il fasse partit de notre culture, il faut être capable suite à son étude de pourvoir le refaire (sans visionner la copie originelle)...

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Pour lire un code en diagonale...
    Pour lire un code en diagonale faut déjà pouvoir le lire à la verticale...

    Sinon j'en profite pour dire que j'ai modifié le code posté hier. Maintenant au lieu de proposer lettre par lettre, on peut lui donner directement toute une suite de lettres à évaluer. Il les évalue alors l'une après l'autre (déjà que jouer seul c'est pas marrant mais en plus devoir proposer lettre par lettre ça me gonflait !!!)

    Citation Envoyé par Yuseph Voir le message
    je vois que la frontière entre junior et senior est très marquée.
    Absolument pas. Il n'y qu'un effort minimum à faire pour arriver à se dépatouiller avec ce genre de code, à savoir lire un tutoriel (sous-entendu "le lire attentivement", depuis la première page, en faisant les exercices qui y sont demandés ou en tapant les exemples qui y sont présentés et regarder le résultat).
    Ok donc l'effort est minimum mais quand-même bien réel. Par exemple tu commences par parler du chapitre 36. As-tu lu les 35 précédents? As-tu fait les exercices proposés et/ou tapé les exemples montrés?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En diagonale??? Déjà qu'il n'arrive pas à le lire en verticale !!!
    Dans tous les cas, un code ne se lit pas à l'horizontal*, couché dans son lit ...

    *Je dis ça pour la blague. Perso j'aime bien cette position, surtout quand elle est partagée

Discussions similaires

  1. comprendre le jeu du pendu
    Par mateo_3 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/07/2010, 13h56
  2. Jeu Bonhomme pendu
    Par yinyann86 dans le forum Delphi
    Réponses: 11
    Dernier message: 14/11/2006, 17h03
  3. Le jeu du pendu.
    Par giggs dans le forum C
    Réponses: 5
    Dernier message: 31/10/2006, 13h40
  4. jeu du pendu
    Par krachik dans le forum Langage
    Réponses: 5
    Dernier message: 24/10/2006, 12h48
  5. Réponses: 4
    Dernier message: 24/03/2006, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo