Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP 1 Plus ou Moins : Compteur de coups

Sujet résolu
    17 juin 2006 à 1:48:17

    Bonjour,
    J'apprends le langage C avec le cours de M@teo (très bien faits d'ailleurs !) et j'ai un petit problème dans le TP 1... J'ai mis un compteur de coups et il ne se remet pas à 0 entre chaque partie. Vous pourriez me dire ce qui va pas dans mon code ?

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

    int main()
    {
            // Présentation du jeu.
            printf("Ceci est un jeu dans lequel vous devez deviner un nombre.\n");
            printf("Chaque fois que vous entrez un nombre, le programme vous dira si le nombre\nmystere est plus grand ou plus petit.\n\n");
            const long MIN = 1;
            long MAX;
            long nombreMystere, nombreEntre = 1;
            int partie = 1, coups = 0;
            // Choix du niveau de difficulté.
            while(partie == 1)
            {
            int niveau = 1;
            printf("Choississez votre niveau de difficulte.\n\n");
            printf("1. Nombre entre 1 et 100.\n");
            printf("2. Nombre entre 1 et 500.\n");
            printf("3. Nombre entre 1 et 1500.\n");
            printf("4. Nombre entre 1 et 4000.\n\n");
            printf("Votre choix ? ");
            scanf("%ld", &niveau);
            printf("\n\n");
            switch(niveau)
            {
                case 1:
                    MAX = 100;
                    break;
                case 2:
                    MAX = 500;
                    break;
                case 3:
                    MAX = 1500;
                    break;
                case 4:
                    MAX = 4000;
                    break;
                default:
                    printf("Tu ne veux pas repondre correctement ?\n");
                    printf("Ben pour la peine, tu auras un nombre entre 1 et 5000 !\n\n");
                    MAX = 5000;
                    break;
            }
            // Génération du nombre aléatoire...
            srand(time(NULL));
            nombreMystere = (rand () % (MAX - MIN + 1)) + MIN;
            // Boucle qui se répète tant que le joueur n'a pas trouvé le nombre mystère.
            do
            {
                printf("Quel est le nombre ? ");
                scanf("%ld", &nombreEntre);
                coups++; // Compteur de coups joués.
                // Juste pour emmerder les petite malins :
                if(nombreEntre < MIN || nombreEntre > MAX)
                {
                printf("Ce n'est pas un nombre dans les limites du jeu !\n\n");
                system("PAUSE");
                return 0;
                }
                // Comparaison des nombres.
                else if(nombreEntre > nombreMystere)
                    printf("C'est moins !\n");
                else if(nombreEntre < nombreMystere)
                    printf("C'est plus !\n");
                else
                {
                    printf("Bravo ! C'est le nombre mystere !\n");
                    printf("Vous avez trouve le nombre mystere en %ld coups.\n\n", coups);
                }
            } while(nombreEntre != nombreMystere);
            printf("Une autre partie ?\n\n");
            printf("1. Oui.\n");
            printf("2. Non.\n\n");
            printf("Votre choix : ");
            scanf("%ld", &partie);
            printf("\n\n");
            }
            return 0;
    }


    Ce serait sympa ! :)
    Ha oui, et aussi, je voudrais savoir... c'est possible d'éviter une boucle infinie si un petit malin entre autre chose qu'un nombre ?

    Voilà voilà, merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2006 à 4:18:56

      while(partie == 1)
      {
          [...]
              do
              {
              [...]
              coups++;
              [...]
              }while(nombreEntre != nombreMystere);
           [...]
      }

      Tu peux remarquer que la seule action que tu exerces sur la variable coups est une incrémentation. Donc, quand on revient au début de la boucle, il faut lui réimposer la valeur 0.
      while(partie == 1)
      {
          [...]
          coups = 0;
              do
              {
              [...]
              coups++;
              [...]
              }while(nombreEntre != nombreMystere);
           [...]
      }


      Par contre, certaines de tes variables sont déclarées dans la boucle. Il faut les déclarer en début de fonction. (Chapitre 4)

      Dans la même idée, tu utilises srand(). Elle ne doit être utilisée qu'une fois et, de préférence, au début du main.

      Enfin, pour la boucle infinie, elle est dûe à la fonction scanf(). Tu verras plus tard une fonction plus stable (fgets()), quelque soit l'utilisateur.
      • Partager sur Facebook
      • Partager sur Twitter
        17 juin 2006 à 8:41:35

        au debut de ta boucle met

        compteur = 0;
        • Partager sur Facebook
        • Partager sur Twitter
          17 juin 2006 à 10:53:35

          Citation : Timon


          Par contre, certaines de tes variables sont déclarées dans la boucle. Il faut les déclarer en début de fonction.


          o_O Pourquoi ? Il est tout a fait conforme de définir une variable au début d'un bloc.
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            17 juin 2006 à 12:34:36

            Eh bien, avant de dire ça, j'avais vérifié pourtant :

            Citation : Cours du Site

            Vous devez faire les déclarations de variables au début des fonctions.


            Je comprend peut-être mal cette phrase.
            Aussi, au cas où je me tromperais, à chaque passage de la boucle, il redéclare sa variable. Ce n'est pas utile, non ?
            • Partager sur Facebook
            • Partager sur Twitter
              17 juin 2006 à 12:37:38

              Citation : Timon

              Eh bien, avant de dire ça, j'avais vérifié pourtant :

              Citation : Cours du Site

              Vous devez faire les déclarations de variables au début des fonctions.


              Je comprend peut-être mal cette phrase.


              Tu as bien compris, mais elle est fausse. Ca devrait être :

              Citation : Cours du Site

              En C90, vous devez faire les définitions de variables au début d'un bloc. En C99, c'est où vous voulez


              Citation : Pas de titre


              Aussi, au cas où je me tromperais, à chaque passage de la boucle, il redéclare sa variable. Ce n'est pas utile, non ?


              'redéfinit'...

              Peu importe.
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                17 juin 2006 à 13:26:25

                Le coups = 0; au début de la boucle ne change rien... C'était pour ça que j'avais demandé. ;) J'ai essayé de mettre coups = 0; un peu partout dans le programme mais rien à faire. Est-ce que c'est moi qui déraille ? Je commence à m'inquiéter...

                En tout cas, pour la réponse sur scanf, merci. Je suis sûre que ça va me servir bientôt :)
                • Partager sur Facebook
                • Partager sur Twitter
                  17 juin 2006 à 13:46:46

                  Citation : Popocool

                  Le coups = 0; au début de la boucle ne change rien... C'était pour ça que j'avais demandé. ;) J'ai essayé de mettre coups = 0; un peu partout dans le programme mais rien à faire.


                  Il ne faut pas faire n'importe quoi. Il faut réfléchir.

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

                  int main()
                  {
                     int partie = 1;

                     /* -ed- c'est ici que devrait etre le srand()... */

                     // Présentation du jeu.
                     printf("Ceci est un jeu dans lequel vous devez deviner un nombre.\n");
                     printf("Chaque fois que vous entrez un nombre, le programme vous dira si le nombre\n"
                            "mystere est plus grand ou plus petit.\n\n");
                     // Choix du niveau de difficulté.
                     while(partie == 1)
                     {
                        /* -ed- c'est ici que commence la partie... */
                        int coups = 0;

                        const long MIN = 1;
                        long MAX;
                        long nombreMystere, nombreEntre = 1;
                        int niveau = 1;
                        printf("Choississez votre niveau de difficulte.\n\n");
                        <...>
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    17 juin 2006 à 14:53:00

                    Ba moi perso je suis aussi sur ce TP et pour l'instant mon code marche pas mal :
                    #include <stdio.h>
                    #include <stdlib.h>
                    #include <time.h>

                    int main(int argc, char *argv[])
                    {
                     
                      long nombreDeJoueurs = 0;
                     
                      printf("Combien de joueurs (1 ou 2) ? ");
                      scanf("%ld", &nombreDeJoueurs);
                      printf("\n");
                     
                      if ( nombreDeJoueurs == 1)
                      {
                           
                      long nombreMystere = 0, nombreEntre = 0, continuerPartie = 1, max = 0;
                      const long MIN = 1;
                     
                         //Si on veut faire une partie
                         
                          while (continuerPartie == 1)
                          {
                               
                                long nombreDeCoups = 0;
                               
                                printf("Choisissez le nombre maximum : ");
                                scanf("%ld", &max);
                                printf("\n");
                               
                      //L'ordinateur détermine un nombre aléatoire selon le niveau de difficulté
                     
                      srand(time(NULL));
                      nombreMystere = (rand() % (max - MIN + 1)) + MIN;
                         
                                    do
                                    {
                     
                                    printf("Quel est le nombre ? ");
                                    scanf("%ld", &nombreEntre);
                                   
                                                 if(nombreEntre < nombreMystere)
                                                 {
                                                 printf("C'est plus !\n\n");
                                                 nombreDeCoups++;
                                                 }
                                                 
                                                 else if(nombreEntre > nombreMystere)
                                                 {
                                                 printf("C'est moins !\n\n");
                                                 nombreDeCoups++;
                                                 }
                                                 
                                                 else
                                                 {
                                                nombreDeCoups++;
                                                 printf("Bravo, vous avez trouve le nombre mystere (%ld) en %ld coups !!!\n\n", nombreMystere, nombreDeCoups);
                                                 }
                     
                                    } while (nombreEntre != nombreMystere);

                      printf("Une autre partie (1 pour OUI ou 0 pour NON) ? ");
                      scanf("%ld", &continuerPartie);
                      printf("\n\n");
                     
                          }
                       }
                       
                       //si on choisit le mode 2 joueurs
                       else if (nombreDeJoueurs == 2)
                       {
                        long nombreMystere = 0, nombreEntre = 0, continuerPartie = 1;
                       
                                     while (continuerPartie == 1)
                                     {
                                      printf("Joueur 1 : Choisissez le nombre mystere : ");
                                      scanf("%ld", &nombreMystere);
                                     
                                      long nombreDeCoups2 = 0;
                                     
                                           do
                                           {
                                            printf("Joueur 2 : Quel est le nombre ? ");
                                            scanf("%ld", &nombreEntre);
                                           
                                                 if(nombreEntre < nombreMystere)
                                                 {
                                                 printf("C'est plus !\n\n");
                                                 nombreDeCoups2++;
                                                 }
                                                 
                                                 else if(nombreEntre > nombreMystere)
                                                 {
                                                 printf("C'est moins !\n\n");
                                                 nombreDeCoups2++;
                                                 }
                                                 
                                                 else
                                                 {
                                                 nombreDeCoups2++;
                                                 printf("Bravo, vous avez trouve le nombre mystere (%ld) en %ld coups !!!\n\n", nombreMystere, nombreDeCoups2);
                                                 }
                     
                                           } while (nombreEntre != nombreMystere);           
                                     
                                      printf("Joueur 2 : Choisissez le nombre mystere : ");
                                      scanf("%ld", &nombreMystere);
                                     
                                      long nombreDeCoups1 = 0;
                                     
                                           do
                                           {
                                            printf("Joueur 1 : Quel est le nombre ? ");
                                            scanf("%ld", &nombreEntre);
                                           
                                                 if(nombreEntre < nombreMystere)
                                                 {
                                                 printf("C'est plus !\n\n");
                                                 nombreDeCoups1++;
                                                 }
                                                 
                                                 else if(nombreEntre > nombreMystere)
                                                 {
                                                 printf("C'est moins !\n\n");
                                                 nombreDeCoups1++;
                                                 }
                                                 
                                                 else
                                                 {
                                                 nombreDeCoups1++;
                                                 printf("Bravo, vous avez trouve le nombre mystere (%ld) en %ld coups !!!\n\n", nombreMystere, nombreDeCoups1);
                                                 }
                     
                                           } while (nombreEntre != nombreMystere);
                                     
                                     //on détermine le vainqueur
                                           if (nombreDeCoups1 < nombreDeCoups2)
                                           printf("Bravo joueur 1 vous avez battu joueur 2 (%ld coups a %ld coups)\n\n", nombreDeCoups1, nombreDeCoups2);
                                           
                                           else if (nombreDeCoups1 > nombreDeCoups2)
                                           printf("Bravo joueur 2 vous avez battu joueur 1 (%ld coups a %ld coups)\n\n", nombreDeCoups2, nombreDeCoups1);
                                           
                                           else
                                           printf("Egalite ! (%ld coups partout)\n\n", nombreDeCoups1);
                                           
                                           printf("Une autre partie (1 pour OUI ou 0 pour NON) ? ");
                                           scanf("%ld", &continuerPartie);
                                           printf("\n\n");
                                           
                                     }
                                 
                       }
                       
                       else
                       {
                       printf("Il me semblait avoir demande de taper 1 ou 2 ! Pour la peine tu devras relancer le programme tout seul ! na !\n\n\n");   
                       }   
                           
                      system("PAUSE");     
                      return 0;
                    }
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juin 2006 à 15:16:49

                      Le "coup=0" vous ne devez pas le mettre dans votre boucle, sinon à chaque passage, coup va revenir à 0, donc le compteur ne va servir à rien !

                      Il suffit que coup soit définit juste avant le while() et comme ca ca fonctionera
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 juin 2006 à 15:21:20

                        Mais c'est justement l'interet de remettre le compteur a zero a chaque passage!Comme ça à chaque passage tu vois en combiende coup tu a trouvé la solution...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 juin 2006 à 15:37:52

                          Citation : Filou-sensei

                          Mais c'est justement l'interet de remettre le compteur a zero a chaque passage!Comme ça à chaque passage tu vois en combiende coup tu a trouvé la solution...


                          Le méchant dialogue de sourds...

                          Il y a deux boucles, imbriquées, vous ne parlez pas de la même.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                            17 juin 2006 à 18:14:22

                            -ed-, je ne peux pas mettre le srand()... là où tu dis parce qu'à ce moment là, la valeur de MAX est fausse...

                            Et de toute façon, mon programme marche très bien. C'est juste que le nombre de coups se remets pas à zero à chaque partie. Filou-sensei, ce que t'as fait, ça marche ? Ca remet le nombre de coups à zero ? Je vais essayer, tiens... :)

                            Edit : Non, ça marche pas chez moi... :'(
                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 juin 2006 à 18:41:38

                              Citation : Popocool

                              -ed-, je ne peux pas mettre le srand()... là où tu dis parce qu'à ce moment là, la valeur de MAX est fausse...


                              o_Oo_O Mais keskedi ! Y'a pas besoin de MAX pour srand()... Faut arréter le pastis...

                              Citation : Pas de titre


                              Et de toute façon, mon programme marche très bien. C'est juste que le nombre de coups se remets pas à zero à chaque partie. Filou-sensei, ce que t'as fait, ça marche ? Ca remet le nombre de coups à zero ? Je vais essayer, tiens... :)

                              Edit : Non, ça marche pas chez moi... :'(


                              Met un printf()...
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                17 juin 2006 à 18:54:54

                                Ha tu parles du srand(time(NULL)) ? Ok... autant pour moi. Mais je préfère garder cette ligne collée à celle qui crée la variable aléatoire sinon je saurai plus à quoi elle sert (je ne suis qu'un débutante après tout ;))

                                Pour ce qui est du nombre de coups, ça y est, j'ai réussi à ce qu'il se remette à zero ! Merci pour vos conseils :)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                TP 1 Plus ou Moins : Compteur de coups

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown