Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
2023 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Problème de boucle While

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Problème de boucle While

n°1667919
janothays
Posté le 08-01-2008 à 18:32:29  profilanswer
 

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
mood
Publicité
Posté le 08-01-2008 à 18:32:29  profilanswer
 

n°1667963
tpierron
Posté le 08-01-2008 à 20:00:28  profilanswer
 

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
n°1667968
Elmoricq
Modérateur
Posté le 08-01-2008 à 20:22:48  profilanswer
 

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.

n°1668002
janothays
Posté le 08-01-2008 à 21:49:13  profilanswer
 

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
n°1668061
gilou
Modérateur
Modzilla
Posté le 08-01-2008 à 23:28:21  profilanswer
 

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é!  --
n°1668151
matafan
Posté le 09-01-2008 à 09:24:55  profilanswer
 

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

n°1668158
gilou
Modérateur
Modzilla
Posté le 09-01-2008 à 09:51:21  profilanswer
 

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é!  --
n°1668222
Taz
bisounours-codeur
Posté le 09-01-2008 à 11:37:46  profilanswer
 

ta notion d'initialisation est assez floue.

n°1668638
janothays
Posté le 10-01-2008 à 00:02:48  profilanswer
 

Taz a écrit :

ta notion d'initialisation est assez floue.


Tu veux dire quoi par là? :heink:

n°1668743
ccp6128
Syntax error
Posté le 10-01-2008 à 11:20:32  profilanswer
 

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.

mood
Publicité
Posté le 10-01-2008 à 11:20:32  profilanswer
 

n°1668821
janothays
Posté le 10-01-2008 à 12:50:47  profilanswer
 

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


---------------
http://www.mandrivalinux-online.eu
n°1669853
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-01-2008 à 17:56:59  profilanswer
 

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/
n°1669855
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-01-2008 à 17:58:27  profilanswer
 

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/
n°1669998
Emmanuel D​elahaye
C is a sharp tool
Posté le 12-01-2008 à 00:59:50  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Problème de boucle While

 

Sujets relatifs
probleme URL Rewriting[VBA-Access]Problème format dans une zone de texte
problème avec time.hproblème avec les std iterator
[résolu]probleme de chaine vide non détectéeBorland probleme instalation
[C] probleme de fichiersProbleme de type incompatible
Débutant, petit problémeC#/SOAP/PHP5 Probleme webservice
Plus de sujets relatifs à : [C] Problème de boucle While


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR