IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème réalisation d'un pendu


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème réalisation d'un pendu
    Bonjour a tous !

    J'aurai besoin de courageux programmeur tel que vous pour résoudre un problème dans mon programme du pendu que je n'arrive pas a régler moi-même . Alors mon programme est fini : on peut jouer, faire une nouvelle partie et il y a les modes 1 et 2 joueurs. Mon problème est au niveau du mode 2 joueurs. Le joueur 1 entre un mot, l'ordi le met en majuscule et le met dans motSecret (le mot a deviner). c'est quand le joueur 2 doit deviner le mot secret qu'il y a un problème : quand il entre une première lettre, qu'elle soit dans le mot ou pas, le programme fait comme si elle n'y était pas. Par contre si, imaginons, que la première lettre que l'on propose est dans le mot, le programme fait comme si elle ni était pas (je sais c'est ce que je viens de dire mais c'est la suite qui est intéréssante ), et si on la repropose comme deuxième lettre, cette fois si le programme "accepte qu'elle soit dans le mot" (le compteur de coups ne diminue pas et la lettre s'affiche dans le mot remplacer par "-------"...).
    Il y a également un problème dans le mode un joueur, lors d'une nouvelle partie, il y a le même problème expliqué ci-dessus...
    Voila mon problème.

    Sinon, j'aimerais que vous, les programmeurs expérimenté(ou pas ), me disent ce que vous pensez de ma façon de programmer (bonne, mauvaise, ce qui faut améliorer... )

    Merci a tous ceux qui s'intérèsseront a moi et qui m'aideront
    Sachez quand meme que j'ai eu du mal alors je me suis aider un peu par le site ou j'apprend le C.

    Bon alors deja voici mon header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char lireCaractere ();
    long nombreAleatoire(long nombreMax);
    char *piocherMot();
    char *choisirMot();
    Ensuite un fichier source contenant certaines fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <ctype.h>
    #include <string.h>
     
    char lireCaractere ()
    {
         long caractere = 0;
     
         caractere = getchar();
         caractere = toupper(caractere);
     
         while (getchar() != '\n');
     
         return caractere;
    }
     
    char *choisirMot()       // le joueur 1 choisi un mot que le joueur 2 devra deviner
    {
         char motChoisi[100];
         char *motDefinitif = NULL;
         long i = 0;
     
         printf("Joueur 1, entre un mot que le joueur 2\n");
         printf("devra deviner : ");
         scanf("%s", motChoisi);
         printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");  /* pour que le joueur 2 ne voit pas
                                                                     le mot du joueur 1 */
     
         for(i = 0 ; i < strlen(motChoisi) ; i++)
         {
               motChoisi[i] = toupper(motChoisi[i]);
         }
     
         motDefinitif = malloc((strlen(motChoisi) + 1) * sizeof(char));
         strcpy(motDefinitif, motChoisi);
     
         return motDefinitif;
    }
    Ensuite le fichier source qui utilise le dictionnaire (j'ai eu du mal alors je me suis aidé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
     
    #include "header.h"
     
    char *piocherMot()
    {
         FILE *dico = NULL;
         long nombreDeMots = 0, numMotChoisi = 0;
         int caractereLu = 0;
         char motPioche[100];
         char *motRetourne = NULL;
     
         dico = fopen("dico.txt","r");
     
         if(dico == NULL)
         {
                 printf("Impossible d'ouvrir le fichier");
         }
     
         do
         {
                 caractereLu = fgetc(dico);
                 if(caractereLu == '\n')
                 {
                                nombreDeMots++;
                 }
         } while (caractereLu != EOF);
     
         numMotChoisi = nombreAleatoire(nombreDeMots);
     
         rewind(dico);
     
         do
         {
                            caractereLu = fgetc(dico);
                            if(caractereLu == '\n')
                            {
                                           numMotChoisi--;
                            }
         } while(numMotChoisi > 0);
     
         fgets(motPioche, 100, dico);
     
         motPioche[strlen(motPioche) - 1] = '\0';
     
         motRetourne = malloc((strlen(motPioche) + 1) * sizeof(char));
     
         strcpy(motRetourne, motPioche);
     
         fclose(dico);
     
         return motRetourne;          
    }
     
     
    long nombreAleatoire(long nombreMax)
    {
        srand(time(NULL));
        return (rand() % nombreMax + 1);
    }
    Et enfin, le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include "header.h"
     
    int main(int argc, char *argv[])
    {       
      long nouvellePartie = 0;
     
      do
      {        
      char *motSecret;   // mot à deviner
     
      long nombreDeCoups = 10, nombreDeLettres = 0, nombreDeLettresDevinees = 0;
      long lettreEntree = 0, lettreAbsente = 0, partieFinie = 0, nombreDeJoueurs = 0, i = 0, j = 0;
     
      printf("            Le pendu\n\n\n\n"); // titre
     
      printf("Devinez le mot secret en 10 coups maximum.\n\n");
     
      do
      {
     
             printf("Mode 1 joueur ou 2 joueurs ?\n");
             printf("1 : 1 joueur\n2 : 2 joueurs\nReponse : ");
             scanf("%ld", &nombreDeJoueurs);
             printf("\n\n");
     
      } while(nombreDeJoueurs != 1 && nombreDeJoueurs != 2);
     
      if(nombreDeJoueurs == 1)
      {  
               motSecret = piocherMot();
     
               if(motSecret == NULL)
               {
                      exit(0);
               }
      }
      else
      {
               motSecret = choisirMot();
      }
     
      nombreDeLettres = strlen(motSecret);  // nombre de lettre du mot secret
     
     
      char *motDevine = NULL;                                   // allocation dynamique du tableau motDevine
      motDevine = malloc((nombreDeLettres + 1)* sizeof(char));
     
      if(motDevine == NULL)                         // si il y a une erreur
      {
                   exit(0);
      }   
     
      for(i = 0 ; i < nombreDeLettres + 1 ; i++)     // initialise motDevine a "-------"
      {
            motDevine[i] = '-';
     
            if( i == nombreDeLettres )
            {
                motDevine[i] = '\0';
            }
      } 
     
      do                                               // Partie principale du jeu
      {
                      printf("Tu as %ld coups\n", nombreDeCoups);
                      printf("Mot Secret : %s\n", motDevine);
                      printf("Entre une lettre : ");
                      lettreEntree = lireCaractere();
     
                      for( j = 0 ; j < nombreDeLettres ; j++)    // verifie si la lettre entrée est dans le mot ou pas
                      {
                           if( lettreEntree == motSecret[j] )
                           {
                               if( lettreEntree == motDevine[j])
                               {
                                   nombreDeLettresDevinees--;
                               }
                               motDevine[j] = motSecret[j];
                               nombreDeLettresDevinees++;
                           }
                           else
                           {
                               lettreAbsente++;
                           }    
                      }
     
                      if( lettreAbsente == nombreDeLettres )
                      {
                          nombreDeCoups--;
                      }                    
     
                      lettreAbsente = 0;
     
                      printf("\n");
     
                      if (nombreDeLettresDevinees == nombreDeLettres)
                      {
                                   partieFinie = 1;
                      }
                      else if ( nombreDeCoups <= 0)
                      {
                                   partieFinie = 1;
                      }
     
      } while (partieFinie != 1);
     
      if (nombreDeCoups <= 0)                                   // perdu
      {
                        printf("\nDesole tu as perdu (nombre de coups trop eleve).\n");
                        printf("Le mot secret etait : %s\n\n", motSecret);
      }
      else                                                       // gagné
      {
     
                        printf("\n\n        Mot secret : %s\n\n", motSecret);
                        printf("Bravo tu as trouve le mot secret !\n\n");
      }
     
      free(motSecret);            
      free(motDevine);
     
      printf("Une nouvelle partie ? \n");
      printf("1 : oui\n2 : non\nReponse : ");
      scanf("%ld", &nouvellePartie);
      printf("\n\n");
     
      } while(nouvellePartie == 1);    
     
      system("PAUSE");	
      return 0;
    }
    Merci a tous les courageux qui sont arriver jusque la !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Bonjour à toi,

    Alors j'ai lu ton code en diagonale car pas de compilo sous la main.

    C'est pas très propre cette variable "lettreAbsente". Tu fais des ++ pour savoir si oui ou non, la lettre a été trouvé. Utilise là plutôt comme un flag.

    Début lettreAbsente = 0

    Si presente lettreAbsente=1
    Sinon Tu fais rien

    A la fin lettreAbsente == 0 : Non présente
    lettreAbsente == 1 : présente et tu remets lettreAbsente = 0


    Pourquoi utilise tu des long quand des int suffisent.

    Sinon as tu utilisé le deboggeur pour voir ce qui transitait dans tes variables? Car tu as le même bug dans les deux cas. C'est surement du à un probléme d'algo.

    Bon courage



    Et tu remets
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci, de ton aide mais...euh... je sais pas utiliser un débuggeur (j'utilise Dev C++), tu pourrais me dire comment l'utiliser et... a quoi sa sert exactement (en quoi sa pourrais m'aider ?)
    Merci

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Sinon la ou j'ai appris, on ne faisait pas de différence entre un long et un int (puisque la mémoire des ordis sont maintenant largement suffisante) voila pourquoi j'utilise des longs

Discussions similaires

  1. [HOOK] Problème(s) pour réaliser le tutoriel sur les HOOKS
    Par Rodrigue dans le forum C++Builder
    Réponses: 13
    Dernier message: 27/07/2016, 18h22
  2. problème réalisation fichier jar
    Par plawyx dans le forum Général Java
    Réponses: 3
    Dernier message: 08/07/2014, 14h14
  3. Problème: Réalisation d'un pendu
    Par Jenojen dans le forum Débuter
    Réponses: 41
    Dernier message: 14/01/2008, 13h56
  4. Problème à réaliser un Makefile
    Par Goundy dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 05/10/2007, 15h56
  5. Problème sur la réalisation d'une requête
    Par soso78 dans le forum Access
    Réponses: 1
    Dernier message: 06/10/2005, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo