Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le jeu du + ou -

Changer la difficulté en cours de partie

    18 février 2020 à 14:35:31

    Bonjour,

    J'ai une petite difficulté.

    Je souhaiterais, lorsque le joueur ou la joueuse a fait un nombre x de coups ratés, lui proposer de changer la difficulté.

    Mais je n'y arrive pas.

    Voici mon code pour l'instant :

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    //initialisation des variables
    int main ( int argc, char** argv )
    {
        int nombreMystere = 0, nombreEntre = 0, coups = 0, rejouer = 0, difficulte = 2;
        int max = 100;
        const int MIN = 1;
    
        srand(time(NULL));
    
        // Choix Difficulté
    
        do
        {
        printf("Choisissez un niveau de difficulte :\n");
        printf("1 : entre 1 et 10\n2 : entre 1 et 100\n3 : entre 1 et 1000\n");
        scanf("%d", &difficulte);
    
        switch(difficulte)
            {
        case 1:
            max = 10;
            printf("Vous avez choisi le niveau 1 (facile).\n\n");
            break;
        case 2:
            max = 100;
            printf("Vous avez choisi le niveau 2 (intermédiaire).\n\n");
            break;
        case 3:
            max = 1000;
            printf("Vous avez choisi le niveau 3 (abominable).\n\n");
            break;
        default:
            printf("Niveau non reconnu, niveau 1 sélectionné automatiquement (facile).\n");
            max = 100;
        }
    
        // Début de la boucle qui permet de faire plusieurs parties
            coups = 0;
            nombreMystere = (rand() % (max - MIN + 1)) + MIN;
    
            do
            {
                printf("Quel est le nombre ? ");
                scanf("%d", &nombreEntre);
                coups++;
    
                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", coups);
                             if (coups == 3)
               if (coups == 3)
                    printf("Voulez-vous changer de difficulte ? (1 = oui, 0 = non) ");
                    scanf("%d", &rejouer);
    
    
            } while (nombreEntre != nombreMystere);
    
    
            // Fin de la partie, on demande si on veut rejouer
            printf("Voulez-vous faire une autre partie (1 = oui, 0 = non) ? ");
            scanf("%d", &rejouer);
    
    
    
    
    
        } while (rejouer);

    Je sais que le if n'est apriori pas la bonne chose à faire. Mais je ne sais pas où placer cette condition dans la boucle :

    - si je met ce "if..." dans la boucle de jeu, je me retrouve avec le scanf qui fait suer. De plus, ça ne permet pas d'appeler la fonction "rejouer"

    - si je crée un "do...while", je n'y arrive pas non plus. Car elle englobe soit l'ensemble des boucles (donc ça recommence le jeu à 3 coups !), soit le code ne fonctionne pas !

    Je me demande si c'est possible en fait, avec mes connaissances. J'imagine que oui, mais mon cerveau fume pour l'instant, pour quelque chose qui paraît simple !

    • Partager sur Facebook
    • Partager sur Twitter
      18 février 2020 à 16:09:10

      Bonjour,

      Je te conseille de découper ton programme en plusieurs fonctions pour mieux t'y retrouver, je te suggères aussi d'initialiser rejouer à 1 et de ne le mettre à zéro uniquement si l'utilisateur veut quitter, voici ce que ça pourrait donner (mais il y a sans doute mieux) (ah oui et n'oublies pas de faire un return dans ton main) :

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      //prototypes des fonctions utilisees dans le main
      
      int choixDifficulte(void);
      int jouer(int max);
      
      //le main du programme
      
      int main ( int argc, char** argv )
      {
          int max = 100, rejouer = 1, resultatPartie = 0;;
       
          srand(time(NULL));
       
          // boucle principale du programme
       
          while (rejouer)
          {
             max = choixDifficulte(); // ici tu utilises une fonction que tu créera qui demande la difficulté, et qui te renvoie la valeur correspondante pour max
             while (resultatPartie != 2 || resultatPartie != 3) 
                  resultatPartie = jouer(max); //ici tu utilises une fonction que tu créera qui lancera le jeu, en passant la valeur de max pour initialiser le nombre mystère, à la fin de la partie selon ce que l'utilisateur à décidé tu peux renvoyer differentes valeur, par exemple 1 = rejouer la même difficulte, 2 = choisir une nouvelle difficulte et 3 = quitter le jeu
              if (resultatPartie == 3)
                  rejouer = 0;
          }
          return (0);
      }
      
      //tes fonctions
      
      //la fonction qui te permet de parametrer ta valeur max
      
      int choixDifficulte(void)
      {
          (ton code permettant à l'utilisateur de choisir la difficulte, la flemme de le recopier :p)
      
          return max;
      }
      
      //la fonction du jeu qui te renvoie ce que tu dois faire ensuite
      
      int jouer(int max)
      {
         (ton code)
      
         selon les cas tu peux renvoyer la valeur que tu veux a nimporte quel moment (cela arretera l'execution de la fonction, un exemple en pseudo code 
      
         if (le joueur veut changer la difficulte)
             return 2;
      
         if (le joueur veut quitter)
             return 3;
         return 1 (le joueur ne veut ni quitter ni changer la difficulte donc on rejoue)
      }





      edit:

      - en fait en relisant le code, tu n'as pas besoin de savoir la valeur de difficulté en dehors de lors du choix de la difficulté, je modifie mon code exemple du coup, ça sera plus simple sans utiliser de pointeur vers max)


      -j'ai aussi enlever les variables dont on n'a pas besoin au sein du main, tu pourras les déclarer au seins de tes fonctions qui les utiliseront

      -tant qu'a faire je te mets les prototypes des exemple de fonctions avant le main

      - dans ton code, ligne 37 tu indiques à l'utilisateur que son choix n'est pas validé et que le programme applique du coup la difficulté facile, mais ligne 38 tu mets max à 100 ce qui correspond à ta difficulté intermediaire, une autre solution pourrait etre d'englober le tout dans une boucle qui n'en sort que lorque la difficulté est valide du genre :
      difficulte = 0;
      
      while (difficulté < 1 || difficulte > 3)
      {
         printf("Choissisez ...");
         scanf("%d", &difficulte);
         switch (difficulte)
         {
          ...
         }
      }
      idéalement il faudrait aussi empecher l'utilisateur d'envoyer autre chose qu'un int pour eviter qu'il ne fasse crasher le programme voici un petit exmple de comment tu pourrait faire :
      int     main(void)
      {       
              int     a;
      
              if (scanf("%d", &a) != 1) // si l'utilisateur rentre autre chose qu'un int scanf renverra une erreur, si tout s'est bien passé scanf renverra 1
                      a = 0; // si une erreur s'est produite lors du scanf, on mets a à 0
              printf("\n%d\n", a);
              return 0;
      }   



      -
      Edité par aureliencabiac 18 février 2020 à 17:01:08

      • Partager sur Facebook
      • Partager sur Twitter
        18 février 2020 à 17:42:06

        A ta ligne 58, tu as ceci :
        if (coups == 3)
                        printf("Voulez-vous changer de difficulte ? (1 = oui, 0 = non) ");
                        scanf("%d", &rejouer);
         

        Tu as oubliéles les accolades {}. C'est surement cela qui te fait suer.
        .

        Et apres avoir demandé a l'utilisateur de changer de niveau, rien ne se passera et la boucle do{}while va continuer jusqu'a ce que le nombre mystere soit retrouvé. Tu dois ajouter une nouvelle condition d'arret dans ton while, du genre : while(nombreEntre != nombreMystere || rejouer == 1)

        -
        Edité par Asmitta 18 février 2020 à 17:42:57

        • Partager sur Facebook
        • Partager sur Twitter
          18 février 2020 à 23:23:43

          Merci à tous !

          Oui j'oublie plein de choses encore, je n'ai pas bien saisi toutes les possibilités et imbrications de ces boucles et comment me dépêtrer avec tout ça (mais ça viendra !).

          Oui, c'est sûr qu'il faut je fasse mon code plus proprement, et les prototypes vont sûrement m'y aider ! Je les ai appris en attendant une réponse à mon problème ^^.

          Je potasse tous vos codes demain merci encore !

          -
          Edité par Batche 18 février 2020 à 23:34:32

          • Partager sur Facebook
          • Partager sur Twitter
            19 février 2020 à 9:05:54

            Bonjour je voudrais savoir au lieu de prendre max et min comme des constante nous pourrions utiliser la boucle for et initialiser i à 1
            • Partager sur Facebook
            • Partager sur Twitter
              19 février 2020 à 9:50:00

              Hello,

              Je ne suis pas assez compétent pour te conseiller, mais je ne comprends pas cependant trop où tu souhaites en venir ! :s

              Peut-être en écrivant le code pour que d'autres personnes puissent t'aider ?

              -
              Edité par Batche 19 février 2020 à 9:50:20

              • Partager sur Facebook
              • Partager sur Twitter
                19 février 2020 à 10:49:40

                Merci! au fait je voulais passer par une autre méthode mais j'ai vu que sa peut pas se faire avec le do while merci 

                • Partager sur Facebook
                • Partager sur Twitter

                Le jeu du + ou -

                × 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