Menu

Jeu du pendu en language C [Fermé]

dimitriov 4 Messages postés vendredi 27 août 2010Date d'inscription 28 août 2010 Dernière intervention - 27 août 2010 à 16:36 - Dernière réponse : dwyane346 147 Messages postés dimanche 11 janvier 2009Date d'inscription 6 septembre 2012 Dernière intervention
- 29 août 2010 à 05:23
Bonjour,

j'ai programmer le jeu du "pendu" sous console en C, cepandant ca ne marche pas comme prevu meme si le code me semble logique
Voici mon code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char lireCaractere();



int main()
{

char motSecret[] = "ROUGE" ;
int nbrCoups = 10;
char lettre = ' ';
char *pointeur = NULL;
char chaineSecrete[] = "*****";
int i;



  printf("********PENDU******** \n \n \n \n");

  printf("il vous reste %d coups \n",nbrCoups);
printf("quel est le mot secret %s \n",chaineSecrete);
printf("entrez une lettre \n \n");


while((nbrCoups != 0) && (strcmp(chaineSecrete,motSecret)!= 0 ) )

{


lettre = lireCaractere();

pointeur = strchr(motSecret,lettre);


if(pointeur == NULL)
{

   nbrCoups -- ;
   printf("il vous reste %d coups \n",nbrCoups);
   printf("quel est le mot secret %s \n",chaineSecrete);
   printf("entrez une lettre \n");

}

else
{

for(i=0 ; i<strlen(motSecret) ; i++)
{


    if(lettre == motSecret[i])
     {
       chaineSecrete[i] = lettre;
     }


} //fin for




} // fin else


} // fin de la boucle

if( strcmp(chaineSecrete,motSecret)== 0 )
{
    printf(" vous avez gagne le mot etait bien %s \n",motSecret);
}

else if (nbrCoups == 0)
{
 printf(" vous avez perdu \n ");
}



    return 0;
}




char lireCaractere()
{
    char caractere = 0;

    caractere = getchar();
    caractere = toupper(caractere);


    while (getchar() != '\n') ;

    return caractere;

}



Merci de bien m'indiquer ou se trouve l'erreur




Afficher la suite 

13 réponses

nicolodouma 42 Messages postés lundi 29 juin 2009Date d'inscription 9 janvier 2011 Dernière intervention - 27 août 2010 à 16:44
+3
Utile
C'est quoi qui se passe mal quand tu lances le programme ? Au lieu de donner un gros pâté de code que je n'ai même pas envie de lire, utilise un debugger pas à pas, pour trouver la fonction incriminé, et là tu pourras la poster ;)
Cette réponse vous a-t-elle aidé ?  
Sweedi 53 Messages postés jeudi 26 août 2010Date d'inscription 22 octobre 2010 Dernière intervention - 27 août 2010 à 16:47
+3
Utile
Si t'arrive pas a programmer télécharge des source sa ira plus vite....
de toute façon si on le corrige pour toi sa ne t'apprendra rien !
Cette réponse vous a-t-elle aidé ?  
dimitriov 4 Messages postés vendredi 27 août 2010Date d'inscription 28 août 2010 Dernière intervention - 27 août 2010 à 17:34
+1
Utile
pour halner : au lieu du scanf j'ai utilisé la fonction lireCaractere c est mieu pour les caractere.

pour sweedi: au contraire votre correction m'aidera beaucoup

pour ralpha: pas besoin de te répondre j tignore
0
Utile
1
c marrant t'as pas un seul scanf dans ton truc
Sweedi 53 Messages postés jeudi 26 août 2010Date d'inscription 22 octobre 2010 Dernière intervention - 27 août 2010 à 17:23
lol c'est vrai .... Dimitriov va revoir tes bases....
dwyane346 147 Messages postés dimanche 11 janvier 2009Date d'inscription 6 septembre 2012 Dernière intervention - 27 août 2010 à 17:42
0
Utile
Ton code a l air assez correcte je te test sa tout a l heure et je te dirai se qui ne vas pas
dimitriov 4 Messages postés vendredi 27 août 2010Date d'inscription 28 août 2010 Dernière intervention - 27 août 2010 à 17:58
0
Utile
merci dwyane346
dwyane346 147 Messages postés dimanche 11 janvier 2009Date d'inscription 6 septembre 2012 Dernière intervention - 27 août 2010 à 18:44
0
Utile
/*
** j ai modifier un peu ton code j ai laisse des commentaire
** test moi sa et di moi si sa fai se que tu veux
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char lireCaractere();
int rempliChaineCarEntre(char l, char chaineCarEntre[]);


int main()
{

char motSecret[] = "ROUGE" ;
int nbrCoups = 10;
char lettre = ' ';
char *pointeur = NULL;
char chaineSecrete[] = "*****";
/*
** une chaine de caractaire ou je vais stocker les lettres deja entrer
*/
char chaineCarEntre[nbrCoups + strlen(motSecret)];
/*
** je te conseil de faire un malloc a l avenir
** genre char *chaineCarEntre;
** chainecarEntre = malloc(8 + strlen(motSecret) * sizeof(char*));
** 10 + strlen(motSecret) car il peut faire 9 erreur et trouver le mot sa fai 9 + la longueur du mot + \0
*/


int i;



printf("********PENDU******** \n \n \n \n");

printf("il vous reste %d coups \n",nbrCoups);
printf("quel est le mot secret %s \n",chaineSecrete);
printf("entrez une lettre \n \n");


while((nbrCoups != 0) && (strcmp(chaineSecrete,motSecret)!= 0 ) )

{


lettre = lireCaractere();

pointeur = strchr(motSecret,lettre);


if(pointeur == NULL)
{
//nbrCoups -- ;
if (rempliChaineCarEntre(lettre, chaineCarEntre) == 0) // s il n a pas teste la lettre on decremente
{
nbrCoups -- ;
printf("\nil vous reste %d coups \n",nbrCoups);
printf("quel est le mot secret %s \n",chaineSecrete);
printf("entrez une lettre \n\n");
}
else
{
printf("Vous avez deja teste cette lettre \n");
printf("entrez une lettre \n\n");
}


}

else
{

for(i=0 ; i<strlen(motSecret) ; i++)
{


if(lettre == motSecret[i])
{
chaineSecrete[i] = lettre;
if (rempliChaineCarEntre(lettre, chaineCarEntre) == 0)
{
/*
** je lui precise qu il a trouver une autre lettre
*/
printf("bravo vous avez trouve une lettre suplementaire\n");
printf("quel est le mot secret %s \n\n",chaineSecrete);
}
else
{
printf("Vous avez deja teste cette lettre \n\n");
}


}


} //fin for




} // fin else


} // fin de la boucle

if( strcmp(chaineSecrete,motSecret)== 0 )
{
printf(" vous avez gagne le mot etait bien %s \n",motSecret);
}

else if (nbrCoups == 0)
{
printf(" vous avez perdu \n ");
}



return 0;
}




char lireCaractere()
{
char caractere = 0;

caractere = getchar();
caractere = toupper(caractere);


while (getchar() != '\n') ;

return caractere;

}

/*
** remplie chaineCarEntre a chaque fois qu il tape une lettre qui n est pas deja a l interieur
*/

int rempliChaineCarEntre(char l, char chaineCarEntre[])
{
int i = 0;
while (i < strlen(chaineCarEntre))
{
if (chaineCarEntre[i] == l)
{
return (1);
}
i++;
}
chaineCarEntre[i] = l;
chaineCarEntre[i + 1] = '\0';
return (0);
}
0
Utile
Ou comme ceci:

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

int gagne(int lettreTrouvee[]);
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[]);
char lireCaractere();

int main(int argc, char* argv[])
{
    char lettre = 0;
    char motSecret[] = "ROUGE";
    int lettreTrouvee[6] = {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 < 5 ; 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 < 5 ; 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;
}
dwyane346 147 Messages postés dimanche 11 janvier 2009Date d'inscription 6 septembre 2012 Dernière intervention - 27 août 2010 à 22:23
0
Utile
Le code de halner a l air plus propre , le mien il marche aussi et me suis arranger a ne modifier le moin possible ton code (j ai juste ajoute une fonction et une variable) te conseil de tester les 2 et de prendre celui que tu metrisra le +
dwyane346 147 Messages postés dimanche 11 janvier 2009Date d'inscription 6 septembre 2012 Dernière intervention - 27 août 2010 à 22:38
0
Utile
oups nn je vien de teste ton code halner ya un petit probleme
quand tu tape une mauvaise touche deux fois il decremente le nombre dessai restant , genre tu as gerer le cas juste pour les lettre deja presentes dans le mot .

exemple:


Bienvenue dans le Pendu !
***********************************

Il vous reste 10 coups a jouer
Quel est le mot secret ?

*****

Proposez une lettre : r


Il vous reste 10 coups a jouer
Quel est le mot secret ?

R****

Proposez une lettre : a


Il vous reste 9 coups a jouer
Quel est le mot secret ?

R****

Proposez une lettre : a


Il vous reste 8 coups a jouer // problem
Quel est le mot secret ?

R****

Proposez une lettre : a


Il vous reste 7 coups a jouer // problem
Quel est le mot secret ?

R****

Proposez une lettre : a


Il vous reste 6 coups a jouer // problem
Quel est le mot secret ?

R****

Proposez une lettre : a // problem


Il vous reste 5 coups a jouer // problem
Quel est le mot secret ?

R****

Proposez une lettre :


par contre si je fais


Proposez une lettre : r


Il vous reste 3 coups a jouer // pas de problem
Quel est le mot secret ?

R****

Proposez une lettre : r


Il vous reste 3 coups a jouer // pas de problem
Quel est le mot secret ?

R****

Proposez une lettre : r


Il vous reste 3 coups a jouer // pas de problem
Quel est le mot secret ?

R****

Proposez une lettre : r


Il vous reste 3 coups a jouer
Quel est le mot secret ?

R****


JESPERE QUE J AI BIEN EXPLIQUE
dimitriov 4 Messages postés vendredi 27 août 2010Date d'inscription 28 août 2010 Dernière intervention - 28 août 2010 à 16:47
0
Utile
Ton code marche tres bien dwyane346 cepandant je n'ai pas compris le role de la fonction rempliChaineCarEntre ni comment elle s'exécute.
dwyane346 147 Messages postés dimanche 11 janvier 2009Date d'inscription 6 septembre 2012 Dernière intervention - 29 août 2010 à 05:23
0
Utile
A) Son role
---------------

en faite la fonction rempliChaineCarEntre ajoute chaque lettre taper au clavier dans le tableau char chaineCarEntre[] si et ssi cette lettre ne figure pas deja dans ce tableau;
- si cette lettre est deja dans le tableau ( l utilisateur a deja tente d utilise cette lettre) alors la fonction renvoie 1
sinon (l utilisateur n a jamais essayer cette lettre) la fonction ajoute la lettre et retourn 0

pour resume elle a un double role
1 - ) ajoute chaque nouvelle lettre taper par l utilisateur dans le tableau;
2 - )Verifie si oui ou non la lettre taper par l utilisateur figure dans le tableau

B) Son execution
---------------------
//fonction qui prend la lettre tape par lutilisateur et la chaine ou je stock toutes les lettres qu il a deja tape

int rempliChaineCarEntre(char l, char chaineCarEntre[])
{
int i = 0;
while (i < strlen(chaineCarEntre)) //je parcours la chaine ( chaineCarEntre )
jusqu a la fin
{
if (chaineCarEntre[i] == l) // si la lettre entre se trouve deja a linterieur
je retourne 1
{
return (1);
}
i++;
}
// si la fonction ne s est pas termine c kil na rien retourner (je
comprend alors que la lettre n a jamais ete tape par l utilisateur)

chaineCarEntre[i] = l; // le compteur i est a la position de la dernier lettre +1
de la chaine chaineCarEntre
j ajoute la lettre taper a la fin de mon tableau

chaineCarEntre[i + 1] = '\0'; // je m assure que mon tableau se termine bien par
\0 car si c pas le cas sa peut engendrer
des beugs
return (0);
// je retourne 0 pour dir que la lettre ne se trouvai
pas dans chaineCarEntre et que la lettre a bien
ete ajoute
}

J espere avoir ete assez explicite