Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tp des cours

Ma solution pour les améliorations ;)

    21 décembre 2005 à 22:57:57

    Salut à tous

    Voilà, donc je propose ma solution pour les améliorations du TP de m@t, j'ai tout inclu, ça marche :)

    Ce post a double but : permettre d'offrir une solution à ceux qui n'en ont pas trouvé, et éventuellement qu'un bon programmeur me donne son avis sur mon code ;)

    Voilà donc :

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

    main()
    {
      int nombreMystere;
      int nombreTape;
      int NombreDeCoups;
      int continuer; // variable pour savoir si on rejoue ou pas
      continuer = 1; // boléen
      int VeuxTuContinuer;
      int mode; // mode = 1 >> un joueur ; mode = 2 >> 2 joueurs
      const long MIN = 1;
      int MAX;
      int niveau;
      NombreDeCoups = 0;
     
      // Début du programme
      // Choix entre le mode 1 joueur ou 2 joueurs
     
      printf("Mode un joueur ou 2 joueurs ? \n");
      printf("Tape 1 pour mode un joueur. \n");
      printf("Tape 2 pour mode 2 joueurs. \n");
      scanf("%ld", &mode);
     
      if ( mode == 1 ) {
           printf("Choisissez le niveau de difficulte. \n");
           printf("Tapez 1 pour un nombre entre 1 et 100. \n");
           printf("Tapez 2 pour un nombre entre 1 et 1000. \n");
           printf("Tapez 3 pour un nombre entre 1 et 10000. \n");
           scanf("%ld", &niveau);
         if ( niveau == 1 ) {
              MAX = 100;
         }
         else if ( niveau == 2 ) {
              MAX = 1000;
         }
         else if ( niveau == 3 ) {
              MAX = 10000;
          }
             
      do {
        srand(time(NULL));
        nombreMystere = (rand() % (MAX - MIN + 1)) + MIN; 
       
        do {       
         printf("\n Quel est le nombre ? ");
         scanf("%ld", &nombreTape);
        if ( nombreTape < nombreMystere ) {
             printf("\n C'est plus ;) \n");
             NombreDeCoups++;
             printf("Tu as deja fais %d coups \n", NombreDeCoups);
           }
        else if ( nombreTape > nombreMystere ) {
             printf("\n C'est moins ;) \n");
             NombreDeCoups++;
             printf("Tu as deja fais %d coups \n", NombreDeCoups);
           }
        else if ( nombreTape == nombreMystere ) {
             printf("\n Bien joue, tu as gagne en %d coups \n", NombreDeCoups);
             NombreDeCoups = 0;
             }
       } while ( nombreMystere != nombreTape );
       printf("\n Veux tu rejouer ? (1 pour oui, 2 pour non)");
       scanf("%ld", &VeuxTuContinuer);
        if ( VeuxTuContinuer == 1 ) {
             continuer = 1;
             }
        else if ( VeuxTuContinuer == 2 ) {
             continuer = 0;
             }
     } while ( continuer == 1 );
     
    }

     else if ( mode == 2 ) {
            do {
        printf("Tape un nombre a trouver. \n");
        scanf("%ld", &nombreMystere);
       
        do {       
         printf("\n Quel est le nombre ? ");
         scanf("%ld", &nombreTape);
        if ( nombreTape < nombreMystere ) {
             printf("\n C'est plus ;) \n");
             NombreDeCoups++;
             printf("Tu as deja fais %d coups \n", NombreDeCoups);
           }
        else if ( nombreTape > nombreMystere ) {
             printf("\n C'est moins ;) \n");
             NombreDeCoups++;
             printf("Tu as deja fais %d coups \n", NombreDeCoups);
           }
        else if ( nombreTape == nombreMystere ) {
             printf("\n Bien joue, tu as gagne en %d coups \n", NombreDeCoups);
             NombreDeCoups = 0;
             }
       } while ( nombreMystere != nombreTape );
       printf("\n Veux tu rejouer ? (1 pour oui, 2 pour non)");
       scanf("%ld", &VeuxTuContinuer);
        if ( VeuxTuContinuer == 1 ) {
             continuer = 1;
             }
        else if ( VeuxTuContinuer == 2 ) {
             continuer = 0;
             }
     } while ( continuer == 1 );
         
    }
     
      system("PAUSE");     
      return 0;
    }


    Merci d'avance :)

    ++
    • Partager sur Facebook
    • Partager sur Twitter
      21 décembre 2005 à 23:10:34

      AHHHH
      Comment nommes-tu tes variables malheureux !

      VeuxTuContinuer => veuxTuContinuer

      MAX => nombreMaximum


      Explications : il vaut mieux commencer tes noms de vars par une minuscule.
      Quant à MAX, c'est en majuscules si c une constante. Or ce n'est plus une constante à ce stade, donc nomme ça en minuscules stp !

      Ca ne change rien au résultat de ton programme, mais c important de respecter des conventions de nommage !
      • Partager sur Facebook
      • Partager sur Twitter

      If you'd like to join us, read "How do we work at OpenClassrooms"! :)

        21 décembre 2005 à 23:18:23

        Bonsoir,
        Moi je voulais juste demandé quelque chose ...
        Voilà j'ai travaillé sur le TP, fait les améliorations, etc. Aucun problèmes. Seulement une question, de professionalité ... Voici une partie de mon code source :

        int okMenu = 1;
             do
             {
               long level;
               printf("Bienvenue dans le jeu 'Plus ou Moins'\nLe but est de trouver un nombre myst%cre ... Bonne chance !\n\n", 138);
               printf("=== Menu ===\n\n");
               printf("Choisissez le niveau de jeu :\n");
               printf("1. Niveau 1 (1 - 100)\n");
               printf("2. Niveau 2 (1 - 1000)\n");
               printf("3. Niveau 3 (1 - 10 000)\n\n");
               printf("Choix ?  ");
               scanf("%ld", &level);
               printf("\n\n");
             
               // On définit deux constantes qui seront les limites du nombre aléatoire à générer
               switch (level) {
                    case 1 :
                         numberMax = 100;
                         break;
                    case 2 :
                         numberMax = 1000;
                         break;
                    case 3 :
                         numberMax = 10000;
                         break;
                    default :
                            printf("Erreur ! Veuillez recommencer ...\n\n");
                            okMenu = 0;
               }
             } while (!(okMenu));
             
             const long MIN = 1, MAX = numberMax;


        Je me demandais si le fait de créer un constante ( MAX ) à partir d'une variable ( numberMax ) était correct ?

        Merci d'avance, bonne soirée !
        • Partager sur Facebook
        • Partager sur Twitter
          21 décembre 2005 à 23:43:30

          Voici mon code, qu'en pensez-vous? :p

          J'ai caché, au cas où certains ne veulent pas voir la solution.

          Pour les system("CLS") que j'ai mis, je sais, c'est moche, mais pour le mode multi joueur, j'avais pas vraiment le choix... Ce serait bête que le deuxième joueur voit la réponse directement. :-°
          Secret (cliquez pour afficher)
          #include <stdio.h>
          #include <stdlib.h>
          #include <time.h>

          int main(int argc, char *argv[])
          {
              /* Variables d'options de jeu */
              int difficulte, mode;
              /* Variables nécessaires au jeu */
              int nombre, essai, compteur;
              /* Variables autres */
              int continuer = 1, abandon = 0;
              /* Valeur minimum et maximum du nombre caché */
              int max;
              const MIN = 1;

              srand(time(NULL));

              /* Boucle pour rejouer */
              while(continuer == 1)
              {
                  /* Initialise les variables de jeu */
                  compteur = 0;
                  nombre = 0;
                  essai = 0;

                  /* Initialise la valeur max */
                  max = 0;

                  system("CLS");

                  /* Sélection du mode 1/2 joueur(s) */
                  printf("Quel mode souhaitez-vous?\n\n");
                  printf("\t1 - Mode un joueur\n\t2 - Mode deux joueurs\n\t---------------------\n\t0 - Quitter\n\n");
                  printf("Votre choix: ");
                  scanf("%ld", &mode);
                  system("CLS");
                  switch(mode)
                  {
                      /* Quitte le jeu */
                      case 0:
                          return 0;
                      /* Mode 2 joueurs */
                      case 2:
                          /* Indication de la valeur MAX */
                          printf("Veuillez indiquer la valeur MAX sachant que la valeur MIN est 1.\n (La valeur MAX doit etre strictement superieur a 1)\n\n");
                          do
                          {
                              printf("\tMAX = ");
                              scanf("%ld", &max);
                              printf("\n");
                              if(max <= 1)
                                  printf("La valeur MAX doit etre strictement superieure a 1.\n\n");
                          } while(max <= 1);
                          system("CLS");
                          /* Indication du nombre caché */
                          printf("Veuillez maintenant indiquer le nombre cache.\n (Il doit etre compris entre 1 et %d)\n\n", max);
                          do
                          {
                              printf("\tNombre cache = ");
                              scanf("%d", &nombre);
                              printf("\n");
                              if(!(nombre >= 1 && nombre <= max))
                                  printf("Le nombre cache doit etre compris entre 1 et %d.\n\n", max);
                          } while(!(nombre >= 1 && nombre <= max));
                          system("CLS");
                          /* Affichage de la niveau de difficulté pour le joueur */
                          printf("Niveau de difficulte: Personnalise");
                          break;
                      /* Mode 1 joueur */
                      case 1:
                      default:
                          /* Indication du mode de difficulté */
                          printf("Quelle difficulte souhaitez-vous?\n\n");
                          printf("\t1 - Facile\n\t2 - Moyen\n\t3 - Difficile\n\t-------------\n\t0 - Quitter\n\n");
                          printf("Votre choix: ");
                          scanf("%ld", &difficulte);
                          system("CLS");
                          switch(difficulte)
                          {
                              case 0:
                                  return 0;
                              case 2:
                                  max = 1000;
                                  printf("Niveau de difficulte: Moyen");
                                  break;
                              case 3:
                                  max = 10000;
                                  printf("Niveau de difficulte: Difficile");
                                  break;
                              case 1:
                              default:
                                  max = 100;
                                  printf("Niveau de difficulte: Facile");
                                  break;
                          }

                          /* Sélection "aléatoire" du nombre caché */
                          nombre = (rand()% (max - MIN + 1)) + MIN;
                          break;
                  }
                  /* Aide pour le joueur */
                  printf("\n\tNombre compris entre 1 et %d\n", max);
                  printf("\tTappez 0 pour abandonner.\n\n");
                  while(essai != nombre)
                  {
                      printf("Quel est le nombre? ");
                      scanf("%ld", &essai);
                      /* Option pour abandonner */
                      if(essai == 0)
                      {
                          printf("Etes-vous sur(e) de vouloir abandonner?\n\n");
                          printf("\t0 - Non\n\t1 - Oui\n\n");
                          printf("Votre choix: ");
                          scanf("%d", &abandon);
                          printf("\n");
                          if(abandon == 1)
                          {
                              printf("La reponse etait: %d\n\n", nombre);
                              essai = nombre;
                          }
                      }
                      else
                      {
                          compteur++;
                          if(essai < nombre)
                              printf("C'est plus!\n");
                          else if(essai > nombre)
                              printf("C'est moins!\n");
                          else
                          {
                              if(compteur == 1)
                                  printf("\nBravo, vous avez trouve le nombre cache en %d coup!\n\n", compteur);
                              else
                                  printf("\nBravo, vous avez trouve le nombre cache en %d coups!\n\n", compteur);
                          }
                      }

                  }
                  /* Demande pour relancer le jeu */
                  printf("Voulez-vous continuer?\n");
                  printf("1 - Oui\t\t2 - Non\n\n");
                  printf("Votre choix: ");
                  scanf("%ld", &continuer);
                  printf("\n");
              }
              return 0;
          }
          • Partager sur Facebook
          • Partager sur Twitter
            22 décembre 2005 à 0:06:50

            Pour l'histoire de la constante variable. Non, c'est trop gore de faire ça. ;) Pour les conventions de nommage qu'utilise m@t ce sont les conventions Java à la base, traditionnellement, en C on ne nomme pas comme ça mais bon...
            • Partager sur Facebook
            • Partager sur Twitter
              22 décembre 2005 à 8:12:14

              Citation : M@teo21

              AHHHH
              Comment nommes-tu tes variables malheureux !

              VeuxTuContinuer => veuxTuContinuer

              MAX => nombreMaximum


              Explications : il vaut mieux commencer tes noms de vars par une minuscule.
              Quant à MAX, c'est en majuscules si c une constante. Or ce n'est plus une constante à ce stade, donc nomme ça en minuscules stp !

              Ca ne change rien au résultat de ton programme, mais c important de respecter des conventions de nommage !



              Ok, j'y penserai la prochaine fois :)
              • Partager sur Facebook
              • Partager sur Twitter
                22 décembre 2005 à 9:14:59

                Salut à tous, moi j'ai une petite question. Voilà pour l'instant mon code qui marche. A noter que j'ai préféré faire une while car c'est à mon habitude :


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

                int main(int argc, char *argv[])
                {
                  long const MAX = 100, MIN = 1;
                  long NombreMystere, VotreNombre;
                  long NmbrCoups = 0;
                  srand(time(NULL));
                  NombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
                  printf("Quel est le nombre ? ");
                  scanf("%ld",&VotreNombre);
                  while (VotreNombre != NombreMystere)
                  {
                        NmbrCoups++;
                        if (VotreNombre > NombreMystere)
                        {
                                        printf("C'est moins !\n\n");
                                        printf("Quel est le nombre ? ");
                                        scanf("%ld",&VotreNombre);
                        }
                        else if (VotreNombre < NombreMystere)
                        {
                                        printf("C'est plus !\n\n");
                                        printf("Quel est le nombre ? ");
                                        scanf("%ld",&VotreNombre);
                        }
                  }
                  printf ("Bravo, le nombre mystere etait %ld et vous l'avez trouve en %ld coups\n",NombreMystere,NmbrCoups);
                  system("PAUSE");
                  return 0;
                }


                Donc voilà, mon code marche mais j'ai un petit soucis :
                J'ai remplacé le system("PAUSE"); par un getchar(); pour que ce soit compatible à tous, mais il ne me prend pas en compte mon getchar(); et quitte le programme. Quel est le probléme ?
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  22 décembre 2005 à 9:40:19

                  Le problème est (cette saloperie de) scanf qui laisse des caractères traîner dans l'entrée standard (c'est un flux qui amène dans l'ordre toutes les données tapées sur le clavier), ce qui fait que le getchar lit tout de suite quelque chose, et que le programme se finit immédiatement.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 décembre 2005 à 9:53:32

                    Arf ok Bigloo. D'ailleur, je peux optimiser mon code en mettant mon scanf et mon deuxiéme printf au début de la boucle.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 décembre 2005 à 10:06:18

                      Tu peux remplacer tes scanf par des VotreNombre = getchar(); ou VotreNombre = getc(stdin); et je pense que ton getchar() marchera à la fin ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        22 décembre 2005 à 10:08:17

                        NaN (enfin je crois).

                        getchar ne "marche" pas comme ça, et de plus récupère un caractère, pas un nombre.

                        Amusez vous à coder votre propre fonction getx, comme rz0

                        Edit : maintenant getchar fonctionne comme ça (c'est de la triche d'éditer ses messages)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 décembre 2005 à 13:43:36

                          Bigloo >> ui je m'étais planté et l'ai vu en relisant mon mess une fois posté :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 décembre 2005 à 18:48:12

                            Un suggestion d'améiorations du code.
                            Pour définir MAX, à la place de ces if successif, faites:
                            MAX = 10 * 10 puissance niveau
                            Ce qui donnera 100 pour le niveau 1, 1000 pour le 2, 10000 pour le 3 et tu accède ainsi à une infinité de niveau :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 décembre 2005 à 17:12:28

                              Citation : rzo

                              Pour l'histoire de la constante variable. Non, c'est trop gore de faire ça. ;) Pour les conventions de nommage qu'utilise m@t ce sont les conventions Java à la base, traditionnellement, en C on ne nomme pas comme ça mais bon...



                              --> peux-tu développer plz ? :)
                              Quelles sont alors les "vraies" conventions de nommage pour le C ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 décembre 2005 à 17:49:58

                                Bonjour,
                                vraiment pas mal le mode deux joueurs mais c'est embêtant comme système, il faudrait essayer de le faire en réseaux, voilà déjà le code du server ( qui peut-être amélioré ).

                                Voilà le code en secret pour ceux que ça n'interresse pas :)

                                Secret (cliquez pour afficher)
                                #include <stdio.h>
                                #include <time.h>
                                #include <stdlib.h>
                                #include <winsock2.h>
                                #include <urlmon.h>

                                #pragma comment(lib, "ws2_32.lib")
                                #pragma comment(lib, "urlmon.lib")

                                int main()
                                {
                                int Nombre;
                                bool Fin = false;

                                printf("Entrez un nombre de 0 a 100 : ");
                                scanf("%d", &Nombre);
                                printf("Appuyer sur une touche pour lancer le serveur...\n");
                                getchar();
                                ////////////////////////////////////////////////////////////
                                // Initialisation Winsock ...

                                WSADATA wsaData;
                                int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
                                if ( iResult != NO_ERROR )
                                return 0;
                                printf("\n1 : Winsock initialise");
                                //////////////////////////////////////////////

                                ////////////////////////////////////////////////////////////
                                // Récupération de l'ip Locale
                                in_addr myaddr_in;
                                hostent * host;
                                char szHostName[256];

                                gethostname(szHostName, sizeof(szHostName));
                                host = gethostbyname(szHostName);
                                memcpy(&myaddr_in, host->h_addr, host->h_length);
                                printf("\n2 : Ip locale recupere");

                                ////////////////////////////////////////////////////////////
                                // Creation du socket + vérification si valide

                                SOCKET m_socket;
                                m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

                                if ( m_socket == INVALID_SOCKET ) {
                                WSACleanup();
                                return 0;
                                }
                                printf("\n3 : Socket verifie");
                                ////////////////////////////////////////////////////////////

                                ////////////////////////////////////////////////////////////
                                // Bind le socket
                                sockaddr_in service;

                                service.sin_family = AF_INET;
                                service.sin_addr.s_addr = inet_addr( inet_ntoa(myaddr_in) ); // Local
                                service.sin_port = htons( 27030 );

                                if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
                                closesocket(m_socket);
                                return 0;
                                }
                                printf("\n4 : Socket binde");
                                ////////////////////////////////////////////////////////////

                                ////////////////////////////////////////////////////////////
                                // Ecoute ...

                                if ( listen( m_socket, 1 ) == SOCKET_ERROR )
                                return 0;
                                printf("\n5 : Client connecte");
                                ////////////////////////////////////////////////////////////

                                ////////////////////////////////////////////////////////////
                                // Accept connections.
                                SOCKET AcceptSocket;

                                AcceptSocket = SOCKET_ERROR;
                                while ( AcceptSocket == SOCKET_ERROR ) {
                                AcceptSocket = accept( m_socket, NULL, NULL );
                                }
                                m_socket = AcceptSocket;
                                printf("\n6 : Socket verifie");
                                send( m_socket, (const char *)Nombre, strlen((const char *)Nombre), 0 );
                                printf("\n7 : Nombre envoye, connection etablie.\n\n");

                                while (!Fin)
                                {
                                int bytesRecv = SOCKET_ERROR;
                                char recvbuf[10];

                                while(bytesRecv <= 0)
                                bytesRecv = recv( m_socket, recvbuf, 32, 0 );

                                if (recvbuf == "moins")
                                printf("Votre amis vient de ce planter, il a mis trop peu !\n");
                                if (recvbuf == "plus")
                                printf("Votre amis est toujours aussi mauvais, il est au dessus de la verite !\n");
                                if (recvbuf == "Fin")
                                {
                                printf("\nLe client vient de deconecter.");
                                Fin = true;
                                }
                                }
                                /////////////////////////////////////////////////////////////

                                return 0; // pour la synthaxe
                                }
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  23 décembre 2005 à 18:22:43

                                  Ouais. Le but c'est de le faire avec les cours de m@téo hein quand même.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 décembre 2005 à 18:52:37

                                    Sa pourrait etre utile neartik, mais apprend a commenter, parce que la je croit que la plupart ne sauront pas l'utiliser. En clair : commente chaque variable ou fonction que tu utilise quand tu fais un truc que l'on a pas encore vu ici.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      23 décembre 2005 à 19:25:18

                                      Nan mais lol, vous allez pas vous mettre aux sockets direct avec cet exemple là. Pas que ça soit super-trop-compliqué, juste que vous avez super-pas le niveau encore. Enfin pour ceux qui suivent le cours de M@téo en tout cas.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 décembre 2005 à 20:21:52

                                        Oui, c'est bien possible que les cours de m@teo ne suffisent pas mais les sockets, quand on débute, consiste à se servir de msdn :) Par exemple ici, je ne me suis pas vraiment écarté du code exemple d'msdn :p
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Tp des cours

                                        × 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