Problème de sortie d'une boucle while

jubar35 Messages postés 2 Date d'inscription vendredi 17 avril 2015 Statut Membre Dernière intervention 17 avril 2015 - 17 avril 2015 à 11:21
jubar35 Messages postés 2 Date d'inscription vendredi 17 avril 2015 Statut Membre Dernière intervention 17 avril 2015 - 17 avril 2015 à 13:21
Bonjour,
Etant étudiante en Mathématiques Appliquées, je dois réaliser un travail
sur la programmation du jeu des Tours de Hanoï en Python.

___Rappel du jeu des Tours de Hanoï___
Le casse-tête est constitué de trois tours où la tour de gauche est remplie de tous les disques classés par ordre de décroissants. Cette tour est la tour de départ. Le but est de replacer, dans le même ordre, tous ces disques sur la tour de gauche, dite la tour d'arrivée tout en respectant les règles qui suivent :

1) Il faut déplacer qu'un seul disque à la fois.
2) Il ne faut pas placer un disque plus large au dessus d'un plus petit.
______________________________________________________


J'ai donc fait mon code, qui tourne tant que la tour d'arrivé n'est pas remplie.
De plus, je voudrais que l'utilisateur puisse sortir du jeu à tout moment,
donc j'ai rajouter une condition "et tant que sortie==False".
Seulement, la deuxième condition ne marche pas, je n'arrives pas à sortir de la boucle while...

Je pense que le problème est dû au fait que j'ai deux boucle while imbriquées l'une dans l'autre, mais je ne voit pas comment faire autrement...

Si quelqu'un aurait une idée, elle serait la bienvenue.
Merci d'avance.

___Fonction utilisées dans le code___

saisie_verifiee : saisie d'un nombre.

choix_menu : l'utilisateur choisi le mode jeu, le mode démo ou quitter. Ici, l'utilisateur a choisi le mode jeu.

nb_disque : saisie du nombre de disque pour jouer.

saisie_tour : saisie de la tour que le choisie pour prendre un disque, ou pour mettre un disque

dernier_disque : retourne la taille du dernier disque d'une tour
_______________________________________________________


def jeu():
   cpt=0
   A,B,C,TF=[],[],[],[]
   n=nb_disque()
   for i in range(n,0,-1):
      A=A+[i]
      TF=TF+[i]
   if n!=0:
      print("\n",A,B,C)
   sortie=False

   
   while C!=TF and sortie==False:
      
      Dep=[]
      while len(Dep)==0:
         RepDep=saisie_tour("prendre un")
         if RepDep in ["S","s"]:
            sortie=True
            break
     
         
         elif RepDep in ["A","a"]:
            Dep=A
         elif RepDep in ["B","b"]:
            Dep=B
         elif RepDep in ["C","c"]:
            Dep=C
         if len(Dep)==0:
            print("\nIl n'y a aucun disque à prendre dans cette tour!")
            RepDep=saisie_tour("prendre un")
         
   
      RepArr=saisie_tour("mettre le")
      while RepArr==RepDep:
         print("\nCe déplacement est inutile, recommencez!")
         RepArr=saisie_tour("mettre le")
      if RepArr in ["S","s"]:
         sortie=True
         break
     
      elif RepArr in ["A","a"]:
          Arr=A
      elif RepArr in ["B","b"]:
         Arr=B
      elif RepArr in ["C","c"]:
         Arr=C

      if len(Arr)!=0:
         dArr=dernier_disque(Arr)
      else :
         dArr=n+1
      dDep=dernier_disque(Dep)
   
      if dDep>dArr:
         print("\nCe déplacement n'est pas possible! Le disque est trop grand!")
      else :
         Arr.append(Dep.pop())
         cpt=cpt+1
         print("\nDéplacement du disque ",dDep," sur la tour ",RepArr.upper()) 
         print(A,B,C)
   if C==TF:
      print("\nBravo, vous avez gagné!!!")
     
   if sortie==True:
      print("\nVous avez quitté le jeu !")

1 réponse

Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018 7
Modifié par Mints le 17/04/2015 à 12:46
Salut, si on répond 's' ou 'S' dans la boucle while len(Dep)==0 qui demande la tour de départ, alors RepDep vaudra 's' ou 'S' ce qui nous fera sortir de cette boucle par le break certes mais pas de la boucle principale.Le programme passera alors à la seconde question RepArr=saisie_tour("mettre le"), et si à cette question on répond aussi 's' ou 'S'(la même réponse que la première question en fait), on rentre dans la seconde boucle dont on ne sortira jamais si on répond le même 's' que la première question.
Pour éviter cela on doit poser la question si et seulement si la réponse à la première est différente de 's' ou 'S',auquel cas puisque C est different de TF et sortie est vraie on sortira de la boucle principale.Et si RepDep est différent de 's' ou 'S' et que l'on tappe 's' ou 'S' en tour d'arrivée alors le break qui suit nous fera sortir de la boucle principale.
Je te donne pas la solution je pense que tu as compris la ligne à rajouter.

--
0
jubar35 Messages postés 2 Date d'inscription vendredi 17 avril 2015 Statut Membre Dernière intervention 17 avril 2015
17 avril 2015 à 13:21
Merci beaucoup!!!!
=D
0
Rejoignez-nous