[Résolu] [Programmation C] Boucle while qui pose soucis...

Janot Membre non connecté
-
- Voir le profil du membre Janot
- Inscrit le : 18/02/2007
- Site internet
- Groupes :
-
Fondateur MLO
J'en appelle à vous (en particulier à Dark) car y a un truc que je ne comprends pas dans un de mes programmes en C...
Avant de commencer, je précise que je débute en C. :sarcastic:
Alors voilà j'ai un soucis avec une boucle while. Le but du programme et de réaliser un petit jeu Pierre, Feuille, Ciseaux. L'ordi tire au hasard un nombre correspondant à un des 3 choix. Jusque là pas de soucis.
Le joueur qui gagne remporte 1 euros et dès qu'un joueur atteint 10 euros, le programme est censé s'arrêter.
Et c'est là que se trouve le soucis... Le programme continue, même si l'un des joueurs dépasse 10 euros...
Je comprends pas pourquoi, pourriez-vous me l'expliquer s'il vous plaît??
Précision: Le code source se compile bien sans soucis... :sol:
Voici le code:
[code]/* File: HAYS-JEAN-GABRIEL-simple.c
Auteurs: Jean-Gabriel HAYS
cree le: 08/01/2008*/
#include <stdio>
#include <stdlib>
#include <time>
void choixHumain(long *humain);
void choixOrdi(long *ordi);
void compare(long choixH, long choixO, long *pointeurHumain, long *pointeurOrdi);
int main()
{
long aleatoire = 0;
const long MAX = 3;
long eurosHumain = 0, eurosOrdi = 0;
while (eurosHumain <= 10 || eurosOrdi <= 10)
{
srand(time(NULL)); //Initialisation du générateur de nombres
aleatoire = rand() % MAX; //L'ordinateur génère un nombre compris entre 0 et 2 inclus.
long selection = 0;
printf("Veuillez faire votre choix:n0 = Ciseauxn1 = Pierren2 = PapiernVotre sélection: ");
scanf("%ld", &selection);
choixHumain(&selection);
choixOrdi(&aleatoire);
compare(selection, aleatoire, &eurosHumain, &eurosOrdi);
printf("nVous avez %ld euros et l'ordinateur possède %ld eurosn", eurosHumain, eurosOrdi);
}
return 0;
}
void choixHumain(long *humain)
{
switch (*humain)
{
case 0:
printf("nVous avez choisi les Ciseauxn");
break;
case 1:
printf("nVous avez choisi la Pierren");
break;
case 2:
printf("nVous avez choisi le Papiern");
break;
}
}
void choixOrdi(long *ordi)
{
switch (*ordi)
{
case 0:
printf("nL'ordinateur a choisi les Ciseauxn");
break;
case 1:
printf("nL'ordinateur a choisi la Pierren");
break;
case 2:
printf("nL'ordinateur a choisi le Papiern");
break;
}
}
void compare(long choixH, long choixO, long *pointeurHumain, long *pointeurOrdi)
{
if (choixH == choixO)
{
printf("nEgalité! Personne ne perdnn");
}
/*Cas pour lesquels l'ordinateur gagne*/
if (choixH == 0 && choixO == 1)
{
printf("nLa pierre casse les ciseaux.nVous avez perdu!nn");
*pointeurOrdi += 1;
}
if (choixH == 1 && choixO == 2)
{
printf("nLe papier enveloppe la pierre.nVous avez perdu!nn");
*pointeurOrdi += 1;
}
if (choixH == 2 && choixO == 0)
{
printf("nLe ciseau coupe le papier.nVous avez perdu!nn");
*pointeurOrdi += 1;
}
/*Cas pour lesquels le joueur Humain gagne*/
if (choixH == 1 && choixO == 0)
{
printf("nLa pierre casse les ciseaux.nVous avez gagné!nn");
*pointeurHumain += 1;
}
if (choixH == 2 && choixO == 1)
{
printf("nLe papier enveloppe la pierre.nVous avez gagné!nn");
*pointeurHumain += 1;
}
if (choixH == 0 && choixO == 2)
{
printf("nLe ciseau coupe le papier.nVous avez gagné!nn");
*pointeurHumain += 1;
}
}
[/code]
Édité par Janot Le 09/01/2008 à 17h22

darkvodka Membre non connecté
-
- Voir le profil du membre darkvodka
- Inscrit le : 15/05/2007
- Groupes :
Citation :
Précision: Le code source se compile bien sans soucis... :sol:
Pas chez moi

Bon pas grave, ton problème est simple :
Code :
while (eurosHumain <= 10 || eurosOrdi <= 10)
Si je traduis en français tu as mis :
Tant qu'il y a eurosHumain <= 10 OU qu'il y a eurosOrdis <= 10 je continue la boucle.
Problème c'est pas un OU que tu dois mettre mais un ET!
Car il y en a toujours forcement un des 1 des 2 qui n'a pas atteint les 10€ et donc la condition est toujours vraie et donc la boucle se fait toujours ... en faite toi ta boucle s'arrete quans les 2 ont atteints les 10€
Donc tu dois mettre :
Code :
while (eurosHumain <= 10 && eurosOrdi <= 10)
J'ai pas testé si ça marche mais normallement oui

Va sur Jabber si tu ne comprend pas

Et au faite, c'est pas bien de ne pas préciser la licence dans ton code source ^^

Janot Membre non connecté
-
- Voir le profil du membre Janot
- Inscrit le : 18/02/2007
- Site internet
- Groupes :
-
Fondateur MLO

Mais y a un autre soucis...

Le programme s'arrête quand un joueur a atteint 11€ au lieu de 10

Sinon pour la licence je sais mais comme c'est pour mon prof de prog (qui n'est pas très commode ceci dit en passant...)

Si tu as des conseils à me filer sur ma façon de programmer n'hésite pas (en particulier sur ce qui te semble pas top...)


Janot Membre non connecté
-
- Voir le profil du membre Janot
- Inscrit le : 18/02/2007
- Site internet
- Groupes :
-
Fondateur MLO

Jviens de voir pourquoi... la boucle continue une fois de trop à cause des inférieur/égal <=
Il faut mettre < tout court.


darkvodka Membre non connecté
-
- Voir le profil du membre darkvodka
- Inscrit le : 15/05/2007
- Groupes :

Citation :
Si tu as des conseils à me filer sur ma façon de programmer n'hésite pas (en particulier sur ce qui te semble pas top...) Wink
Ok je regarde de plus près !
Ta fonction compare n'est pas top

Tu met trop de IF ! (trop de tests, donc ça peut-être optimisé ... bon vu le programme ça ne changera rien en soit tu gagnera ptete 1/1000eme de secondes ^^ ... mais c'est plus propre)
SOLUTION :
Tu met des IF pour les conditions ou l'homme gagne et sinon un seul ELSE quand l'ordi gagne
structure :
Code :
IF joueurGagne ELSE IF joueurGagneEncoreParUneAutreMethode ELSE IF joueurGagneEncoreParUnAutreMoyen ELSE c'est l'ordi qui a gagné

Je vais manger ... je regarderais un peu plus ce soir.
En tout cas, ça fait plaisir de pouvoir t'aider

Toi qui aide toujours tout le monde ...


darkvodka Membre non connecté
-
- Voir le profil du membre darkvodka
- Inscrit le : 15/05/2007
- Groupes :

C'est plutôt :
[code]if ...
egalite
else
if
1er façon pour que le joueur gagne
else
if
2eme façon pour que le joureur gagne
else
if
3eme façon
else
l'ordi a gagné[/code]
ça te fait 4 IFs au lieu de 7

Moi par contre du coup je viens de voir que les libc étaient bien installées ... mais que ma variable d'environnement LD_LIBRARY_PATH était vide ... c'est quoi ce bordel


Janot Membre non connecté
-
- Voir le profil du membre Janot
- Inscrit le : 18/02/2007
- Site internet
- Groupes :
-
Fondateur MLO


JackDaniels93 Membre non connecté
-
- Voir le profil du membre JackDaniels93
- Inscrit le : 03/03/2007
- Groupes :
-
Fondateur MLO
Mandriva, ça marche pas .... ça court, ça vole !!

darkvodka Membre non connecté
-
- Voir le profil du membre darkvodka
- Inscrit le : 15/05/2007
- Groupes :

Sinon Janot, pour le reste : "OK"
J'ai rien vu qui m'a choqué ^^

Janot Membre non connecté
-
- Voir le profil du membre Janot
- Inscrit le : 18/02/2007
- Site internet
- Groupes :
-
Fondateur MLO

Continue Jack ça vaut le coup en plus!! C'est super interessant et moi aussi je suis en même temps le tuto du Zéro... Il est vraiment top! (même si je trouve qu'il ne fait pas assez pratiquer...


JackDaniels93 Membre non connecté
-
- Voir le profil du membre JackDaniels93
- Inscrit le : 03/03/2007
- Groupes :
-
Fondateur MLO
Mandriva, ça marche pas .... ça court, ça vole !!

Janot Membre non connecté
-
- Voir le profil du membre Janot
- Inscrit le : 18/02/2007
- Site internet
- Groupes :
-
Fondateur MLO
JackDaniels93 :
Ok, je m'y remet dès ce soir alors !
A bein y a intérêt!!!
On a du code source Linux à modifier!!!


JackDaniels93 Membre non connecté
-
- Voir le profil du membre JackDaniels93
- Inscrit le : 03/03/2007
- Groupes :
-
Fondateur MLO
Janot :
A bein y a intérêt!!!
On a du code source Linux à modifier!!!
JackDaniels93 :
Ok, je m'y remet dès ce soir alors !
A bein y a intérêt!!!
On a du code source Linux à modifier!!!

Oui, c'est ça ! Et la marmotte....

Mandriva, ça marche pas .... ça court, ça vole !!

Janot Membre non connecté
-
- Voir le profil du membre Janot
- Inscrit le : 18/02/2007
- Site internet
- Groupes :
-
Fondateur MLO
Citation :
Oui, c'est ça ! Et la marmotte.... 

Hop! hop! hop! Pas d'histoire... Linus a besoin de prendre des vacances, on va le remplacer pendant son absence...


darkvodka Membre non connecté
-
- Voir le profil du membre darkvodka
- Inscrit le : 15/05/2007
- Groupes :

Ah ba justement je cherchais quelqu'un pour me coder un module noyau pour mon scanner canonscan

Merci Janot et Jack !!!
PS : Vous avez 3 jours !
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie