Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP: Plus ou Moins Solution et Suggestions

Suggestions

    22 juillet 2019 à 23:34:15

    Bonjour,

    Voici une proposition de code pour le jeu "Plus ou Moins" avec toutes les options. J'aurai aimé avoir des suggestions pour améliorer mon code si vous  avez des idées. Je débute tout juste.

    Merci d'avance !

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main()
    {
        int continuer=1;
    
        do
        {
        int nombre=0, nombreMystere=0, coups=0;
        int mode=0, niveau=0 ;
        int MAX = 100;
        const int MIN = 1;
    
        srand(time(NULL));
        nombreMystere = (rand()%(MAX-MIN+1))+MIN;
    
    
        {
        printf("\n******Jeu: Plus ou Moins*****\n\n");
        printf("======MENU======\n");
        printf("1. MODE SOLO\n");
        printf("2. MODE 2 JOUEURS\n");
        printf("Choix: ");
        scanf("%d",&mode);
        }
        {
        printf("\nChoisissez un niveau\n");
        printf("1.Facile (1 - 100)\n");
        printf("2.Avance (1 - 1000)\n");
        printf("3.Giga dur (1 - 10 000)\n");
        printf("Choix: ");
        scanf("%d", &niveau);
        }
    
        if (mode==2)
            {
            printf("\nLe 1er joueur ecrit le nombre mystere puis appuie sur la touche 'entree':\n");
            printf("Nombre mystere: ");
            scanf("%d",&nombreMystere);
            }
    
        if (niveau==2)
            {
                 MAX=1000;
            }
        if (niveau==3)
            {
                MAX=10000;
            }
    
        coups=0;
        system("cls");
    
        do
        {
            printf("Quel est le nombre mystere?\n");
            scanf("%d",&nombre);
            coups++;
        if (nombre > nombreMystere)
            printf("C'est moins!\n");
        else if (nombre < nombreMystere)
            printf("C'est plus!\n");
        else
            printf("\nBravo, vous avez trouve le nombre en %d coup(s)!\n\n", coups);
        } while (nombreMystere != nombre);
    
        printf("Souhaitez-vous continuer?( 1=OUI. 0=NON )\n");
        scanf("%d", &continuer);
        if (continuer==1)
        {
            system("cls");
        }
        } while (continuer==1);
    return 0;
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      24 juillet 2019 à 10:08:10

      Salut,

      Voici mes propositions d'amélioration :

       - Indenter le code (tout le monde va te le dire)

       - Faire respirer ton code (ajouter des espaces et sauts de ligne, je trouve que c'est plus lisible)

       - Les variables en majuscule devraient être des constantes

       - Un bloc anonyme (si on les appelles comme ça) est à éviter, puisqu'il n'a qu'un aspect visuel. A remplacer par un commentaire donc. (Si l'idée d'un tel bloc est de pouvoir déclarer la même variable deux fois, il faut juste changer le nom de sa variable, ou réutiliser l'ancienne... Mais pas utiliser un bloc)

       - utiliser EXIT_SUCCESS au lieu de 0 pour le retour (question de lisibilité)

       - srand(time(NULL)) doit être fait une fois. Donc il ne devrait pas être dans la boucle

       - Eviter les appels systèmes (ça donne des codes non portables)

       - utiliser un switch au lieu de if à répétition (ou au moins utiliser des else if). Bon, tu n'as que deux cas, donc on peut se contenter d'un if...else if...

       - Toujours utiliser des accolades après un if, même pour une seule ligne. Ca ne coûte pas grand chose, ça évite les erreurs et améliore la lisibilité. Si tu veux être plus concis, tu peux utiliser ce style :

      if (nombre > nombreMystere) {
          printf("C'est moins!\n");
      } else if (nombre < nombreMystere) {
          printf("C'est plus!\n");
      } else {
          printf("\nBravo, vous avez trouve le nombre en %d coup(s)!\n\n", coups);
      }

      Voilà, c'est tout ce que j'ai trouvé. Ca reste globalement de l'ordre du détail, mais c'est très agréable quand un développeur respecte ces 'règles', pour lui-même et pour ceux qui relisent le code.

      Il faut également savoir qu'il y a des raisons pratiques pour certains styles de codage. Tu peux aller visiter des projets open-source et tu verra que chacun a sa propre convention, et souvent les raisons de ces choix sont expliquées.

      Voici ton code modifié à ma sauce :

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      #define MIN 1
      #define MAX 100
       
      int main()
      {
          srand(time(NULL));
          
          int continuer = 1;
          do
          {
              int nombre=0, nombreMystere=0, coups=0;
              int mode=0, niveau=0;
              int max = MAX;
            
              nombreMystere = (rand() % (max - MIN + 1)) + MIN;
         
              // ...
              printf("\n******Jeu: Plus ou Moins*****\n\n");
              printf("======MENU======\n");
              printf("1. MODE SOLO\n");
              printf("2. MODE 2 JOUEURS\n");
              printf("Choix: ");
              scanf("%d",&mode);
      
              // ...
              printf("\nChoisissez un niveau\n");
              printf("1.Facile (1 - 100)\n");
              printf("2.Avance (1 - 1000)\n");
              printf("3.Giga dur (1 - 10 000)\n");
              printf("Choix: ");
              scanf("%d", &niveau);
      
         
              if (mode == 2)
              {
                  printf("\nLe 1er joueur ecrit le nombre mystere puis appuie sur la touche 'entree':\n");
                  printf("Nombre mystere: ");
                  scanf("%d", &nombreMystere);
              }
         
              if (niveau == 2)
              {
                  max = 1000;
              }
              else if (niveau == 3)
              {
                  max = 10000;
              }
         
              coups = 0;
              system("cls");
         
              do
              {
                  printf("Quel est le nombre mystere?\n");
                  scanf("%d",&nombre);
                  coups++;
                  
                  if (nombre > nombreMystere)
                  {
                      printf("C'est moins!\n");
                  }
                  else if (nombre < nombreMystere)
                  {
                      printf("C'est plus!\n");
                  }
                  else
                  {
                      printf("\nBravo, vous avez trouve le nombre en %d coup(s)!\n\n", coups);
                  }
              } while (nombreMystere != nombre);
         
              printf("Souhaitez-vous continuer?( 1=OUI. 0=NON )\n");
              scanf("%d", &continuer);
              
              if (continuer == 1)
              {
                  system("cls");
              }
          } while (continuer == 1);
          
          return EXIT_SUCCESS;
      }




      • Partager sur Facebook
      • Partager sur Twitter

      J'aime les bandes dessinées, manhuas, manhwas, mangas, comics... Du coup j'ai fait aralosbd.fr !

        24 juillet 2019 à 13:24:00

        Merci beaucoup pour toutes ces précisions !

        Par contre je n'ai pas bien compris à quoi tu fais références quand tu évoques le "bloc anonyme". 

        Pour les "appels système" , je suis pas sûre d'avoir compris non plus. Si c'est en référence aux lignes "system("cls")", il y a t il un autre moyen d'effacer l'écran ? 

        Pour la variable "MAX", je vois que tu l'as transformé en variable "max", pour quelle raison ? Est-ce une manière de pouvoir "désactiver" la constante dans le programme ?

        Dernière chose, est-ce qu'il y a des règles pour l'indentation? Parce qu'à vrai dire j'ai essayé justement d'indenter mon code, mais c'est de manière plutôt aléatoire, selon si je trouve que c'est assez clair pour moi. Il y a-t-il une méthode d'indentation classique ?  

        Merci !

        • Partager sur Facebook
        • Partager sur Twitter
          24 juillet 2019 à 14:00:16

          Un bloc, c'est ce qui se trouve entre deux accolades {} . Dans ton code tu en as, qui ne sont ni des blocs de fonction ni des bloc instructions conditionnelles. 

          Pour les nom en majuscule, on les réserve au constante define. On ne met pas de variable avec des nom entièrement en majuscule.

          L'indentation sert à mieux distinguer les blocs justement. En général même s'il n'y a pas de règle stricte, on décale les instruction à l’intérieur d'un bloc de 4 espaces. Je précise bien qu'il n'y a pas de règle stricte car il y a plusieurs façon de faire, surtout pour le positionnement des accolades.

          Edit : Pour effacer l’écran, il n'y a pas de code portable, d'ailleurs Smiley32 a aussi utilisé system("cls"), la commande cls ne fonctionne que sur windows. 

          -
          Edité par rouloude 24 juillet 2019 à 14:03:35

          • Partager sur Facebook
          • Partager sur Twitter
            24 juillet 2019 à 14:48:00

            Hello,

            Quelques manières d'indenter un code C

            Mais comme l'écrit @rouloude, il n'y a pas de règles strictes. Personnellement, j'ai ma propre manière d'indenter, le but de l'indentation étant que les blocs soient identifiables rien qu'à la vue du code, donc sans même devoir le lire. Par exemple, dans le code modifié par @Smiley32, on voit tout de suite qu'un bloc commence en ligne 57 et se termine en 75.

            -
            Edité par edgarjacobs 24 juillet 2019 à 15:00:27

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              24 juillet 2019 à 15:59:15

              D'accord, je comprends mieux.

              Merci pour les pistes à suivre pour l'indentation @edgarjacobs et @rouloude! 

              • Partager sur Facebook
              • Partager sur Twitter
                24 juillet 2019 à 16:57:31

                Pour les commandes système, je n'ai pas proposé de meilleure solution. Ta solution (et celle que j'ai laissé), ne fonctionnera que sur windows (la commande pour effacer la console sur linux étant 'clear' et non 'cls').

                Une amélioration serait de détecter le système, et utiliser clear/cls en fonction de celui-ci. C'est vite chiant pour que ça fonctionne sur toutes les plateformes. On utilise alors des bibliothèques qui font ce boulot à notre place quand on veux manipuler la console et que ce soit portable.

                • Partager sur Facebook
                • Partager sur Twitter

                J'aime les bandes dessinées, manhuas, manhwas, mangas, comics... Du coup j'ai fait aralosbd.fr !

                  28 octobre 2019 à 18:04:11

                  salut  a vous, en fait je travaille sur le tp plus ou moins et en fouillant j'ai trouvé le code de @smilley32 j'ai essayé de compiler et en fait je constate qu'a chaque fois que j'entre un nombre (même 0) ça me renvoi que "c'est plus" sans arrêt et la ça bloque donc pas possibilité de continuer. je sais pas si c'est moi mais voila..... mais aussi je sais pas trop comment arrivé a la fin du programme quand le joueur choisi de rejouer faire revenir le programme et permettre de jouer, merci d'avance pour l'aide !!!

                  -
                  Edité par RyanKoung 28 octobre 2019 à 18:08:00

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 octobre 2019 à 18:30:59

                    Fait donc ton propre code au lieu de copier des codes sur le net que tu ne comprends pas et qui ne fonctionne peut-être pas !
                    • Partager sur Facebook
                    • Partager sur Twitter

                    TP: Plus ou Moins Solution et Suggestions

                    × 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