Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle infini dans mon morpion

    3 juillet 2010 à 15:10:43

    Bonjour à tous.

    J'ai eu l'idée de coder un morpion pour m'entrainer un peu. (vu que je suis un gros débutant en python :p ). Mais voilà... J'ai un problème que je n'ai pas réussi à régler. (ni en regardant le code ni avec le shell) Une boucle infinie. o_O Je vous donne mon code :
    # -*-coding:Latin-1 -*
    
    import os
    from random import randrange
    
    def afficherTableau(carre):
    	print(""" 
    	 _____ _____ _____
    	|     |     |     |
    	|  {0}  |  {1}  |  {2}  |
    	|_____|_____|_____|
    	|     |     |     |
    	|  {3}  |  {4}  |  {5}  |
    	|_____|_____|_____|
    	|     |     |     |
    	|  {6}  |  {7}  |  {8}  |
    	|_____|_____|_____|
    	""".format(carre[0], carre[1], carre[2], carre[3], carre[4], carre[5], carre[6], carre[7], carre[8],))
    
    gagne = 0
    carre = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    case = -1
    joueurCommence = randrange(1, 3)
    print("Joueur 1, quel est votre pseudo ?")
    nomJoueur1 = input()
    print("Joueur 2, quel est votre pseudo ?")
    nomJoueur2 = input()
    print("{0}, vous jouez avec les 'o'. {1}, vous jouez avec les 'x'".format(nomJoueur1, nomJoueur2))
    
    while gagne != 1:
    	afficherTableau(carre)
    	if joueurCommence == 1:
    		while case < 1 or case > 9:
    			print("{0}, où voulez vous mettre votre 'o' ? ".format(nomJoueur1))
    			case = input()
    			try:
    				case = int(case)
    			except:
    				print("Cette case n'éxiste pas")
    				case == -1
    				continue
    			
    			if case < 1:
    				print("Le nombre choisi est inférieur à 1")
    			elif case > 9:
    				print("Le nombre choisi est supérieur à 9")
    		case -1
    		carre[case] = 'o'
    		joueurCommence = 2
    	
    	if joueurCommence == 2:
    		while case < 1 or case > 9:
    			print("{0}, où voulez vous mettre votre 'x' ? ".format(nomJoueur2))
    			case = input()
    			try:
    				case = int(case)
    			except:
    				print("Cette case n'éxiste pas")
    				case == -1
    				continue
    			
    			if case < 1:
    				print("Le nombre choisi est inférieur à 1")
    			elif case > 9:
    				print("Le nombre choisi est supérieur à 9")
    		case -1
    		carre[case] = 'x'
    		joueurCommence = 1
    os.system("pause")
    

    C'est comme si la variable joueurCommence disparaissait au deuxième tour de boucle de ma boucle principale...

    J'espère que vous m'aiderez à trouver où est le problème. Merci d'avance. :)

    [Edit] : excusez moi, c'était une faute toute bête. Je suis surement trop habitué au c :p
    • Partager sur Facebook
    • Partager sur Twitter
      3 juillet 2010 à 16:05:06

      On constate quand même que les lignes 32-49 et 51-68 se ressemblent plus que de raison.
      • Partager sur Facebook
      • Partager sur Twitter
        3 juillet 2010 à 18:36:18

        Je ré ouvre ce topic car j'ai un autre problème et impossible d'en voir la cause... Je vous donne mon code actuel:
        # -*-coding:Latin-1 -*
        
        import os
        from random import randrange
        
        def afficherTableau(carre): #fonction qui affiche le tableau du morpion avec en argument donné une liste
        	print(""" 
        	 _____ _____ _____
        	|     |     |     |
        	|  {0}  |  {1}  |  {2}  |
        	|_____|_____|_____|
        	|     |     |     |
        	|  {3}  |  {4}  |  {5}  |
        	|_____|_____|_____|
        	|     |     |     |
        	|  {6}  |  {7}  |  {8}  |
        	|_____|_____|_____|
        	""".format(carre[0], carre[1], carre[2], carre[3], carre[4], carre[5], carre[6], carre[7], carre[8],))
        
        #variables qui ne peuvent être définies après
        gagne = 0
        carre = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        case = -1
        rejouer = 1
        joueurCommence = randrange(1, 3) #défini quel joueur va commencer
        print("Joueur 1, quel est votre pseudo ?")
        nomJoueur1 = input()
        print("Joueur 2, quel est votre pseudo ?")
        nomJoueur2 = input()
        print("{0}, vous jouez avec les 'o'. {1}, vous jouez avec les 'x'".format(nomJoueur1, nomJoueur2))
        
        while gagne != 1: #boucle principale du jeu
        	afficherTableau(carre) 
        	rejouer = 1 #pour pouvoir jouer... 
        	while rejouer == 1: #si l'utilisateur à rentrer un mauvais chiffre, il retournera ici
        		if joueurCommence == 1:
        			while case < 1 or case > 9:
        				print("{0}, où voulez vous mettre votre 'o' ? ".format(nomJoueur1))
        				case = input()
        				try:
        					case = int(case)
        				except:
        					print("Cette case n'éxiste pas")
        					case == -1
        					continue
        				
        				if case < 1:
        					print("Le nombre choisi est inférieur à 1")
        				elif case > 9:
        					print("Le nombre choisi est supérieur à 9")
        			case -= 1 #si on ne décrémente pas la variable, si on rentre 5, ça vérifira la case 6 
        			if carre[case] == 'o' or carre[case] == 'x': #si elle est déjà remplie d'un x ou d'un o
        				print("Déjà joué !")
        				rejouer = 1 #permet de retourner au début de la boucle actuelle
        				joueurCommence = 1 #on s'assure que c'est bien le même joueur qui va recommencer
        			else:
        				carre[case] = 'o' #on rempli la case correspondante
        				rejouer = 0  #pour retourner à la boucle principale et afficher le tableau
        				joueurCommence = 2 #on change de joueur
        		
        		elif joueurCommence == 2: #idem que le if d'avant
        			while case < 1 or case > 9:
        				print("{0}, où voulez vous mettre votre 'x' ? ".format(nomJoueur2))
        				case = input()
        				try:
        					case = int(case)
        				except:
        					print("Cette case n'éxiste pas")
        					case == -1
        					continue
        				
        				if case < 1:
        					print("Le nombre choisi est inférieur à 1")
        				elif case > 9:
        					print("Le nombre choisi est supérieur à 9")
        			case -= 1
        			if carre[case] == 'o' or carre[case] == 'x':
        				print("Déjà joué !")
        				rejouer = 1
        				joueurCommence = 2
        			else:
        				carre[case] = 'x'
        				rejouer = 0
        				joueurCommence = 1
        		#maintenant on teste si il y a un vainqueur...
        		if carre[0] == carre[1] and carre[0] == carre[2]: #première ligne horizontale
        			if joueurCommence == 1:
        				print("{0} a gagner !".format(nomJoueur1))
        			else:
        				print("{0} a gagner !".format(nomJoueur2))
        			gagne == 1
        		if carre[3] == carre[4] and carre[3] == carre[5]: #deuxième ligne horizontale
        			if joueurCommence == 1:
        				print("{0} a gagner !".format(nomJoueur1))
        			else:
        				print("{0} a gagner !".format(nomJoueur2))
        			gagne == 1
        		if carre[6] == carre[7] and carre[6] == carre[8]: #troisième ligne horizontale
        			if joueurCommence == 1:
        				print("{0} a gagner !".format(nomJoueur1))
        			else:
        				print("{0} a gagner !".format(nomJoueur2))
        			gagne == 1
        		if carre[0] == carre[3] and carre[0] == carre[6]: #première ligne verticale
        			if joueurCommence == 1:
        				print("{0} a gagner !".format(nomJoueur1))
        			else:
        				print("{0} a gagner !".format(nomJoueur2))
        			gagne == 1
        		if carre[1] == carre[4] and carre[1] == carre[7]: #deuxième ligne verticale
        			if joueurCommence == 1:
        				print("{0} a gagner !".format(nomJoueur1))
        			else:
        				print("{0} a gagner !".format(nomJoueur2))
        			gagne == 1
        		if carre[2] == carre[5] and carre[2] == carre[8]: #troisième ligne verticale
        			if joueurCommence == 1:
        				print("{0} a gagner !".format(nomJoueur1))
        			else:
        				print("{0} a gagner !".format(nomJoueur2))
        			gagne == 1
        		if carre[0] == carre[4] and carre[0] == carre[8]: #ligne diagonale à la forme d'un \
        			if joueurCommence == 1:
        				print("{0} a gagner !".format(nomJoueur1))
        			else:
        				print("{0} a gagner !".format(nomJoueur2))
        			gagne == 1
        		if carre[2] == carre[4] and carre[2] == carre[6]: #ligne diagonale à la forme d'un /
        			if joueurCommence == 1:
        				print("{0} a gagner !".format(nomJoueur1))
        			else:
        				print("{0} a gagner !".format(nomJoueur2))
        			gagne == 1
        			
        os.system("pause")
        

        Il me donne des résultats... bizarres... Voyez plutôt une partie :
        joueur 1, quel est votre pseudo ?
        1
        Joueur 2, quel est votre pseudo ?
        2
        (là il m'affiche la grille, je vais pas m'amuser à la recopier... :p )
        1, où voulez-vous mettre votre 'o' ?
        1
        (là il me le met bien au 1)
        (on recommence la même chose avec '2' mais les x)
        (et là il me réaffiche la grille normale avec le x là où il le faut mais...)
        Déjà joué !
        1, où voulez-vous mettre votre 'o' ?
        3
        (la même chose qu'avant, grille normale mais cette fois deux fois "Déjà joué !)
        (des fois il me met des 'o' ou des 'x' à des places que je n'ai pas dit...)
        (etc... jusqu'à un cas de victoire, et là c'est... spécial...)
        Déjà joué !
        1 a gagner !
        1 a gagner !
        (il me répète ça pendant 4 fois... et il me recommence une partie... ce qui n'est pas normal...)

        Merci d'avance parce que là je trouve pas. o_O
        • Partager sur Facebook
        • Partager sur Twitter
          3 juillet 2010 à 18:53:01

          1) case = -1 à l'entrée de ta boucle rejouer while rejouer == 1:

          2) Ton code est follement laid, répétitif, inefficace. Evite de démultiplier tes lignes de codes sans savoir exactement ce que tu veux faire et comment tu compte le faire.
          • Partager sur Facebook
          • Partager sur Twitter
            3 juillet 2010 à 19:05:04

            1) Ah bon ? Je le voit pas, même dans l'ancien code il n'y est pas donc... j'aimerais que tu me montre, peut-être je me trompes. :)

            2)Euh, comment je le rends plus "esthétique" ? :D
            • Partager sur Facebook
            • Partager sur Twitter
              3 juillet 2010 à 19:15:46

              1) Il faut que tu le rajoute pour le réinitialiser à chaque nouveau tour de boucle.
              Dans l'état actuelle des choses cette réinitialisation se fait avec ton case-=1 jusqu'à ce que case ne soit plus valide. C'est pour que Déjà joué s'affiche plusieurs fois : case prends toutes les valeurs précédentes jusqu'à atteindre 0 pour que tu puisses rejoué.
              Et comme toutes les cases précédentes ont déjà été jouée, le messages est affiché autant de fois qu'il y a de cases avant.

              2) Commence par éviter de te répéter, je vais te donner un exemple en prenant ton code comme base.
              • Partager sur Facebook
              • Partager sur Twitter
                3 juillet 2010 à 19:25:39

                1)Oui effectivement, une fois que tu les dis, je comprends mieux. :) J'ai aussi rajouter quelque changement dans mon code tel que rejouer = 1 à la suite des gagner = 1 (dont j'ai enlever le ==) dans les if de test de victoire.

                2)Quand tu dis "plus esthétique", a part d'éviter de ce répéter, c'est l'aérer par exemple ?
                • Partager sur Facebook
                • Partager sur Twitter
                  3 juillet 2010 à 20:44:54

                  Tiens par exemple, j'ai essayé de simplifier ton code pour le rendre plus agréable (même si au final j'ai supprimé pas mal du tiens):

                  # -*-coding:Latin-1 -*
                  import os
                  from random import randrange
                  
                  def afficherTableau(carre): 
                  	print(""" 
                  	 _____ _____ _____
                  	|     |     |     |
                  	|  {0}  |  {1}  |  {2}  |
                  	|_____|_____|_____|
                  	|     |     |     |
                  	|  {3}  |  {4}  |  {5}  |
                  	|_____|_____|_____|
                  	|     |     |     |
                  	|  {6}  |  {7}  |  {8}  |
                  	|_____|_____|_____|
                  	""".format(carre[0], carre[1], carre[2], carre[3], carre[4], carre[5], carre[6], carre[7], carre[8],))
                          # c'est moche mais on n'a pas la choix avec format je crois
                  def jouer(joueur):
                  	symbole = 'o' if joueur == 1 else 'x'
                  	while True:		
                  		print("{0}, où voulez vous mettre votre '{1}' ? ".format(joueur,symbole))
                  		case = input()
                  		try:
                  			case = int(case)-1
                  		except:
                  			print("Cette case n'existe pas")            
                  			continue                
                  		if not (8>= case >=0) :
                  			print("Le nombre choisi est en dehors des limites")      
                  		elif carre[case] == 'o' or carre[case] == 'x': 
                  			print("Déjà joué !")             
                  		else:
                  			carre[case] = symbole
                  			gg(symbole,joueur)
                  			break
                  
                  def gg(symbole,joueur):    
                      for i in xrange(3):     #On vérifie s'il y a une position longitudinale gagnante
                          if carre[i] == carre[i+3] == carre[i+6] == symbole or\
                             carre[3*i] == carre[3*i+1] == carre[3*i+2] == symbole:
                                  raise Exception ("Joueur %d a gagné !" % joueur)
                      if carre[0] == carre[4] == carre[8] == symbole or\ #Diagonales
                         carre[2] == carre[4] == carre[6] == symbole:
                          raise Exception ("Joueur %d a gagné !" % joueur)
                      nulle = True
                      for e in carre:                     #On vérifie qu'il reste au 
                          nulle = nulle and (str(e) in "xo") # moins une position jouable
                      if nulle: raise Exception ("Partie nulle !")
                      
                          
                  
                  carre = [1, 2, 3, 4, 5, 6, 7, 8, 9]
                  tourDe = randrange(1, 3) #défini quel joueur va commencer
                  nomJoueur =[1,2] # On remplace juste après les numéros par des noms.
                  for i in nomJoueur:
                      print("Joueur %d, quel est votre pseudo ?") % i
                      nomJoueur[i-1] = raw_input()
                  print("{0}, vous jouez avec les 'o'. {1}, vous jouez avec les 'x'".format(nomJoueur[0], nomJoueur[1]))
                  
                  while True:
                  	afficherTableau(carre)
                  	try:
                  		jouer(tourDe)
                  		tourDe = -tourDe + 3 # avec 2 donne 1 et avec 1 donne 2
                  	except Exception ,msg: #On aurait du créer notre propre exception
                  		print (msg)         #mais on peut à la limite faire comme ça puisque
                  		afficherTableau(carre)  #on est sûr qu'il n'y en aura pas d'autre
                  		break
                  	
                  os.system("pause")
                  


                  Avec ça tu as de nombreux exemples de constructions que tu aurais pu simplifié, de la façon d'utiliser des fonctions pour éviter de se répéter et ne pas avoir trop d'imbrications comme dans ton code de abse:

                  while truc:
                      if bidule:
                          try:
                              try:
                                  while machin:
                                      if #etc
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 juillet 2010 à 21:08:22

                    Perso je ne trouves pas ton code pas trop "esthétique", quand je voit ça, je n'ai pas trop envie de le lire... Mais merci quand même. ;)

                    J'aurais juste une dernière question : est-ce qu'on peut mettre des couleurs dans la console en python ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      3 juillet 2010 à 22:05:26

                      C'est pas simple de mettre des couleurs dans la console (du moins sous windows). Mieux vaut utilisé IDLE ou un editeur avec colorisation syntaxique (ex: notepad++).

                      EMC1: Je crois que Ushiua utilise Python3... Et dans cette version la syntaxe de l'instruction except à un peu changée :
                      # Python 2.x
                      except Exception, message_erreur:
                          print(message_erreur)
                      
                      # Python 3.x
                      except Exception as message_erreur:
                          print(message_erreur)
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 juillet 2010 à 0:05:59

                        Citation : LeYan'tibus

                        C'est pas simple de mettre des couleurs dans la console (du moins sous windows). Mieux vaut utilisé IDLE ou un editeur avec colorisation syntaxique (ex: notepad++).

                        EMC1: Je crois que Ushiua utilise Python3... Et dans cette version la syntaxe de l'instruction except à un peu changée :

                        # Python 2.x
                        except Exception, message_erreur:
                            print(message_erreur)
                        
                        # Python 3.x
                        except Exception as message_erreur:
                            print(message_erreur)
                        

                        Effectivement j'utilise Python 3.x... Mais euh ce que je veux, ce n'est pas e la coloration syntaxique... Non c'est juste pour colorer les o (en bleu par exemple) et les x (en rouge par exemple) parce que sinon on y voit... rien. :D
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          4 juillet 2010 à 0:26:09

                          Autant pour moi :honte: !

                          Parcontre le problème reste relativement le même, vu que ça se passe dans la console, il faudra trouver les commandes Batch qui te permettront de le faire ! Elles doivent surement exister, mais je ne les connais pas, désolé :'( !
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Boucle infini dans mon morpion

                          × 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