Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonctionnalité du plus ou moins

très bizarre

    20 décembre 2006 à 9:39:46

    Bonjour a tous!

    J'ai décider de me (re) mettre au C car j'avais seulement survolé les cours il y a des lunes de cela.

    J'ai donc suivi les tutos, fait des test etc... et j'arrive au plus ou moins.
    Je décide de faire le programme simpliste sa marche simple je suis heureux.

    Mais je ne vais pas rester sur ce résultat. Je met en place les difficultés... sa marche!
    Je met le compteur de coups, sa marche.
    J'essaie de mettre le mode 2 joueurs... mais c'est la que tout bloque.
    Sa ne marche pas, mais j'ai essayé de faire une boucle pour rejouer et sa ne marche pas non plus.

    il y a diverse erreur: Le mode un joueur bug. Il marche une fois sur 2 lorsque l'on écrit un nombre.
    Si je sélectionne le mode 2 joueurs, le programme plante... :(

    Voici le code:

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

    int main ( int argc‚ char** argv )
    {
       
        // Definition des variables
        long nombreMystere = 0‚ nombreEntre = 0‚ choixNiveau = 0‚ nbCoups = 0‚ MIN = 1‚ MAX = 0‚ nbJoueur = 0‚ nbmystere2j = 0‚ rejoue = 0;
       
        // Message de bienvenue et but du jeu
        printf ("\t\t ***** Bonjour et bienvenue sur PlusouMoins!  ***** \n\n");
        printf ("Le but du jeu est de trouver un nombre mystere defini par l'ordinateur en un minimum de coups! \n A vous de jouer! \n\n");
       
       
        do
        {
        // Menu pour le mode 1 / 2 joueurs
        printf ("*** Veuillez choisir un mode*** \n\n");
        printf ("1. Mode 1 joueur \n");
        printf ("2. Mode 2 joueurs \n\n");
        printf ("Votre choix: ");
        scanf ("%ld"‚ &nbJoueur);
       
       
             
        // Condition pour 1 joueur et tous le code 1 joueur
        if (nbJoueur == 1)
        {
          // Menu pour la difficulté
          printf ("*** Choisissez une difficulte ***\n\n");
          printf ("1. Facile –––––> Nombre aleatoire : De 1 a 100 \n");
          printf ("2. Moyen ––––––> Nombre aleatoire : De 1 a 500 \n");
          printf ("3. Difficile ––> Nombre aleatoire : De 1 a 1000 \n\n");
          printf ("Votre choix: ");
          scanf ("%ld"‚ &choixNiveau);
       
          // Le switch pour gérer le choix du niveau
          switch (choixNiveau)
          {
            case 1:
            MAX = 100;
            break;
         
            case 2:
            MAX = 500;
            break;
         
            case 3:
            MAX = 1000;
            break;
         
            default:
            printf ("Veuillez choisir un niveau de difficulte existant!");
            break;     
          }

            // Nombre aléatoire pour le mode 1 joueur seulement.
            srand(time(NULL));
            nombreMystere = (rand() % (MAX – MIN + 1)) + MIN;

            // Boucle du programme
            do
            {
           
              // Phrase et incrémentation
              printf("Quel est le nombre: ");
              scanf("%ld"‚ &nombreEntre);
              nbCoups++;

             // Les conditions
              if (nombreMystere > nombreEntre)
                  printf("C'est plus !\n\n");
              else if (nombreMystere < nombreEntre)
                  printf("C'est moins !\n\n");
              else
                  printf ("Bravo‚ vous avez trouve le nombre mystere en %ld coups !!!\n\n"‚ nbCoups);
                  printf ("Voulez vous rejouez: ");
                  scanf ("%ld"‚ &rejoue);
                 
           } while (nombreEntre != nombreMystere);   
        }
        // Fin du mode 1 joueur
     
     
        // Si ce n'est pas un joueur‚ c'est 2 joueurs. Voici tous le code pour 2 joueurs
        else
        {
          printf ("Joueur 2‚ veuillez rentrez un nombre entre 1 et 100: ");
          scanf ("%ld"‚ &nbmystere2j);
         
            if (nbmystere2j > 100)
            {
              printf ("Attention! Vous avez rentrer un nombre plus grand que 100! \n Veuillez recommencer \n");
              printf ("Votre nombre compris entre 1 et 100: ");
              scanf ("%ld"‚ &nbmystere2j);
            }
         
            else
            {
              // Boucle du programme
              do
               {
                  // Phrase et incrémentation
                  printf("Quel est le nombre: ");
                  scanf("%ld"‚ &nombreEntre);
                  nbCoups++;

                 // Les conditions
                  if (nbmystere2j > nombreEntre)
                      printf("C'est plus !\n\n");
                  else if (nbmystere2j < nombreEntre)
                      printf("C'est moins !\n\n");
                  else
                      printf ("Bravo‚ vous avez trouve le nombre mystere en %ld coups !!!\n\n"‚ nbCoups);
                      printf ("Voulez vous rejouez: ");
                      scanf ("%ld"‚ &rejoue);
               } while (nombreEntre != nbmystere2j);
             }
        }

     } while (rejoue == 1);
        system("PAUSE");
    }


    Merci d'avance pour votre aide parce que j'ai testé plusieurs truc, j'ai fait des test pour cerné les bugs mais tout foire un peu et je ne veux pas re commencez mon progreamme.

    Sword'
    • Partager sur Facebook
    • Partager sur Twitter
      20 décembre 2006 à 10:25:06

      j'ai trouvé un problme
      je suis pas sure que c'est celui que tu cherche mais ça reste un probleme
      c'est dans



      else
      printf ("Bravo, vous avez trouve le nombre mystere en %ld coups !!!\n\n", nbCoups);
      scanf ("%ld", &rejoue);

      } while (nombreEntre != nombreMystere);


      ce else ne marchera jamais car si le nombreEntree est egale à nombreMystere le boucle s'arretera " while (nombreEntre != nombreMystere) "


      comme j'ecri en sorte que mon code c s'ecris ......... comme un code !!!

      • Partager sur Facebook
      • Partager sur Twitter
        20 décembre 2006 à 10:52:25

        Concernant le post d'au dessus, il me semble que la boucle est correcte.

        Cependant, il y a des scanf dont tu n'a pas définit l'adresse mémoire de la variable (oubli du &) lors de la saisie du nombre du joueur 2.

        Pour plus de lisibilité, tu devrait peut être créer 2 fonctions: Solo() et Multijoueur().
        Ca permettrait d'alléger le main et d'y voir plus clair.

        De plus, si tu fait du C, tu dois déclarer toutes tes variables des le début du code (donc affiché le message de bienvenue après).
        • Partager sur Facebook
        • Partager sur Twitter
          20 décembre 2006 à 11:17:23

          En effet, le mode 2 joueurs marche. J'ai mis les & manquants (je les oublis tous le temps ceux la!)
          Par contre le mode 1 joueur ne marche qu'a moitié.

          En faites j'arrive a la choisir, la difficulté aussi.
          Sa me marque donc
          Ex: Quel est le nombre: 54. C'est plus!
          45
          Quel est le nombre: 70. C'est moins

          Je suis toujours obligé d'écrire un chiffre au hasard avant que le logiciel me demande quel est le nombre et qu'il me réponde c'est plus ou c'est moins.

          J'ai édité le code de mon premier post.
          • Partager sur Facebook
          • Partager sur Twitter
            20 décembre 2006 à 11:23:42

            C'est à cause de ça:

            scanf ("%ld", &rejoue);

            Il attend un nombre qu'il n'utilise pas.
            • Partager sur Facebook
            • Partager sur Twitter
              20 décembre 2006 à 11:24:37

              Image utilisateur



              Fonction system("PAUSE");



              La fonction system("PAUSE"); n'est pas portable (ne fonctionne pas sur tous les systèmes d'exploitation (Windows, Linux, ...)).

              C'est pourquoi il est préférable d'utiliser :

              printf("Appuyez sur une touche ..."); // Tu peux même changer le message.
              getchar();



              Erreur Courante : srand();



              Grand classique de programmation : l'erreur srand !

              Quoi o_O ? Mais j'ai pas d'erreur !


              Eh bah si :p Na !

              La fonction srand() de stdlib.h ne doit être lue durant le programme qu'une fois !
              Mais l'attribution du style :

              nombreMystere = (rand() (MAX – MIN + 1)) + MIN;


              Elle peut être lue plusieurs fois !

              Heu ... !?


              Des exemples ?

              Incorrect :

              while(1)
              {
                  srand(time(NULL));
                  nombreMystere = (rand() (MAX – MIN + 1)) + MIN;
              }


              Correct :


              srand(time(NULL)); // Ne se lit qu'une fois (hors d'une boucle).

              while(1)
              {
                  nombreMystere = (rand() (MAX – MIN + 1)) + MIN;
              }


              Notez que pour initialiser srand() à time(NULL), il faut inclure time.h.


              Le srand(); est donc à indiquer habituellement avec les variables en début de fonction.

              A voir : Les nombres aléatoires en C/C++ par Natim


              Encombrement du code : default: (...) break;



              Dans un switch, il n'est pas nécessaire de mettre un break; à la fin d'un default.
              A noter que dans les cours de M@ateo21, ils sont présents. Ceci reste alors simplement une remarque, vous avez le choix de le précisé ou non.

              switch(variable)
              {
              case 0:
                  printf("Variable = 0");
                  break; // Break obligatoire.
              default:
                  printf("Variable != 0");
                  // Break facultatif.
              }


              Ok, mais pourquoi ?


              Lors des case(s), l'instruction break; permet de sauter vers la fin du switch sans lire les autres instructions des autres case(s).

              Le default étant à la fin, le break final est inutile.


              Cordialement, Keiristos.
              • Partager sur Facebook
              • Partager sur Twitter
                20 décembre 2006 à 11:36:43

                Citation : Sebajuste

                C'est à cause de ça:

                scanf ("%ld", &rejoue);

                Il attend un nombre qu'il n'utilise pas.


                En effet c'était bien ça ^^
                Merci beaucoup sa marche.

                Merci aussi de tes remarques Keiristos j'en prendrais compte.
                Par compte un jour j'avais utiliser getchar(); mais cela ne m'avait pas mis en pause :(

                J'ai essayé de faire le programme avec une fonction solo et 2joueurs mais que doivent renvoyer c'est fonction?
                Je ne mani pas très bien les fonctions et j'ai un peu de mal.

                J'ai essayé de faire un code pour que le joueur puisse rejouer mais sa ne marche pas. Dès que le joueur entre un nombre (mode 1 joueur ou 2 joueurs) il y a la question: Voulez vous rejouez.

                Durant le mode 1 joueur, si après la question: Voulez vous rejouez je rentre 1, il ne me met pas le menu pour le mode et les difficultés mais me remet en mode joueur 1.
                • Partager sur Facebook
                • Partager sur Twitter
                  20 décembre 2006 à 11:49:37

                  Je me suis permis de refaire ton programme en utilisant les fonctions et en rajoutant plus de vérifications sur la saisie des nombres.

                  Moi, j'utilise quand même les fonction system(); ^^
                  Alors il te faudra les modifier, et trouver un équivalent pour effacer la console si tu ne veut pas les utiliser.

                  /*
                  Reste a faire:
                   – Faire marcher le mode 2 joueurs
                   – Si un mauvais mode est entrer‚ faire en sorte de redemander la question
                   – Faire rejouer le joueur. Boucle do...while autour du programme avec rejoue == 1

                  */

                  #include <time.h>

                  // On déclare les prototype des fonctions que l'on va utiliser. Ca permet d'écrire le code en dessous de la fonction main
                  void solo();
                  void multijoueur();

                  // Note: la fonction main retourne un int !
                  int main(int argc‚ char* argv[])
                  {
                      // Je déclare des entier‚ ca prend moins de mémoire qu'un double (qui est inutil étant donné qu'on utilise que des entiers)
                      int nbJoueur = 0;
                     
                      // On initialise le générateur de nombre
                      srand(time(NULL));
                     
                      printf ("\t\t ***** Bonjour et bienvenue sur PlusouMoins!  ***** \n\n");
                      printf ("Le but du jeu est de trouver un nombre mystere defini par l'ordinateur en un minimum de coups! \n A vous de jouer! \n\n");
                     
                      // On boucle jusqu'à ce que le joueur décide de quitter
                      do {
                         printf ("*** Veuillez choisir un mode*** \n\n");
                         printf ("1. Mode 1 joueur \n");
                         printf ("2. Mode 2 joueurs \n\n");
                         printf ("0. Quitter\n\n");
                         printf ("Votre choix: ");
                         
                         // on fait un scanf avec %d car il s'agit d'un entier
                         scanf("%d"‚ &nbJoueur);
                     
                         // une fois le choix fait‚ on efface le contenu de la console
                         system("CLS");
                         switch(nbJoueur)
                         {
                              // Rien ne se passe si on choisi de quitter
                              case 0:
                                   break;
                               
                              // On démarre le mode solo
                              case 1:
                                   solo();
                                   break;
                               
                              // On démarre le mode multijoueur
                              case 2:
                                   multijoueur();
                                   break;
                               
                              // On affiche un message d'erreur si le nombre d'est pas correct
                              default:
                                      printf("Erreur lors de la saisi du nombre de joueur");
                         }
                      } while(nbJoueur != 0);
                     
                      // La fonction main DOIT retourner un entier.
                      return 0;
                  }

                  // –––––––––––––––––––––––––––––
                  // Le mode solo
                  void solo()
                  {
                       // On déclare les variables à utiliser (seul nbCoups a besoin d'être initialisé)
                       int choixNiveau‚ MAX‚ nombreMystere‚ nombreEntre‚ nbCoups=0;
                       
                       printf ("*** Choisissez une difficulte ***\n\n");
                       printf ("1. Facile –––––> Nombre aleatoire : De 1 a 100 \n");
                       printf ("2. Moyen ––––––> Nombre aleatoire : De 1 a 500 \n");
                       printf ("3. Difficile ––> Nombre aleatoire : De 1 a 1000 \n\n");
                       printf ("Votre choix: ");
                       
                       // On boucle tant que le niveau choisi c'est pas correct.
                       // C'est le même principe que dans le main
                       do {
                            scanf("%d"‚ &choixNiveau);
                       
                            switch (choixNiveau)
                            {
                                 case 1:
                                      MAX = 100;
                                      break;
                       
                                 case 2:
                                      MAX = 500;
                                      break;
                       
                                 case 3:
                                      MAX = 1000;
                                      break;
                       
                                 default:
                                      printf ("Veuillez choisir un niveau de difficulte existant!");
                             }
                        } while(choixNiveau != 1 && choixNiveau != 2 && choixNiveau != 3);
                       
                        // On récupère un nombre au hazard. Pas la peine d'utiliser MIN‚ car on choisis toujours un nombre enre 1 et x.
                        nombreMystere = (rand() % MAX) + 1;
                       
                        do {
                            // Phrase et incrémentation
                            printf("Quel est le nombre: ");
                            scanf("%d"‚ &nombreEntre);
                            nbCoups++;

                           // Les conditions
                            if (nombreMystere > nombreEntre)
                                printf("C'est plus !\n\n");
                            else if (nombreMystere < nombreEntre)
                                printf("C'est moins !\n\n");
                            else
                                printf("Bravo‚ vous avez trouve le nombre mystere en %d coups !!\n\n"‚ nbCoups);
                               
                       } while (nombreEntre != nombreMystere);   
                       
                       system("pause");
                       system("CLS");
                  }

                  // ––––––––––––––––––––––––
                  // Le mode multijoueur
                  void multijoueur()
                  {
                       int nombreMystere‚ nombreEntre‚ nbCoups=0;
                       
                       // On boucle tant que le joueur n'a pas saisi un nombre correct
                       do {
                          printf ("Joueur 2‚ veuillez rentrez un nombre entre 1 et 100: ");
                          scanf("%d"‚ &nombreMystere);
                         
                          if( nombreMystere > 100)
                              printf("Attention! Vous avez rentrer un nombre plus grand que 100! \n Veuillez recommencer \n");
                         
                       } while(nombreMystere > 100);
                       
                       // On efface la console !! (ca serait dommage de voir la bonne réponse ;)
                       system("CLS");
                       
                       do
                       {
                            // Phrase et incrémentation
                            printf("Quel est le nombre: ");
                            scanf("%d"‚ &nombreEntre);
                            nbCoups++;

                            // Les conditions
                            if (nombreMystere > nombreEntre)
                                 printf("C'est plus !\n\n");
                            else if (nombreMystere < nombreEntre)
                                 printf("C'est moins !\n\n");
                            else
                                 printf("Bravo‚ vous avez trouve le nombre mystere en %d coups !!!\n\n"‚ nbCoups);
                       } while (nombreEntre != nombreMystere);
                       
                       system("pause");
                       system("CLS");
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 décembre 2006 à 12:04:33

                    Merci beaucoup mais j'ai essayé de faire un projet: plusoumoins.dev avec dedans main.c solo.c et multi.c

                    Solo.c c'est le code solo que tu m'as donné.
                    multi.c c'est le code multi que tu m'as donné.
                    main.c c'est le code avant solo et multi.

                    Lorsque je compile j'ai un erreur sur la ligne de la fonction main.
                    Voici les erreurs:

                    Citation : Erreur


                    Stray \130 in program
                    Syntax error before char
                    In function main
                    Stray \130 in program
                    invalid operands to binary &
                    [build error] [main.o] Error1

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 décembre 2006 à 12:18:06

                      C'est à cause du forum il me semble.

                      J'ai eu le même problème en faisant un "copié collé" de ton code, car apparement les & et les % sont différents.

                      Retape les lignes qui posent problèmes.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 décembre 2006 à 13:46:10

                        En effet j'ai re écrit le ligne de la fonction main et quelque scanf et sa marche... enfin des erreurs sont enlevé.

                        Lorsque je compile j'ai une erreur dans solo.c au niveau des définitions des variables :-°
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 décembre 2006 à 10:16:45

                          Up!

                          J'ai réécris toutes les lignes qui ne marchaient pas et bizarrement sa marche mais il me reste toujours un petit problème mais bien génant.

                          Lors du mode 2 joueurs, je demande que le joueur 2 rentre le nombre mystere.
                          il tape 54 par exemple et appuie sur entrer mais la... rien ne se passe! il est obligé de retaper une deuxième fois le nombre pour que le scanf soit pris en charge.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 décembre 2006 à 19:56:39

                            Content de te revoir vicovni sur les forums C/C++ , enfin moi apres ma formation flash,xml ( mon stage de 3° ^^ lol ) faudrat que je my remetre ;)

                            Cependant je peux pas te repondre !
                            Bonne continuation



                            ²
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 décembre 2006 à 20:56:29

                              Aider moi.
                              Je suis tout le temps obligé d'écrire 2 fois le nombre mystere que le joueur 2 doit donner lors du mode 2 joueurs
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Fonctionnalité du plus ou moins

                              × 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