Je ne rentre pas dans un do...while

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

Je ne rentre pas dans un do...while

par Rockleader » 09 Mai 2014, 15:00

Hello,

je ne comprends pas pourquoi mon prog ne rentre pas dans une boucle do...while


C'est d'autant plus étrange que ça fonctionne bien quelques lignes au dessus.

Ce morceau de code là fonctionne comme il faut.

Code: Tout sélectionner
   if(estTigre==1)
   {
/***********************************************si le joueur  est Tigre******************************************************/
   while(nb_chevre_place != NB_CHEVRE)
   {
      //tant que la phase de placemant n'est pas terminé
      affichage_PlateauCurses(P);
      if((action_estVainqueurChevre(P,nb_tour)==FAUX) && (action_estVainqueurTigre(P,nb_tour)==FAUX))
      {
         //S'il n'y a pas un vainqueur la chèvre pose une chèvre
         do {
         posHc=rand()%(TAILLE_PLATEAU_LARGEUR-1);//les positions des chèvres sont aléatoires
         posVc=rand()%(TAILLE_PLATEAU_LONGUEUR-1);
         }while(deplacement_estPlacementValide(P,posHc,posVc)==FAUX);
         printw("Appuyez sur une touche pour passer au prochain tour\n");
         getch();
         action_placerChevre(P,posHc,posVc);
         affichage_PlateauCurses(P);
         //le joueur tigre déplace un tigre
         do{
         printw("%s: Quel tigre voulez vous déplacer selon une position (x,y) :",Tigre.nom);
         printw("("); posHt=getch();printw(",");posVt=getch();printw(")\n");
         posHt=posHt-48;
         posVt=posVt-48;
         }while((posHt= TAILLE_PLATEAU_LARGEUR) || (posVt= TAILLE_PLATEAU_LONGUEUR));

         do{
         printw("%s: Où voulez vous déplacer selon une position (x,y) :",Tigre.nom);
         printw("("); new_posHt=getch();printw(",");new_posVt=getch();printw(")\n");
         new_posHt=new_posHt-48;
         new_posVt=new_posVt-48;
         }while(deplacement_estPlacementValide(P,new_posHt,new_posVt)==FAUX);

         action_deplacer(P,posHt,posVt,new_posHt,new_posVt,&Tigre);
         //getch();
         affichage_PlateauCurses(P);
         nb_tour++;

      }
      else
      {
         //s'il y a un vainqueur on force la sortie de boucle
         nb_chevre_place= NB_CHEVRE;
      }
      clear();
   }
}





Mais en reprenant la même structure, je ne rentre pas dans un do_while.
J'ai identifié ce problème en faisant un affichage qui ne sors pas ne console.
C'est étrange, au début je pensais que cela était dpu à mno rand qui ne devait jamais tapé sur la bonne case et que j'avais juste pas de bol et que je prenais une boucle infini. Mais en fait non vu que l'on a même pas un seul affichage de printw de la boucle.



Code: Tout sélectionner
else
   {
   /************************************************************si le joueur a choisi le role de chèvre***************************************/
      while(nb_chevre_place != NB_CHEVRE)
      {
      //tant que la phase de placemant n'est pas terminé
      int num_case;
      affichage_PlateauCurses(P);
      if((action_estVainqueurChevre(P,nb_tour)==FAUX) && (action_estVainqueurTigre(P,nb_tour)==FAUX))
      {
         //S'il n'y a pas un vainqueur la chèvre pose une chèvre
         do{
         printw("%s: Où voulez vous placer une chèvre selon une position (x,y) :",Chevre.nom);
         printw("("); posHc=getch();printw(",");posVc=getch();printw(")\n");
         posHc=posHc-48;
         posVc=posVc-48;
         }while((posHc= TAILLE_PLATEAU_LARGEUR) || (posVc= TAILLE_PLATEAU_LONGUEUR));
         

         action_placerChevre(P,posHc,posVc);
         affichage_PlateauCurses(P);//a noter qu'ici à l'affichage la chèvre est bien posé, il n'y a donc pas de raison de ne pas entrer dans le do while
         //le joueur tigre déplace un tigre
         [COLOR=Red]do{
         //on tape aléatoirement sur le plateau jusqu'à trouver un tigre
         posHt=rand()%(TAILLE_PLATEAU_LARGEUR-1);
         posVt=rand()%(TAILLE_PLATEAU_LONGUEUR-1);
         num_case=action_posCase(posHt,posVt);
         printw("%d",num_case); //aucun affichage de cette valeur
         }while(P->cases[num_case].value!='T');[/COLOR]

         do{
         //on tape aléatoirement sur le plateau jusqu'à trouver un déplacement possible
         new_posHt=rand()%(TAILLE_PLATEAU_LARGEUR-1);
         new_posVt=rand()%(TAILLE_PLATEAU_LONGUEUR-1);
         num_case=action_posCase(new_posHt,new_posVt);
         }while((deplacement_estDeplacementValideTigre(P,posHt,posVt,new_posHt,new_posVt)==FAUX) || (deplacement_estCaptureChevreValide(P,posHt,posVt,new_posHt,new_posHt)==FAUX));

         action_deplacer(P,posHt,posVt,new_posHt,new_posVt,&Tigre);
         affichage_PlateauCurses(P);
         nb_tour++;

      }
      else
      {
         //s'il y a un vainqueur on force la sortie de boucle
         nb_chevre_place= NB_CHEVRE;
      }
      clear();
      }
   }



J'ai mis en rouge la partie concerné.Auriez vous une idée de ce qui peut me causer ça ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Equasolver
Membre Naturel
Messages: 17
Enregistré le: 09 Mai 2014, 14:34

par Equasolver » 09 Mai 2014, 15:09

Pour qu'il ne rentre pas dans la boucle il faut que
P->cases[num_case].value!='T') ne soit pas respecter.
Tu dois lui faire prendre cette valeur plus tot dans le programme pour qu'il ne passe dans le while.

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 13:25

par Cliffe » 09 Mai 2014, 15:15

Fait des break plutôt que des prints pour voir l'évolution de ton code.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 09 Mai 2014, 15:18

Equasolver a écrit:Pour qu'il ne rentre pas dans la boucle il faut que
P->cases[num_case].value!='T') ne soit pas respecter.
Tu dois lui faire prendre cette valeur plus tot dans le programme pour qu'il ne passe dans le while.



Faux, c'est un do while donc je dois obligatoirement l'exécuter une fois au moins !
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Equasolver
Membre Naturel
Messages: 17
Enregistré le: 09 Mai 2014, 14:34

par Equasolver » 09 Mai 2014, 15:22

Rockleader a écrit:Faux, c'est un do while donc je dois obligatoirement l'exécuter une fois au moins !

Autant pour moi je pensais c'était du C++

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 09 Mai 2014, 16:39

Problème résolu, en réalité j'avais mal identifié le problème, le conseil de ne pas me fier à l'affichage était le bon.

Le printw se faisait sur une fenêtre temporaire que je ne voyais pas mais il s'affichait bien, en réalité mon soucis venait de l'ordre des paramètres dans une fonction sous jacente, j'avais inverser source et destination^^ :ptdr:

Merci pour votre aide :lol3:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 13:25

par Cliffe » 09 Mai 2014, 16:55

Il peux y avoir un décalage entre le moment ou tu fait le print et le moment ou ça s'afficher sur la console.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite