Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu du lievre et de la tortue

Sujet résolu
    17 décembre 2017 à 14:37:04

    Bonjour, j'aide actuellement ma sœur a ses devoirs et elle doit utiliser python pour étudier les probabilités.

    Il nous est demandé de faire le programme permettant de faire 1000 fois l'essai de la course et d'obtenir les résultats.

    J'ai donc effectué ce programme :

    # -*- coding: utf-8 -*-
    
    import os
    from random import ranint as entierAleatoire
    
    l = 0
    t = 0
    i = 0
    
    	while i > 1000 :
    		i += 1
    		
    		def lancer_le_de() :
    			
    			return entierAleatoire(1,6)
    			
    		def jouer(point) :
    		
    			de = lancer_le_de()
    			point+=1
    			if de == 6 : l+=1
    			elif point == 6 : t+=1
    			else : return jouer(point)
    			
    print("La Tortue a gagné", t, "fois")
    
    os.system("pause")



    Malheureusement cela ne m'affiche que 0 pour la tortue, j'ai essayé diverses methodes et ai vu selon les infos que j'ai recupere une erreur d'identation que je ne trouve pas ou du moins n'arrive pas a resoudre

    Merci de votre aide 

    -
    Edité par AlexiPoure 17 décembre 2017 à 14:37:39

    • Partager sur Facebook
    • Partager sur Twitter
      17 décembre 2017 à 15:59:20

      Il y a trop de problèmes dans ton code:

      • La définition des fonctions (lignes 13 à 23) n'a aucune raison de se trouver au milieu du code (en plus en plein cœur d'une boucle). C'est à mettre en début de fichier.
      • D'ailleurs la fonction lance_le_de n'a aucune utilité. Autant utiliser directement randint(1, 6).
      • Et la fonction jouer à l'air d'être le cœur du programme. Donc encore une fois, il n'y a pas d'intérêt à mettre le code dans une fonction.
      • Si tu sais le nombre d'itération que tu vas effectuer, autant utiliser la boucle for plutôt qu'une boucle while (qui force en plus à gérer une variable)
      • Pour des raisons de clarté du code, on met les blocs d'instructions sur plusieurs lignes et non sur une seule (lignes 21 à 23)
      • Ça ne présente aucun intérêt de renommer la fonction randint (ligne 4). Autant garder son vrai nom, ce qui est plus parlant pour tout le monde.
      • Il vaut mieux lancer ton programme à partir d'un terminal (ainsi tu pourra facilement voir les print et les éventuels erreurs), mai si tu veux continuer en double-cliquant, il vaut mieux remplacer le os.system par un simple input() (ou raw_input() dans une v2 de python).
      • Pour finir, autant nommer explicitement tes variables (plutôt que l, t et i). On gagnera encore en lisibilité.
      # -*- coding: utf-8 -*-
      
      
      from random import randint
      
      
      lievre = 0
      tortue = 0
      
      
      for _ in range(1000):
          de = randint(1, 6)
          #
          #J'ai pas compris la logique du reste du code
          #
      
        
      print("La Tortue a gagné", tortue, "fois")
      input()  #ou raw_input en v2
      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
        17 décembre 2017 à 16:13:41

        Le code vient de l’énoncé de l'exercice et j'avoue que je ne le comprend pas, le principe est de dire que l'on lance un dé, si l'on obtient un 6 alors le lièvre gagne, mais si l'on obtient un autre chiffre, la tortue avance de 1, lorsque la tortue arrive a 6, elle gagne, je ne suis pas très bon en python et avoue être perdu dans le code a effectuer
        • Partager sur Facebook
        • Partager sur Twitter
          17 décembre 2017 à 16:37:21

          AlexiPoure a écrit:

          Le code vient de l’énoncé de l'exercice


          T'es sûr? Car en l'état le code est même complètement faux:

          • Addition de variables globale dans la fonction (lignes 21 et 22), ce qui renverra forcément une erreur
          • La récursivité se trouve uniquement au niveau du else donc le code va pas produire le résultat escompté
          • Partager sur Facebook
          • Partager sur Twitter
          Précepte: Le mieux est l'ennemi du bien
            17 décembre 2017 à 16:42:51

            Oui oui je suis sure, quoiqu'il en soit je me retrouve coincé, 

            la seul différence avec l'original étant qu'en ligne 22  et 23 j'avais un return "lievre" et un return "tortue" en lieu et place des l+=1 et t+=1 que j'ai justement remplacé pour pouvoir avoir un compte global des reussites de chacun, aurai-je fait une erreur ?

            • Partager sur Facebook
            • Partager sur Twitter
              17 décembre 2017 à 16:52:54

              AlexiPoure a écrit:

              aurai-je fait une erreur?


              Bah oui :o


              AlexiPoure a écrit:

              Oui oui je suis sure


              Donc non, ce n'est pas le même code (puisque tu l'as modifié) :-°

              Met le code initial stp.

              • Partager sur Facebook
              • Partager sur Twitter
              Précepte: Le mieux est l'ennemi du bien
                17 décembre 2017 à 17:00:06

                # -*- coding: utf-8 -*-
                
                """ Le lievre et la tortue """
                
                from random import randint as entierAleatoire
                
                def lancer_le_de() :
                
                	"""
                	Fonction qui simule le lancer
                	d'un dé et renvoie la valeur du dé.
                	"""
                	return entierAleatoire(1,6)
                	
                def jouer(point)
                
                	"""
                	Fonction qui simule le jeu
                	du lievre et de la tortue.
                	"""
                	de = lancer_le_de()
                	point+=1
                	if de == 6 : return"lievre"
                	elif point == 6 : return "tortue"
                	else : return jouer(point)
                	
                pointTortue = 0
                
                print(jouer(pointTortue))

                Voila l'original, mon objectif et de m'arranger pour savoir sur milles essais, combien de fois le lievre gagne et combien de fois la tortue gagne 

                Desole du coup si je suis un peu con :x

                • Partager sur Facebook
                • Partager sur Twitter
                  17 décembre 2017 à 17:28:53

                  Ok, c'est beaucoup mieux ;)

                  Les 25 premières lignes ne vont pas changer. Elles correspondent à la création des deux fonctions.

                  La boucle est à créer au niveau de la ligne 27. Pour la construire, il suffit de comprendre ce que renvoie la fonction. D'où l'intérêt de la dernière ligne (le print de la ligne 29). Qu'est-ce que tu obtiens? Et si tu relances le code une deuxième fois, qu'obtiens-tu? Une troisième? Une quatrième?

                  Bref, si tu lances plusieurs fois ce code (sans rien modifié pour l'instant) tu vas comprendre l'utilité de la fonction jouer. Et c'est uniquement à cette condition-là que tu vas pouvoir construire ta boucle pour comptabiliser les victoires de la tortue ;)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Précepte: Le mieux est l'ennemi du bien
                    17 décembre 2017 à 17:32:50

                    j'avais compris l'utilité de la fonction, mais etant un gros noob en python je suppose que je dois creer une boucle pour le lancer 1000 fois, mais je ne sais absolument pas comment comptabiliser mes resultats, les modifications que j'avais faites etait a mon sens un moyen de comptabiliser, donc je devrai rajouter 2 variable avec l'une augmentant de 1 lorsque la tortue gagne et l'une augmentant de 1 lorsque le lievre gagne, malheureusement pour moi c'est beaucoup trop de logique pour ma petite tete et je suis completement perdu o_O
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 décembre 2017 à 17:41:29

                      Oui, c'est exactement ça. Il suffit d'initialiser deux variables à 0 qui vont comptabiliser le nombre de victoire de chaque animal.

                      Ensuite, il suffit de lancer 1000 fois la fonction jouer, qui renvoie à chaque fois le vainqueur: "lievre" ou "tortue". Il ne reste plus qu'à faire une comparaison pour attribuer la victoire à qui de droit:

                      #Initialisation des variables
                      score_tortue = 0
                      score_lievre = 0
                      
                      #Boucle
                      for _ in range(1000):
                          #remise à zéro des points de la tortue à chaque nouvelle course
                          pointTortue = 0
                      
                          #On récupère le nom du vainqueur et on attribut le point au gagnant
                          vainqueur = jouer(pointTortue)
                          if vainqueur == "lievre":
                              score_lievre += 1
                          else:
                              score_tortue += 1
                      
                      
                      print("Score tortue:", score_tortue)
                      print("Score lievre:", score_lievre)
                      print("total:", score_tortue + score_lievre)

                      -
                      Edité par Olygrim 17 décembre 2017 à 17:42:34

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Précepte: Le mieux est l'ennemi du bien
                        17 décembre 2017 à 17:48:09

                        Ok, j'ai donc essayé de mettre tout ça comme ceci 

                        # -*- coding: utf-8 -*-
                        
                        """ Le lievre et la tortue """
                        
                        from random import randint as entierAleatoire
                        
                        score_tortue = 0
                        score_lievre = 0
                        
                        for _ in range(1000):
                        	
                        	pointTortue = 0
                        	
                        	def lancer_le_de() :
                        
                        		"""
                        		Fonction qui simule le lancer
                        		d'un dé et renvoie la valeur du dé.
                        		"""
                        		return entierAleatoire(1,6)
                        	
                        		def jouer(point)
                        
                        		"""
                        		Fonction qui simule le jeu
                        		du lievre et de la tortue.
                        		"""
                        		de = lancer_le_de()
                        		point+=1
                        		if de == 6 : return"lievre"
                        		elif point == 6 : return "tortue"
                        		else : return jouer(point)
                        	
                        		print(jouer(pointTortue))
                        
                        		vainqueur = jouer(pointTortue)
                            	if vainqueur == "lievre":
                                	score_lievre += 1
                            	else:
                                	score_tortue += 1
                         
                        print("Score tortue:", score_tortue)
                        print("Score lievre:", score_lievre)
                        print("total:", score_tortue + score_lievre)
                        
                        print(jouer(pointTortue))
                        
                        input()
                        

                        Mais ma fenetre se ferme automatiquement, je n'arrive donc pas a voir si cela fonctionne 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 décembre 2017 à 18:01:34

                          Comme dit précédemment, le début du code n'est pas à modifier (ou à déplacer). Donc la création de la fonction n'est pas du tout à mettre à l'intérieur de la boucle. Il ne faut pas confondre la création d'une fonction (qui ne se fait qu'une seule fois et en général en début de code) avec l'utilisation de la fonction (qui peut se faire autant de fois que souhaité).

                          Bref, le code que je t'ai donné est à mettre directement à la suite des fonctions. Autrement dit, remplacer les lignes 25 à 27 par ce code.

                          AlexiPoure a écrit:

                          Mais ma fenetre se ferme automatiquement, je n'arrive donc pas a voir si cela fonctionne 


                          C'est pour ça qu'il ne faut pas double-cliquer sur le fichier mais le lancer à partir d'une console (comme dit dans mon premier message), car sinon tu ne peux pas voir les messages d'erreurs (ce qui est FONDAMENTAL pour pouvoir débuger ton programme). Ici, tu as une erreur au niveau de la fonction jouer où il manque les deux petits points (au niveau de l'entête):

                          #          |
                          #          |   
                          #          v
                          def jouer():
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Précepte: Le mieux est l'ennemi du bien
                            17 décembre 2017 à 18:11:16

                            # -*- coding: utf-8 -*-
                             
                            """ Le lievre et la tortue """
                             
                            from random import randint as entierAleatoire
                             
                            def lancer_le_de() :
                             
                                """
                                Fonction qui simule le lancer
                                d'un dé et renvoie la valeur du dé.
                                """
                                return entierAleatoire(1,6)
                                 
                            def jouer(point) :
                             
                                """
                                Fonction qui simule le jeu
                                du lievre et de la tortue.
                                """
                                de = lancer_le_de()
                                point+=1
                                if de == 6 : return"lievre"
                                elif point == 6 : return "tortue"
                                else : return jouer(point)
                            	
                            score_tortue = 0
                            score_lievre = 0
                            
                            for _ in range(1000):
                                
                                pointTortue = 0
                                vainqueur = jouer(pointTortue)
                                if vainqueur == "lievre":
                                    score_lievre += 1
                                else:
                                    score_tortue += 1
                             
                             
                            print("Score tortue:", score_tortue)
                            print("Score lievre:", score_lievre)
                            print("total:", score_tortue + score_lievre)
                             
                            print(jouer(pointTortue))
                            
                            input()
                            Ok j'ai donc ça, ça ne fonctionne pas et je vois dans le terminal une erreur me parlant d'une erreur de syntax a def jouer(point) : en ligne 15 avec une petite fleche sur le f de def et d'autres erreur en dessous me parlant de Identation error sur beaucoup de ligne avec file"<stdin>", line 1

                            -
                            Edité par AlexiPoure 17 décembre 2017 à 18:11:45

                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 décembre 2017 à 18:23:22

                              Chez moi ton code fonctionne :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Précepte: Le mieux est l'ennemi du bien
                                17 décembre 2017 à 18:24:45

                                Je suis sur la dernière version, cela peut il avoir un impact ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 décembre 2017 à 18:27:33

                                  Non je ne pense pas. Vérifie bien que tu as fermé toutes les parenthèses, que tu as mis les deux petits points sur chaque entête et que tu as bien respecté l'indentation, car en l'état ton code est bon ;)

                                  PS: Par contre la ligne 44 n'est plus utile (elle servait juste à te montrer ce que renvoyait la fonction).

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Précepte: Le mieux est l'ennemi du bien
                                    17 décembre 2017 à 18:32:59

                                    Soucis réglé le problème était les indentations

                                    Merci beaucoup de ton aide

                                    -
                                    Edité par AlexiPoure 17 décembre 2017 à 18:37:47

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      23 mai 2019 à 8:29:02

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

                                      """ Le lievre et la tortue """

                                      from random import randint as entierAleatoire

                                      def lancer_le_de() :

                                          """
                                          Fonction qui simule le lancer
                                          d'un dé et renvoie la valeur du dé.
                                          """
                                          return entierAleatoire(1,6)

                                      def jouer(point) :

                                          """
                                          Fonction qui simule le jeu
                                          du lievre et de la tortue.
                                          """
                                          de = lancer_le_de()
                                          point+=1
                                          if de == 6 : return"lievre"
                                          elif point == 6 : return "tortue"
                                          else : return jouer(point)

                                      score_tortue = 0
                                      score_lievre = 0

                                      for _ in range(5):

                                          pointTortue = 0
                                          vainqueur = jouer(pointTortue)
                                          if vainqueur == "lievre":
                                              score_lievre += 1
                                          else:
                                              score_tortue += 1


                                      print("Score tortue:", score_tortue)
                                      print("Score lievre:", score_lievre)
                                      print("total:", score_tortue + score_lievre)

                                      print(jouer(pointTortue))

                                      input()
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 avril 2020 à 13:13:39

                                        Bonjour j'ai un problème le "else" ne fonctionne pas s'il vous plait aidez moi!!!

                                        from random import*
                                        def COURSE() :
                                          l=0
                                          de=0
                                          while de<6 and l<6:
                                            de=randint(1,6)
                                            if de!=6:
                                              l=l+1
                                              print (de)
                                              if de==6:
                                                gagnant='lievre'
                                                else:
                                                  gagnant= 'tortue'
                                                  return(gagnant)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          27 avril 2020 à 17:44:32

                                          Bonjour,

                                          Il faut indenter le else au même niveau que le if correspondant. Et chaque bloc doit être indenté de façon logique, en remontant d'un cran quand on sort d'un bloc (ça concerne donc le second if et le return).

                                          Aussi, « ne fonctionne pas » ça ne veut rien dire. else fonctionne très bien, c'est ton utilisation qui en est mauvaise, et Python produit normalement une erreur pour te l'expliquer.

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Jeu du lievre et de la tortue

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown