Problème boucle while en c

Fermé
matthew37 Messages postés 20 Date d'inscription jeudi 9 juin 2011 Statut Membre Dernière intervention 11 juin 2017 - 23 mars 2012 à 16:28
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 27 mars 2012 à 20:58
Bonjour,


J'ai un problème avec mon programme qui sort de la boucle while ((nombre_des!=0)||(tour!=3)) pour la variable tour ainsi que pour la première boucle while.

Est-ce que quelqu'un peut m'aider ?

Merci

#include <stdio.h>
#include <stdlib.h>

int main()
{
/* déclaration de variables */

srand(time(NULL));
int de_1,de_2,de_3,un,deux,quatre,tour,nombre_des,continuer;
char touche;

continuer=1;
while(continuer==1)
{
/* valeurs initiales affectées aux variables */

de_1=de_2=de_3=un=deux=quatre=tour=0;
nombre_des=3;

/* texte d'accueil */

printf("Jeu 421.\n");
printf("Veuillez lancer 3 des.\n");
printf("Vous avez droit a 3 essais.\n");
printf("Appuyez sur n\'importe quelle touche du clavier pour commencer.\n");
printf("Bonne Chance!\n");
getch(); /* attente d'une saisie du clavier */

while ((nombre_des!=0)||(tour!=3))
{
tour=tour+1;
if (tour==2) /* deuxieme tour */
{
printf("\nIl vous reste 2 essais :\n");
}
if (tour==3) /* troisieme tour */
{
printf("\nC'est votre dernier essai!\n");
}
if ((tour==2)||(tour==3))
{
printf("Veuillez lancer %i des.\n",nombre_des);
printf("Appuyez sur n\'importe quelle touche du clavier pour continuer.\n");
getch(); /* attente d'une saisie du clavier */
}

if (nombre_des==1) /* lancer de dés avec 1 dés*/
{
de_1=1+rand()%5; /* génère un nombre aléatoire entre 1 et 6*/
printf("\nVous obtenez %i.\n",de_1);
}
if (nombre_des==2) /* lancer de dés avec 2 dés*/
{
de_1=1+rand()%5;
de_2=1+rand()%5;
printf("\nVous obtenez %i et %i.\n",de_1,de_2);
}
if (nombre_des==3) /* lancer de dés avec 3 dés*/
{
de_1=1+rand()%5;
de_2=1+rand()%5;
de_3=1+rand()%5;
printf("\nVous obtenez %i, %i et %i",de_1,de_2,de_3);
}

/*Déterminer les dés gagnant*/

if(((de_1==4)||(de_2==4)||(de_3==4))&&(quatre==0))
{
quatre=1;
nombre_des=nombre_des-1;
printf("\nBravo, vous avez un 4\n");
}
if(((de_1==2)||(de_2==2)||(de_3==2))&&(deux==0))
{
deux=1;
nombre_des=nombre_des-1;
printf("\nBravo, vous avez un 2\n");
}
if(((de_1==1)||(de_2==1)||(de_3==1))&&(un==0))
{
un=1;
nombre_des=nombre_des-1;
printf("\nBravo, Vous avez un 1\n");
}

}

/* Verdict du jeu */

if(nombre_des==0)
{
printf("\nFELICITATION! Vous avez gagne!!!\n");
}
else
{
printf("\nDOMMAGE! C'est PERDU! GAME OVER!!!\n");
}

/*Intention de recommencer*/

printf("\nVoulez-vous recommencer la partie?\n");
printf("Appuyez sur la touche O si oui, ou bien sur la touche N sinon.\n");
touche = getchar();
if((touche == 'O')||(touche == 'o'))
{
continuer = 1;
}
else
{
continuer = 0;
}
}
printf("Aurevoir!");

return 0;
}




4 réponses

1 : tes des sont a 5 faces ... Rand()/%5 donne un res entre 0 et 4...
2 : ton while est valable tant qu'une des deux expression est vraie (||)

donc même si tu a ton 421 (des ==0) tu continue car tour ! =3.

Il faudrait plutot un && : revois ta logique :
si ta condition d'arret est : 421 ou 3 tours (A|B)
ta condition de poursuite est l'inverse : ~(A|B) -> (~A & ~B)
1
matthew37 Messages postés 20 Date d'inscription jeudi 9 juin 2011 Statut Membre Dernière intervention 11 juin 2017 1
25 mars 2012 à 21:18
merci pour l'info
mais j'ai un autre problème avec le même programme
while (continuer==1) ne s'exécute qu'une seule fois.
est-ce que ça viendrait de l'instruction
touche = getchar();
?

merci
0
matthew37 Messages postés 20 Date d'inscription jeudi 9 juin 2011 Statut Membre Dernière intervention 11 juin 2017 1
27 mars 2012 à 07:46
up
0
matthew37 Messages postés 20 Date d'inscription jeudi 9 juin 2011 Statut Membre Dernière intervention 11 juin 2017 1
27 mars 2012 à 12:45
up+
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
27 mars 2012 à 20:58
Faut dire que ton programme n'est pas simple à lire. Pourrais-tu reposter ton code en tenant compte des remarques données par Sylvanus en le mettant entre des balises "code" (à droite du bouton "souligné"). Et surtout n'oublie pas de mettre de l'indentation. Sinon c'est illisible.
0