intégrer le bonhomme du pendu au jeu du pendu en C

intégrer le bonhomme du pendu au jeu du pendu en C - C - Programmation

Marsh Posté le 04-01-2016 à 20:58:29    

Bonsoir,  
j'ai dans le cadre d'un projet d'informatique de réaliser le jeu du pendu. J'ai créer le jeu mais sans le pendu qui evolue a chaque erreur de lettre et je n'arrive pas a savoir comment faire j'ai essayer plusieurs choses comme crée une grille avec les parties du pendu dans chaque case mais je n'arrive pas a attribuer une erreur a une case ou bien une idee je juste faire apparaitre des tirets supplémentaire sur le coté du jeu pour faire un bonhomme mais pareil je sais pas vraiment ou l'intégrer :/
Je tiens a préciser que mon prof m'a beaucoup aidé déjà je n'aurai jamais trouvé tout ça toute seule !
Merci de votre aide !
 
Voila le programme:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
 
int gagne(int lettreTrouvee[]);
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[]);
char lireCaractere();
int lg;
int pos;
FILE *f;
int i;
int main(int argc, char* argv[])
{
    char lettre = 0;
    char motSecret[80];
    srand (time(NULL));
    f=fopen("mots.txt","r" );
     pos=rand()%66+1;
    for (i=1;i<=pos;i++)
        fgets(motSecret,80,f);
    fclose(f);
    lg=strlen(motSecret);
    int lettreTrouvee[9] = {0};
    int coupsRestants = 10;
    int i = 0;
 
    printf("     Bienvenue dans le Pendu !     \n" );
    printf("***********************************" );
 
 
    while (coupsRestants > 0 && !gagne(lettreTrouvee))
    {
        printf("\n\nIl vous reste %d coups a jouer", coupsRestants);
        printf("\nQuel est le mot secret ? \n\n\t\t" );
 
        for (i = 0 ; i < lg ; i++)
        {
            if (lettreTrouvee[i])
                printf("%c", motSecret[i]);
            else
                printf("*" );
        }
 
        printf("\n\nProposez une lettre : " );
        lettre = lireCaractere();
 
 
        if (!rechercheLettre(lettre, motSecret, lettreTrouvee))
        {
            coupsRestants--;
        }
    }
 
 
    if (gagne(lettreTrouvee))
        printf("\n\nBRAVO ! Le mot secret etait bien : %s", motSecret);
    else
        printf("\n\nPerdu ! Le mot secret etait : %s", motSecret);
 
        return 0;
}
 
char lireCaractere()
{
    char caractere = 0;
 
    caractere = getchar();
    caractere = toupper(caractere);
 
 
    while (getchar() != '\n') ;
 
    return caractere;
}
 
int gagne(int lettreTrouvee[])
{
    int i = 0;
    int joueurGagne = 1;
 
    for (i = 0 ; i < lg ; i++)
    {
        if (lettreTrouvee[i] == 0)
            joueurGagne = 0;
    }
 
    return joueurGagne;
}
 
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[])
{
    int i = 0;
    int bonneLettre = 0;
 
 
    for (i = 0 ; motSecret[i] != '\0' ; i++)
    {
        if (lettre == motSecret[i])
        {
            bonneLettre = 1;
            lettreTrouvee[i] = 1;
        }
    }
 
    return bonneLettre;
}
 

Reply

Marsh Posté le 04-01-2016 à 20:58:29   

Reply

Marsh Posté le 04-01-2016 à 21:34:30    

Merci d'utiliser des balises pour le code et surtout des points et virgules dans le message. C'est illisible!

 

En console tu ne peux pas dessiner, faudra essayer de fabriquer un bonhomme avec des caractères.

 

Pour ce qui est du code les variables globales (déclarées avant main()) c'est moche et surtout inutile ici. [Edit: lg est utilisé dans gagne() mais ça peut se changer...] Il faut aussi vérifier que fopen a retourné un résultat valide (non NULL), dans l'état actuell si le fichier n'est pas disponible le programme plante. Si on teste le programme on voit qu'il reste un \n après le mot à deviner.


Message édité par rat de combat le 04-01-2016 à 21:39:17
Reply

Marsh Posté le 04-01-2016 à 21:41:05    

merci pour ces indications je sais que l'on peut pas dessiner j'ai fais un pendu en ASCII avec chaque étape dans des cases d'une tableau, mais je voudrais savoir comment et où je peux intégrer ça dans mon programme, en affichant case par case a chaque erreur de lettre.

Reply

Marsh Posté le 04-01-2016 à 21:52:12    

Tu peux poster le tableau (avec des balises fixed)? Avec le C standard il n'est pas possible d'écrire à un endroit précis de la console, il faut afficher le bonhomme ligne par ligne avec des espaces là où il faut.

Reply

Marsh Posté le 04-01-2016 à 21:58:42    

je pensais a quelque chose comme ça on avait appris a utiliser le gotoxy je sais pas vraiment si je l'utilise bien.
 
 
void dessin(int e)  
 {  
 switch(e)  
  {
 
case 1: gotoxy(3,7);  printf("                        |        \n" );  
      gotoxy(3,8);  printf("                        |\n" );  
      gotoxy(3,9);  printf("                        |\n" );  
      gotoxy(3,10); printf("                        |\n" );  
      gotoxy(3,11); printf("                        |\n" );  
      gotoxy(3,12); printf("                        |\n" );  
      gotoxy(3,13); printf("                        |\n" );  
      gotoxy(3,14); printf("                        |\n" );  
      gotoxy(3,15); printf("                        |\n" );  
      gotoxy(3,16); printf("                        |\n" ); break;
 
case 2: gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |\n" );  
      gotoxy(3,8);  printf("                        |\n" );  
      gotoxy(3,9);  printf("                        |\n" );  
      gotoxy(3,10); printf("                        |\n" );  
      gotoxy(3,11); printf("                        |\n" );  
      gotoxy(3,12); printf("                        |\n" );  
      gotoxy(3,13); printf("                        |\n" );  
      gotoxy(3,14); printf("                        |\n" );  
      gotoxy(3,15); printf("                        |\n" );  
      gotoxy(3,16); printf("                        |\n" ); break;
 
case 3: gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |       |\n" );  
      gotoxy(3,8);  printf("                        |\n" );  
      gotoxy(3,9);  printf("                        |\n" );  
      gotoxy(3,10); printf("                        |\n" );  
      gotoxy(3,11); printf("                        |\n" );  
      gotoxy(3,12); printf("                        |\n" );  
      gotoxy(3,13); printf("                        |\n" );  
      gotoxy(3,14); printf("                        |\n" );  
      gotoxy(3,15); printf("                        |\n" );  
      gotoxy(3,16); printf("                        |\n" ); break;  
 
  case 4:  gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |       |\n" );  
      gotoxy(3,8);  printf("                        |       _\n" );  
      gotoxy(3,9);  printf("                        |      / \\\n" );  
      gotoxy(3,10); printf("                        |      \\_/\n" );  
      gotoxy(3,11); printf("                        |\n" );  
      gotoxy(3,12); printf("                        |\n" );  
      gotoxy(3,13); printf("                        |\n" );  
      gotoxy(3,14); printf("                        |\n" );  
      gotoxy(3,15); printf("                        |\n" );  
      gotoxy(3,16); printf("                        |\n" ); break;  
 
  case 5:  gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |       |\n" );  
      gotoxy(3,8);  printf("                        |       _\n" );  
      gotoxy(3,9);  printf("                        |      / \\\n" );  
      gotoxy(3,10); printf("                        |      \\_/\n" );  
      gotoxy(3,11); printf("                        |       | \n" );  
      gotoxy(3,12); printf("                        |\n" );  
      gotoxy(3,13); printf("                        |\n" );  
      gotoxy(3,14); printf("                        |\n" );  
      gotoxy(3,15); printf("                        |\n" );  
      gotoxy(3,16); printf("                        |\n" ); break;  
 
  case 6:  gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |       |\n" );  
      gotoxy(3,8);  printf("                        |       _\n" );  
      gotoxy(3,9);  printf("                        |      / \\\n" );  
      gotoxy(3,10); printf("                        |      \\_/\n" );  
      gotoxy(3,11); printf("                        |      _|_\n" );  
      gotoxy(3,12); printf("                        |      | |  \n" );  
      gotoxy(3,13); printf("                        |      |_|   \n" );  
      gotoxy(3,14); printf("                        |\n" );  
      gotoxy(3,15); printf("                        |\n" );  
      gotoxy(3,16); printf("                        |\n" ); break;  
 
  case 7:  gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |       |\n" );  
      gotoxy(3,8);  printf("                        |       _\n" );  
      gotoxy(3,9);  printf("                        |      / \\\n" );  
      gotoxy(3,10); printf("                        |      \\_/\n" );  
      gotoxy(3,11); printf("                        |      _|_\n" );  
      gotoxy(3,12); printf("                        |     /| |  \n" );  
      gotoxy(3,13); printf("                        |    / |_|   \n" );  
      gotoxy(3,14); printf("                        |\n" );  
      gotoxy(3,15); printf("                        |\n" );  
      gotoxy(3,16); printf("                        |\n" ); break;  
 
  case 8:  gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |       |\n" );  
      gotoxy(3,8);  printf("                        |       _\n" );  
      gotoxy(3,9);  printf("                        |      / \\\n" );  
      gotoxy(3,10); printf("                        |      \\_/\n" );  
      gotoxy(3,11); printf("                        |      _|_\n" );  
      gotoxy(3,12); printf("                        |     /| |\\\n" );  
      gotoxy(3,13); printf("                        |    / |_| \\\n" );  
      gotoxy(3,14); printf("                        |\n" );  
      gotoxy(3,15); printf("                        |\n" );  
      gotoxy(3,16); printf("                        |\n" ); break;  
 
  case 9:  gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |       |\n" );  
      gotoxy(3,8);  printf("                        |       _\n" );  
      gotoxy(3,9);  printf("                        |      / \\\n" );  
      gotoxy(3,10); printf("                        |      \\_/\n" );  
      gotoxy(3,11); printf("                        |      _|_\n" );  
      gotoxy(3,12); printf("                        |     /| |\\\n" );  
      gotoxy(3,13); printf("                        |    / |_| \\\n" );  
      gotoxy(3,14); printf("                        |       ^\n" );  
      gotoxy(3,15); printf("                        |      /   \n" );  
      gotoxy(3,16); printf("                        |     /     \n" ); break;  
 
  case 10: gotoxy(3,6);  printf("                         _______\n" );  
      gotoxy(3,7);  printf("                        |       |\n" );  
      gotoxy(3,8);  printf("                        |       _\n" );  
      gotoxy(3,9);  printf("                        |      / \\\n" );  
      gotoxy(3,10); printf("                        |      \\_/\n" );  
      gotoxy(3,11); printf("                        |      _|_\n" );  
      gotoxy(3,12); printf("                        |     /| |\\\n" );  
      gotoxy(3,13); printf("                        |    / |_| \\\n" );  
      gotoxy(3,14); printf("                        |       ^\n" );  
      gotoxy(3,15); printf("                        |      / \\\n" );  
      gotoxy(3,16); printf("                        |     /   \\\n" );  
 }  
 }  
 
 
 
 

Reply

Marsh Posté le 04-01-2016 à 22:13:26    

Le code entre balises la prochaine fois...

 

Il manque les break dans le switch:

Code :
  1. switch(e)
  2. {
  3.     case 1: ...........
  4.             ...........
  5.             break;
  6.     case 2: ...........
  7.             ...........
  8.             break;
  9.     case 3: ...........
  10.             ...........
  11.             break;
  12.     etc...
  13. }
 

gotoxy() du moins sous MinGW ça n'existe pas (plus?), quel compilateur utilises-tu?

 

L'idée en soit est bonne, mais pourquoi tout ces espaces? On peut se passer du gotoxy() mais si c'est autorisé et supporté par le compilateur pourquoi pas... Au lieu de faire un switch() on peut faire plus court avec une boucle et un tableau à deux dimensions, mais je ne sais pas si tu as le niveau pour ça. Sur demande je posterai un exemple.


Message édité par rat de combat le 04-01-2016 à 22:14:24
Reply

Marsh Posté le 04-01-2016 à 22:19:08    

on utilise codeblocks et comment faire autrement sinon?
je veux bien un exemple que j'essaie quand même.

Reply

Marsh Posté le 04-01-2016 à 22:21:03    

Sinon ma collègue de projet avait tenté ça:
 
int x,y,choix;
void gotoxy(int x, int y)
{COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void demander() // ??
{ gotoxy(1,22);printf("Entrer une valer entre 1 et 8 " );
 gotoxy(35,22);scanf("%d",&choix);
}
void ecrire(int choix) // ??
{ int i;
 if (choix==1) {gotoxy(1,20);printf ("-----------" );}
 if (choix==2) {for (i=1;i<9;i++) {gotoxy(6,20-i);printf ("|\n" );}}
 if (choix==3) {gotoxy(6,11);printf ("-----------" );}
 if (choix==4) {gotoxy(15,12);printf ("|" );}
 if (choix==5) {gotoxy(15,13);printf ("O" );}
 if (choix==6) {gotoxy(14,14);printf ("/|\\" );}
 if (choix==7) {gotoxy(14,15);printf ("/ \\" );}
 if (choix==8) {gotoxy(1,25);printf("fin du jeu" );}
}

Reply

Marsh Posté le 04-01-2016 à 22:58:38    

Pour la troisième fois, mets ton code entre balises [cpp ] [/cpp ]!
Codeblocks sous Windows c'est MinGW. La solution de ton collègue utilise la Windows-API, ça fonctionne (j'ai pas testé mais à première vue ça paraît correct) mais uniquement sous Windows, alors que le C standard peut aussi se compiler pour fonctionner sous Linux (et à peu près n'importe où ailleurs). Dans le cas présent ce n'est pas important je pense... Par contre la fonction ecrire() est fausse, il n'y a qu'un bout de bonhomme qui est affiché.
 
La solution alternative dont je parlais, c'est un peu plus court. Je compte sur toi pour ne pas copier bêtement sans avoir compris, sinon vaut mieux en rester au switch (avec des break).  
(Je me demande par contre si il n'y a pas une solution plus courte avec switch sans break, mais comme ça je ne vois pas.)
 

Code :
  1. #include <stdio.h>
  2. void afficher(int morceaux)
  3. {
  4.     char bonhomme[11][15]=
  5.     {
  6.         "  _______     ", 
  7.         " |       |    ", 
  8.         " |       _    ", 
  9.         " |      / \\  ", 
  10.         " |      \\_/  ", 
  11.         " |      _|_   ", 
  12.         " |     /| |\\ ", 
  13.         " |    / |_| \\", 
  14.         " |       ^    ", 
  15.         " |      / \\  ", 
  16.         " |     /   \\ "
  17.     };
  18.    
  19.     int i;
  20.    
  21.     if(morceaux>11)
  22.     {
  23.         return;
  24.     }
  25.    
  26.     for(i=0; i<morceaux; i++)
  27.     {
  28.         printf("%s\n", bonhomme[i]);
  29.     }
  30. }
  31. int main(void)
  32. {
  33.     int a;
  34.    
  35.     printf("nombre? " );
  36.     scanf("%d", &a);
  37.    
  38.     afficher(a);
  39.    
  40.     return 0;
  41. }

Reply

Marsh Posté le 05-01-2016 à 14:02:44    

Bonjour, j'ai enfin fini mon programme et reussi a comprendre et adapté votre idée merci beaucoup de votre aide !
Il y a encore quelques défauts assez mince que nous allons reprendre mais le principal est fait.
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include <time.h>
  6. int gagne(int lettreTrouvee[]);
  7. int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[]);
  8. char lireCaractere();
  9. int lg;
  10. int pos;
  11. FILE *f;
  12. int i;
  13. int main(int argc, char* argv[])
  14. {
  15.     char lettre = 0;
  16.     char motSecret[80];
  17.     srand (time(NULL));
  18.     f=fopen("mots.txt","r" );
  19.      pos=rand()%66+1;
  20.     for (i=1;i<=pos;i++)
  21.         fgets(motSecret,80,f);
  22.     fclose(f);
  23.     lg=strlen(motSecret);
  24.     int lettreTrouvee[9] = {0};
  25.     int coupsRestants = 10;
  26.     int i = 0;
  27.     printf("     Bienvenue dans le Pendu !     \n" );
  28.     printf("***********************************" );
  29.     while (coupsRestants > 0 && !gagne(lettreTrouvee))
  30.     {
  31.         printf("\n\nIl vous reste %d coups a jouer", coupsRestants);
  32.         printf("\nQuel est le mot secret ? \n\n\t\t" );
  33.         for (i = 0 ; i < lg ; i++)
  34.         {
  35.             if (lettreTrouvee[i])
  36.                 printf("%c", motSecret[i]);
  37.             else
  38.                 printf("*" );
  39.         }
  40.         printf("\n\nProposez une lettre : " );
  41.         lettre = lireCaractere();
  42.         if (!rechercheLettre(lettre, motSecret, lettreTrouvee))
  43.         {
  44.             coupsRestants--;
  45.         }
  46.         afficher(10-coupsRestants);
  47.     }
  48.     if (gagne(lettreTrouvee))
  49.         printf("\n\nBRAVO ! Le mot secret etait bien : %s", motSecret);
  50.     else
  51.         printf("\n\nPerdu ! Le mot secret etait : %s", motSecret);
  52.         return 0;
  53. }
  54. char lireCaractere()
  55. {
  56.     char caractere = 0;
  57.     caractere = getchar();
  58.     caractere = toupper(caractere);
  59.     while (getchar() != '\n') ;
  60.     return caractere;
  61. }
  62. int gagne(int lettreTrouvee[])
  63. {
  64.     int i = 0;
  65.     int joueurGagne = 1;
  66.     for (i = 0 ; i < lg ; i++)
  67.     {
  68.         if (lettreTrouvee[i] == 0)
  69.             joueurGagne = 0;
  70.     }
  71.     return joueurGagne;
  72. }
  73. int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[])
  74. {
  75.     int i = 0;
  76.     int bonneLettre = 0;
  77.     for (i = 0 ; motSecret[i] != '\0' ; i++)
  78.     {
  79.         if (lettre == motSecret[i])
  80.         {
  81.             bonneLettre = 1;
  82.             lettreTrouvee[i] = 1;
  83.         }
  84.     }
  85.     return bonneLettre;
  86. }
  87. void afficher( int morceaux)
  88. {
  89.     char bonhomme[11][15]=
  90.     {
  91.         "  _______     ",
  92.         " |       |    ",
  93.         " |       _    ",
  94.         " |      / \\  ",
  95.         " |      \\_/  ",
  96.         " |      _|_   ",
  97.         " |     /| |\\ ",
  98.         " |    / |_| \\",
  99.         " |       ^    ",
  100.         " |      / \\  ",
  101.         " |     /   \\ "
  102.     };
  103.     int i;
  104.     if(morceaux>10)
  105.     {
  106.         return;
  107.     }
  108.     for(i=0; i<morceaux; i++)
  109.     {
  110.         printf("%s\n", bonhomme[i]);
  111.     }
  112. }


Reply

Marsh Posté le 05-01-2016 à 14:02:44   

Reply

Marsh Posté le 05-01-2016 à 14:27:51    

Une autre solution pour dessiner ton pendu: faire un tableau de chaque étape (ici, un exemple ou on dessine 3 étapes)

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void afficher(int etat);
  5. int main(int argc, char* argv[]) {
  6.     printf(" *** START ***\n" );
  7.     afficher(0);
  8.     printf("\n *** ***** ***\n" );
  9.     afficher(1);
  10.     printf("\n *** ***** ***\n" );
  11.     afficher(2);
  12.     printf("\n ***  END  ***\n" );
  13. }
  14. void afficher(int etat) {
  15.     char bonhomme[3][11][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.     int  i;
  57.     for (i = 0; i < 11; ++i) {
  58.         printf("%s\n", bonhomme[etat][i]);
  59.     }
  60. }

Tu vois l'idée.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-01-2016 à 14:46:50    

C'est pas mal aussi ! Merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed