[c] 1er joueur Niquel 2nd ... en boucle :/

1er joueur Niquel 2nd ... en boucle :/ [c] - C - Programmation

Marsh Posté le 24-05-2010 à 23:23:06    

Bonsoir,
 
Alors voila  j'ai effectué un petit jeu de hasard avec Choix mode deux joueurs et choix de niveaux.
Bon avec Un seul joueur ca va niquel j'arrive a revenir au choix de départ une fois le jeux fini mais en mode deux joueurs .... Ca reviens pas et je comprends pas.
Les boucles sont strictements pareil seul la variable "max" change selon les niveau!!
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5.     int Nombre1 = 0, Nombre2 = 0, nombreMysteres = 0, nombreJoueur= 0;
  6.     int compteur1 = 0, compteur2 = 0, max = 0, niveau = 0;
  7.     const int MIN = 0;
  8.    
  9.    
  10.    
  11.    
  12.    
  13. while (nombreJoueur == 0 || nombreJoueur == 3){   
  14.     printf ("Selectionnez le nombre de joueur 1 ou 2!" );
  15.     scanf ("%d", &nombreJoueur);
  16.     printf ("\n\n\n selectionnez le niveau : \n 0-100\n0-1000\n0-10000\n" );
  17.     scanf ("%d", &niveau);
  18. while (nombreJoueur == 1 && niveau == 1)
  19.    
  20. {
  21.      max = 100;
  22.      srand(time(NULL));
  23.     nombreMysteres = (rand() % (max - MIN + 1)) + MIN; 
  24.    
  25.     do{
  26.                    
  27.    
  28.       printf ("entrer un nombre!" );
  29.       scanf ("%d", &Nombre1);
  30.      
  31.          compteur1++;
  32.        
  33.             if (Nombre1 < nombreMysteres)
  34.             {
  35.                         printf("\nTrop petit!\n\n" );
  36.             }
  37.             else if (Nombre1 > nombreMysteres)
  38.             {
  39.                  printf ("\nNombre trop grand!\n\n" );
  40.             }
  41.             else
  42.             {
  43.                 printf ("Bravo\n. Vous avez réussi en %d coups, voulez vous rejouer? \n", compteur1);
  44.                scanf ("%d", &nombreJoueur);
  45.             }
  46.          }while (nombreMysteres != Nombre1);
  47.          
  48.  
  49. }
  50. while (nombreJoueur == 1 && niveau == 2)
  51.    
  52. {
  53.      max = 1000;
  54.      srand(time(NULL));
  55.     nombreMysteres = (rand() % (max - MIN + 1)) + MIN; 
  56.     do{
  57.       printf ("entrer un nombre!" );
  58.       scanf ("%d", &Nombre1);
  59.      
  60.          compteur1++;
  61.        
  62.             if (Nombre1 < nombreMysteres)
  63.             {
  64.                         printf("\nTrop petit!\n\n" );
  65.             }
  66.             else if (Nombre1 > nombreMysteres)
  67.             {
  68.                  printf ("\nNombre trop grand!\n\n" );
  69.             }
  70.             else
  71.             {
  72.                 printf ("Bravo\n. Vous avez réussi en %d coups, voulez vous rejouer?\n ", compteur1);
  73.                 scanf ("%d", &nombreJoueur);
  74.             }
  75.          }while (nombreMysteres != Nombre1);
  76.        
  77. }
  78. while (nombreJoueur == 1 && niveau == 3)
  79.    
  80. {
  81.      max = 10000;
  82.      srand(time(NULL));
  83.     nombreMysteres = (rand() % (max - MIN + 1)) + MIN; 
  84.     do{
  85.                    
  86.    
  87.       printf ("entrer un nombre!" );
  88.       scanf ("%d", &Nombre1);
  89.      
  90.          compteur1++;
  91.        
  92.             if (Nombre1 < nombreMysteres)
  93.             {
  94.                         printf("\nTrop petit!\n\n" );
  95.             }
  96.             else if (Nombre1 > nombreMysteres)
  97.             {
  98.                  printf ("\nNombre trop grand!\n\n" );
  99.             }
  100.             else
  101.             {
  102.                 printf ("Bravo\n. Vous avez réussi en %d coups, voulez vous rejouer? \n", compteur1);
  103.                 scanf ("%d", &nombreJoueur);
  104.             }
  105.          }while (nombreMysteres != Nombre1);
  106.        
  107. }
  108. while (nombreJoueur == 2 && niveau == 1)
  109. {
  110.         max = 100;
  111.       srand(time(NULL));
  112.       nombreMysteres = (rand() % (max - MIN + 1)) + MIN;
  113.       do{
  114.        printf ("entrer un nombre!" );
  115.       scanf ("%d", &Nombre1);
  116.      
  117.      
  118.             if (Nombre1 < nombreMysteres)
  119.             {
  120.                         printf("\nTrop petit!\n\n" );
  121.             }
  122.             else if (Nombre1 > nombreMysteres)
  123.             {
  124.                  printf ("\nNombre trop grand!\n\n" );
  125.             }
  126.             else
  127.             {
  128.                 printf ("Bravo!!!" );
  129.                      scanf ("%d", &nombreJoueur);     
  130.             }
  131.             compteur1++;
  132.            
  133.        printf ("entrer un nombre! JOUEUR 2 " );
  134.       scanf ("%d", &Nombre2);
  135.      
  136.             if (Nombre2 < nombreMysteres)
  137.             {
  138.                         printf("\nTrop petit!\n\n" );
  139.             }
  140.             else if (Nombre2 > nombreMysteres)
  141.             {
  142.                  printf ("\nNombre trop grand!\n\n" );
  143.             }
  144.             else
  145.             {
  146.                 printf ("Bravo\n. \n\n" );
  147.                       printf ("Voulez vous rejouer?" );
  148.        scanf ("%d", &nombreJoueur);
  149.                    
  150.             }
  151.      
  152.          
  153.        
  154.       }while (Nombre1  != nombreMysteres || Nombre2 != nombreMysteres);
  155.      
  156.      
  157.      
  158. }
  159. while (nombreJoueur == 2 && niveau == 2)
  160. {
  161.         max = 1000;
  162.       srand(time(NULL));
  163.       nombreMysteres = (rand() % (max - MIN + 1)) + MIN;
  164.      
  165.       do{
  166.        printf ("entrer un nombre!" );
  167.       scanf ("%d", &Nombre1);
  168.      
  169.      
  170.             if (Nombre1 < nombreMysteres)
  171.             {
  172.                         printf("\nTrop petit!\n\n" );
  173.             }
  174.             else if (Nombre1 > nombreMysteres)
  175.             {
  176.                  printf ("\nNombre trop grand!\n\n" );
  177.             }
  178.             else
  179.             {
  180.                 printf ("Bravo\n. voulez vous rejouer?" );
  181.                 scanf ("%d", &nombreJoueur);
  182.             }
  183.            
  184.        printf ("entrer un nombre! JOUEUR 2 " );
  185.       scanf ("%d", &Nombre2);
  186.      
  187.             if (Nombre2 < nombreMysteres)
  188.             {
  189.                         printf("\nTrop petit!\n\n" );
  190.             }
  191.             else if (Nombre2 > nombreMysteres)
  192.             {
  193.                  printf ("\nNombre trop grand!\n\n" );
  194.             }
  195.             else
  196.             {
  197.                 printf ("Bravo\n. voulez vous rejouer?" );
  198.              scanf ("%d", &nombreJoueur);
  199.             }
  200.          
  201.       }while (Nombre1 != nombreMysteres || Nombre2 != nombreMysteres );
  202.      
  203. }
  204. while (nombreJoueur == 2 && niveau == 3)
  205. {
  206.         max = 10000;
  207.       srand(time(NULL));
  208.       nombreMysteres = (rand() % (max - MIN + 1)) + MIN;
  209.       do{
  210.                    
  211.        printf ("entrer un nombre!" );
  212.       scanf ("%d", &Nombre1);
  213.      
  214.      
  215.             if (Nombre1 < nombreMysteres)
  216.             {
  217.                         printf("\nTrop petit!\n\n" );
  218.             }
  219.             else if (Nombre1 > nombreMysteres)
  220.             {
  221.                  printf ("\nNombre trop grand!\n\n" );
  222.             }
  223.             else
  224.             {
  225.                 printf ("Bravo\n. voulez vous rejouer?\n\n" );
  226.                 scanf ("%d", &nombreJoueur);
  227.             }
  228.            
  229.        printf ("entrer un nombre! JOUEUR 2 " );
  230.       scanf ("%d", &Nombre2);
  231.      
  232.             if (Nombre2 < nombreMysteres)
  233.             {
  234.                         printf("\nTrop petit!\n\n" );
  235.             }
  236.             else if (Nombre2 > nombreMysteres)
  237.             {
  238.                  printf ("\nNombre trop grand!\n\n" );
  239.             }
  240.             else
  241.             {
  242.                 printf ("Bravo\n. voulez vous rejouer?\n\n" );
  243.                 scanf ("%d", &nombreJoueur);
  244.             }
  245.       }while (Nombre1 != nombreMysteres || Nombre2 != nombreMysteres);
  246.      
  247. }
  248. }
  249.   system ("PAUSE" );
  250.   return 0;
  251. }


 
 
PS en plus  je l'avais déjà fais XD le problème c'est que le code source est rester sur un autre disque dur ... donc j'ai voulu le refaire  (je ne l'ai pas fait de la même facon mais le résultat est le meme) et la ben je bloque car en mode 2 joueurs ca veux pas revenir :/  
 
Merci a vous !!
 
PPS: si aussi vous pensez que je peux le faire en plus condensé dites le moi svp ! j'accepte toutes les critiques^^

Reply

Marsh Posté le 24-05-2010 à 23:23:06   

Reply

Marsh Posté le 24-05-2010 à 23:25:51    

Au juste je ne l'ai pas encore totalement terminé !!! ^^ mais ce problème m'enerve en plus je pense que je l'avais déjà eu la première fois ou je l'avais fait ::

Reply

Marsh Posté le 25-05-2010 à 00:35:14    

Remplaces ton test par: (Nombre1 != nombreMysteres && Nombre2 != nombreMysteres) car la, ton test ne s'arrête que quand nombre1 et nombre2 sont égaux au nombre mystère.
A+,


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

Marsh Posté le 25-05-2010 à 09:28:12    

MERCI gilou effectivement ca marche, j'avais déjà testé  mais j'avais fermer la boucle du sommaire trop tot donc cela ne marcher pas.  
 
Par contre ce que je ne comprends pas c'est justement pourquoi cela marche avec && ( qui pour moi veux dire qu'il faut que les nomnbre 1 et 2 soit égaux aux nombres mystere pour sortir de la boucle.
alors qu'avec || je comprends qu'il faut ou que le nombre 1 soir egal au nombre mystere pour sortir de la boucle ou le nombre 2 ce qui me semblais plus logique :/  
 
Quelqu'un pourrais m'expliquer car à ce que je vois j'ai compris de travers !!xd

Reply

Marsh Posté le 25-05-2010 à 11:11:19    

Avec le || tu effectues la boucle tant que Nombre1 est différent de NombreMystere OU Nombre2 est différent de NombreMystere.
 
Si Nombre1 est égal à NombreMystere et Nombre2 est différent de nombre mystere on a la condition qui devient ( Nombre1 != nombreMystere (FAUX) || Nombre2 != nombreMystere (VRAI) donc ta condition est toujours respectée => la boucle continue
 
Avec le && le raisonnement serait : tu veux continuer la boucle tant que Nombre1 et Nombre2 sont différent du NombreMystere
 
[EDIT] En fait mentalement on a tendance a faire l'inverse :

  • On souhaite arrêter la boucle de jeu quand un des deux nombre est égal au nombre mystère donc condition ||
  • Au niveau du code c'est l'inverse, c'est en fait la condition selon laquelle on continue la boucle et non pas on l'arrête


Dur dur à expliquer clairement, je sais pas si c'est compréhensible :D


Message édité par skurlat le 25-05-2010 à 11:15:54
Reply

Marsh Posté le 25-05-2010 à 12:01:43    

aaaaaaaaa Oui effectivement je n'ai pas compris à la première lecture mais en réfléchissant un petit peu j'ai compris ^^
d'accord Merci pour cette petite explication tout s'éclaircit ^^
 
PS: j'ai une autre demande concernant un autre programme , je n'irai pas jusqu'à la mais pour effectivement une division et avoir le nombreexact je veux dire par la que 10/3 = 3.33 et non 3.000
donc voila je vous donne une ébauche du programme:
 

Code :
  1. while (choix == 4)
  2.       {
  3.              printf ("Veuillez entrer votre Premier Nombre!" );
  4.             scanf ("%d", &nombre1);
  5.             printf ("\nVeuillez entrer le Second Nombre!" );
  6.             scanf ("%d", &nombre2);
  7.            
  8.              res = N1 / N2;
  9.             printf ("\n\n Le résultat est %f !", res);
  10.             printf ("Voulez vous effectuer une autre opération ? (1-2-3-4)" );
  11.             scanf ("%d", &choix);
  12.       }


sachant que res est de type double  
N1 et N2 de type int!!
 
et si je met N1 et N2 en type double .... ca me sort de l'hexa xd
je sais que la Division modulo donne le reste c'est a dire 1 mais .... je sais qu'il y à une solution XD lol

Reply

Marsh Posté le 25-05-2010 à 14:50:05    

swixmix a écrit :

MERCI gilou effectivement ca marche, j'avais déjà testé  mais j'avais fermer la boucle du sommaire trop tot donc cela ne marcher pas.  
 
Par contre ce que je ne comprends pas c'est justement pourquoi cela marche avec && ( qui pour moi veux dire qu'il faut que les nomnbre 1 et 2 soit égaux aux nombres mystere pour sortir de la boucle.
alors qu'avec || je comprends qu'il faut ou que le nombre 1 soir egal au nombre mystere pour sortir de la boucle ou le nombre 2 ce qui me semblais plus logique :/  
 
Quelqu'un pourrais m'expliquer car à ce que je vois j'ai compris de travers !!xd

Ce que tu veux a la base, c'est qu'on s'arrete quand un des deux nombres est le nombre mystere. Donc on s'arrête pour la condition suivante:
((Nombre1 == nombreMysteres) || (Nombre2 == nombreMysteres))
Donc on prend la négation de ça pour la condition de boucle (puisque c'est la condition pour que ça s'arrête pas):
(!((Nombre1 == nombreMysteres) || (Nombre2 == nombreMysteres)))
On distribue la négation en appliquant la formule élémentaire (non (A ou B)) <=> ((non A) et (non B))
Ça donne ici
((!(Nombre1 == nombreMysteres)) && (!(Nombre2 == nombreMysteres)))
Maintenant on applique (non (A == B)) <=> (A != B)
Ça donne ici
((Nombre1 != nombreMysteres) && (Nombre2 != nombreMysteres))
Voilou.
A+,


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

Marsh Posté le 25-05-2010 à 14:59:45    

Citation :

res = N1 / N2;

au vu du code ca devrait être nombre1 et nombre2, pas N1 et N2. Et il suffit de faire res = (double) nombre1/ (double) nombre2;  
A+,


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

Marsh Posté le 25-05-2010 à 15:52:11    

gilou---> la j'avoue c'est moi qui avais la tête en l'air car j'avais déclaré N1 et N2 en double mais je ne les avaient pas mis dans scanf XD !!!^^
merci
 
ps: en tout cas tu m'as appris une chose car je savais pas qu'on pouvais changer le type d'une variable une fois qu'elle à été déclaré ^^ (je fais référence à: (double) nombre1/ (double) nombre2;  )
 
et pour l'explication pour les opérateurs logiques^^ tu m'as fais une révision car je me souviens que j'aavais lu exactement les mêmes explication il y à quelques mois XD  merci^^

Reply

Marsh Posté le 25-05-2010 à 15:55:34    

Petite question concernant le premier programme du jeu de hasard je compte le modifié en faisant appel a des fonctions donc je compte creer 5 fonctions:
3 différentes (1 pour chaque niveau)
et 2 autres pour le mode 1 et 2 joueurs ^^ j'espère que je me trompe pas :p^^  normalement je ne penses pas avoir de problème mais sais ont jamais !!^^

Reply

Marsh Posté le 25-05-2010 à 15:55:34   

Reply

Marsh Posté le 25-05-2010 à 19:08:40    

Un peu trop compliqué, ça, il y a moyen de simplifier.
En particulier, le niveau ne compte qu'a l'initialisation du jeu.
Un exemple codé rapidement à partir de ton code, qui n'utilise qu'une fonction quelque soit le nb de joueurs et le niveau, findNb, car en fait, ce qui compte, c'est de savoir si on a trouvé le nb ou pas. Cet exemple est pas parfait (scanf, c'est pas ce qu'il faut utiliser pour un input utilisateur, car ca suppose un utilisateur parfait, qui va jamais taper d'input erronné), mais ça devrait te donner des idées. Notes que la, si queryNbJoueurs accepte une valeur plus grande que 2 joueurs, le reste du code marchera aussi:

 
Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define MISE_AU_POINT
  5. int queryNbJoueurs () {
  6.   int nombreJoueur = 0;
  7.   printf ("Selectionnez le nombre de joueur 1 ou 2!" );
  8.   scanf ("%d", &nombreJoueur);
  9.   while ((nombreJoueur != 1) && (nombreJoueur != 2)) {
  10.     printf ("Entree invalide!\n" );
  11.     printf ("Selectionnez le nombre de joueur 1 ou 2!" );
  12.     scanf ("%d", &nombreJoueur);
  13.   }
  14.   return nombreJoueur;
  15. }
  16. int queryNiveau () {
  17.   int niveau = 0;
  18.   printf ("\n\n\nSelectionnez le niveau : \n1: 0-100\n2: 0-1000\n3: 0-10000\n" );
  19.   scanf ("%d", &niveau);
  20.   while ((niveau < 1) && (niveau > 3)) {
  21.     printf ("Entree invalide!\n" );
  22.     printf ("\n\n\nSelectionnez le niveau:\n1\t0-100\n2\t0-1000\n3\t0-10000\n" );
  23.     scanf ("%d", &niveau);
  24.   }
  25.   return niveau;
  26. }
  27. int findNb(int num_joueur, int mystere) {
  28.   int nombre = 0;
  29.   if (num_joueur) {
  30.     printf ("Joueur %d, entrez un nombre!", num_joueur);
  31.   }
  32.   else {
  33.     printf ("Entrez un nombre!" );
  34.   }
  35.   scanf ("%d", &nombre);
  36.   if (nombre == mystere) {
  37.     return 1;
  38.   }
  39.   else if (nombre < mystere) {
  40.     printf("\nTrop petit!\n\n" );
  41.   }
  42.   else if (nombre > mystere) {
  43.     printf ("\nTrop grand!\n\n" );
  44.   }
  45.   return 0;
  46. }
  47. int getContinuer(int cptr) {
  48.   int continuer = -1; //
  49.  
  50.   printf ("Bravo! Vous avez reussi en %d coups\n", cptr);
  51.   printf ("Voulez vous rejouer? 0: non\t 1: oui\n" );
  52.   scanf ("%d", &continuer);
  53.   while ((continuer != 0) && (continuer != 1)) {
  54.     printf ("Entree invalide!\n" );
  55.     printf ("Voulez vous rejouer? 0: non\t 1: oui\n" );
  56.     scanf ("%d", &continuer);
  57.   }
  58.   return continuer;
  59. }
  60. void initialiserJeu(int *mystere, int *niveau, int *nb_joueurs) {
  61.   int min = 0;
  62.   int max = 10;
  63.   int i;
  64.  
  65.   *nb_joueurs = queryNbJoueurs();
  66.   *niveau = queryNiveau();
  67.   // On calcule max a partir du niveau
  68.   for (i = 0; i < *niveau; i++) {
  69.     max *= 10;
  70.   }
  71.   *mystere = (rand() % (max - min + 1)) + min;
  72. #ifdef MISE_AU_POINT
  73.   printf("mystere=%d\n", *mystere);
  74. #endif
  75. }
  76. int main(int argc, char *argv[])
  77. {
  78.   int mystere = 0;
  79.   int nb_joueurs = 0; // doit valoir 1 ou 2 en cours de partie
  80.   int niveau = 0; // doit valoir 1, 2 ou 3 en cours de partie
  81.   int nb_essais = 0;
  82.   int continuer = 1;
  83.   srand((unsigned int) time(NULL));
  84.   initialiserJeu(&mystere, &niveau, &nb_joueurs);
  85.   do {
  86.     int i = 0;
  87.     int found = 0;
  88.     nb_essais++; // ou bien on le décale dans la boucle for, si on veut la somme des essais des deux joueurs
  89.     for (i = 0; i < nb_joueurs; i++) {
  90.       if (nb_joueurs == 1) {
  91.         found = findNb(0, mystere);
  92.       }
  93.       else {
  94.         found = findNb(i+1, mystere);
  95.       }
  96.       if (found) {
  97.         continuer = getContinuer(nb_essais);
  98.         if (continuer) {
  99.           initialiserJeu(&mystere, &niveau, &nb_joueurs);
  100.           nb_essais = 0;
  101.         }
  102.         break;
  103.       }
  104.     }
  105.   } while (continuer);
  106.  
  107.   getchar();
  108.   return 0;
  109. }
 

A+,


Message édité par gilou le 25-05-2010 à 19:16:16

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

Marsh Posté le 26-05-2010 à 22:11:29    

Ouahou !!! et bien ... merci gilou pour ce petit exemple qui m'es assez constructif mais pour ma part je n'ai pas encore vu les préprocesseur, les macros et les #define XD  
Donc je comprends le principe et une partie du code (que j'ai survolé je l'avoue car je vais le regarder plus précisement ce soir ou demain) mais  pour te dire qu'il y à certaines chose que je n'ai pas encore vu XD !!  
 
ps: getchar () je le vois souvent mais ne le comprends pas très bien :S

Reply

Marsh Posté le 27-05-2010 à 15:59:02    

sauf que je viensd e remarquer que votre programme ... indique le nombre mystère au joueur ^^ je me penche ce soir sur une solution adapté a mes capacitées ( bien que la prochaine choses que je vais voir sont les chaine de caractère et les préprocesseurs je veux y arriver sans ^^)

Reply

Marsh Posté le 27-05-2010 à 18:43:35    

Faut lire, hein, l'affichage du nombre mystère, c'est en phase de test du programme:

Citation :

#ifdef MISE_AU_POINT
  printf("mystere=%d\n", *mystere);
#endif


Il suffit de mettre #define MISE_AU_POINT en commentaire et de recompiler pour avoir le programme pour les joueurs, sans affichage du nombre mystère.
Pour faire l'équivalent sans préprocesseur, vous pouvez créer une variable globale (avant le main donc)
int debug = 1;
et remplacer ce qui est mis en quote par:
if (debug) {
  printf("mystere=%d\n", *mystere);
}
et pour une version finale, vous mettez la valeur de debug à 0 et recompilez.
 
 
pour le getchar(); c'est équivalent a un system("Pause" ); mais ça marche qu'on soit sous windows ou pas.
A+,


Message édité par gilou le 27-05-2010 à 18:48:34

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

Sujets relatifs:

Leave a Replay

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