[C] Problème de boucle While

Problème de boucle While [C] - C - Programmation

Marsh Posté le 08-01-2008 à 18:32:29    

Salut à tous! Et merci de me filer un coup de main! :wahoo:

 

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 :
  1. /* File: HAYS-JEAN-GABRIEL-simple.c
  2. Auteurs: Jean-Gabriel HAYS
  3. cree le: 08/01/2008*/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. void choixHumain(long *humain);
  8. void choixOrdi(long *ordi);
  9. void compare(long choixH, long choixO, long *pointeurHumain, long *pointeurOrdi);
  10. int main()
  11. {
  12.     long aleatoire = 0;
  13.     const long MAX = 3;
  14.     long eurosHumain = 0, eurosOrdi = 0;
  15.     while (eurosHumain <= 10 || eurosOrdi <= 10)
  16.     {
  17.         srand(time(NULL)); //Initialisation du générateur de nombres
  18.         aleatoire = rand() % MAX; //L'ordinateur génère un nombre compris entre 0 et 2 inclus.
  19.         long selection = 0;
  20.         printf("Veuillez faire votre choix:\n0 = Ciseaux\n1 = Pierre\n2 = Papier\nVotre sélection: " );
  21.         scanf("%ld", &selection);
  22.         choixHumain(&selection);
  23.         choixOrdi(&aleatoire);
  24.         compare(selection, aleatoire, &eurosHumain, &eurosOrdi);
  25.         printf("\nVous avez %ld euros et l'ordinateur possède %ld euros\n", eurosHumain, eurosOrdi);
  26.     }
  27. return 0;
  28. }
  29. void choixHumain(long *humain)
  30. {
  31.     switch (*humain)
  32.     {
  33.         case 0:
  34.         printf("\nVous avez choisi les Ciseaux\n" );
  35.         break;
  36.         case 1:
  37.         printf("\nVous avez choisi la Pierre\n" );
  38.         break;
  39.         case 2:
  40.         printf("\nVous avez choisi le Papier\n" );
  41.         break;
  42.     }
  43. }
  44. void choixOrdi(long *ordi)
  45. {
  46.     switch (*ordi)
  47.     {
  48.         case 0:
  49.         printf("\nL'ordinateur a choisi les Ciseaux\n" );
  50.         break;
  51.         case 1:
  52.         printf("\nL'ordinateur a choisi la Pierre\n" );
  53.         break;
  54.         case 2:
  55.         printf("\nL'ordinateur a choisi le Papier\n" );
  56.         break;
  57.     }
  58. }
  59. void compare(long choixH, long choixO, long *pointeurHumain, long *pointeurOrdi)
  60. {
  61.     if (choixH == choixO)
  62.     {
  63.         printf("\nEgalité! Personne ne perd\n\n" );
  64.     }
  65. /*Cas pour lesquels l'ordinateur gagne*/
  66.     if (choixH == 0 && choixO == 1)
  67.     {
  68.         printf("\nLa pierre casse les ciseaux.\nVous avez perdu!\n\n" );
  69.         *pointeurOrdi += 1;
  70.     }
  71.     if (choixH == 1 && choixO == 2)
  72.     {
  73.         printf("\nLe papier enveloppe la pierre.\nVous avez perdu!\n\n" );
  74.         *pointeurOrdi += 1;
  75.     }
  76.     if (choixH == 2 && choixO == 0)
  77.     {
  78.         printf("\nLe ciseau coupe le papier.\nVous avez perdu!\n\n" );
  79.         *pointeurOrdi += 1;
  80.     }
  81. /*Cas pour lesquels le joueur Humain gagne*/
  82.     if (choixH == 1 && choixO == 0)
  83.     {
  84.         printf("\nLa pierre casse les ciseaux.\nVous avez gagné!\n\n" );
  85.         *pointeurHumain += 1;
  86.     }
  87.     if (choixH == 2 && choixO == 1)
  88.     {
  89.         printf("\nLe papier enveloppe la pierre.\nVous avez gagné!\n\n" );
  90.         *pointeurHumain += 1;
  91.     }
  92.     if (choixH == 0 && choixO == 2)
  93.     {
  94.         printf("\nLe ciseau coupe le papier.\nVous avez gagné!\n\n" );
  95.         *pointeurHumain += 1;
  96.     }
  97. }

Message cité 1 fois
Message édité par janothays le 08-01-2008 à 18:33:52

---------------
http://www.mandrivalinux-online.eu
Reply

Marsh Posté le 08-01-2008 à 18:32:29   

Reply

Marsh Posté le 08-01-2008 à 20:00:28    

unidentified a écrit :

utilise un if ...


 
Bah, ouais, c'est clair que sa boucle va boucler après ça ....
 
Perso, j'aurais plutôt utilisé un && au lieu de || dans le while. Le && voulant dire dans ce contexte : si un des joueurs à 10 pts, alors on dégage.

Message cité 1 fois
Message édité par tpierron le 08-01-2008 à 20:00:42
Reply

Marsh Posté le 08-01-2008 à 20:22:48    

tpierron a écrit :

Perso, j'aurais plutôt utilisé un && au lieu de || dans le while. Le && voulant dire dans ce contexte : si un des joueurs à 10 pts, alors on dégage.


 
+1
Je voudrais juste expliquer la condition telle qu'elle est écrite dans le code pour une meilleure compréhension :

while (eurosHumain <= 10 || eurosOrdi <= 10)


signifie : "tant que eurosHumain <= 10 ou eurosOrdi <= 10, alors boucler"
 
Donc ton while bouclera tant qu'au moins l'un des joueurs aura moins de 10€. Ce qui n'est pas ce que tu veux. Pour la suite de l'explication, lire le post de tpierron.

Reply

Marsh Posté le 08-01-2008 à 21:49:13    

Merci à vous! :hello:  
J'ai compris pourquoi il fallait mettre && plutôt que ||
 
Ça marche niquel... A un détail près, ça allait jusqu'à 11 effectivement. J'ai donc mis:
 

Code :
  1. while (eurosHumain < 10 && eurosOrdi < 10)


 
plutôt que:
 

Code :
  1. while (eurosHumain <= 10 && eurosOrdi <= 10)


---------------
http://www.mandrivalinux-online.eu
Reply

Marsh Posté le 08-01-2008 à 23:28:21    

Une heuristique utile pour ce jeu contre un joueur humain:
- Jouer le coup qui aurait été le coup perdant lors de la partie précédente
 
En effet, des etudes statistiques montrent qu'un joueur humain a tendance a jouer le coup qui l'aurait battu au tour précédent.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-01-2008 à 09:24:55    

Comme ça y'a qu'a jouer le coup qui aurait été le coup gagnant lors de la partie précédente, et on est sûr de gagner :D

Reply

Marsh Posté le 09-01-2008 à 09:51:21    

Non, c'est le coup perdant de la partie precedente qui devient le coup gagnant de la partie suivante (ou plus justement, qui statistiquement, a de plus grandes chances d'être le coup gagnant). Le coup qui aurait été le coup gagnant lors de la partie précédente, c'est ce que va avoir tendance a jouer le joueur humain.
 
 
Apres, quand on veut aller plus loin dans l'heuristique, il faut aussi tenir compte d'une tendance a jouer un peu plus caillou que les deux autres chez les joueurs humains.
L'article d'ou je tire ces infos: http://media.newscientist.com/data [...] 263566.pdf
Quelques liens sur une compet entre programmes jouants l'un contre l'autre décrite dans l'article:
http://cplus.about.com/od/programm [...] lenge1.htm
(le code du vainqueur actuel) http://cplus.about.com/library/dow [...] eleton.cpp
 
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-01-2008 à 11:37:46    

ta notion d'initialisation est assez floue.

Reply

Marsh Posté le 10-01-2008 à 00:02:48    

Taz a écrit :

ta notion d'initialisation est assez floue.


Tu veux dire quoi par là? :heink:

Reply

Marsh Posté le 10-01-2008 à 11:20:32    

Tu initialises la seed de ta fonction aléatoire dans une boucle. Pour peu que tu joues deux fois avant que l'heure ne change (à la seconde près), ton nombre aléatoire sera le même ces deux fois.
 
Tu pourrais donc par exemple sortir ton srand(time(NULL)); de ta boucle while pour éviter ce comportement.

Reply

Marsh Posté le 10-01-2008 à 11:20:32   

Reply

Marsh Posté le 10-01-2008 à 12:50:47    

OK merci, je vais changer ça. ;-)


---------------
http://www.mandrivalinux-online.eu
Reply

Marsh Posté le 11-01-2008 à 17:56:59    

ccp6128 a écrit :

Tu initialises la seed de ta fonction aléatoire dans une boucle. Pour peu que tu joues deux fois avant que l'heure ne change (à la seconde près), ton nombre aléatoire sera le même ces deux fois.
 
Tu pourrais donc par exemple sortir ton srand(time(NULL)); de ta boucle while pour éviter ce comportement.


+1
 
Détails : http://mapage.noos.fr/emdel/notes.htm#rand
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-01-2008 à 17:58:27    

janothays a écrit :


Avant de commencer, je précise que je débute en C.
<...>


C'est plutôt joliment codé pour un débutant...
 
(enfin, à première vue...)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 12-01-2008 à 00:59:50    

unidentified a écrit :

Ouais ... Je dirais même qu'il y a la patte du site du zero là-dedans [:figti]


A cause des 'long' ? Oui, on a ralé, ça devrait changer...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed