Je débute en C j'essaie de faire le TP du jeu du pendu mais j'ai quelques problèmes.
Mon code n'ai pas fini pour l'instant je veux juste demander au joueur d'écrire une lettre et de lui dire si elle se trouve dans le mot secret ou pas, sauf qu'on m'affiche toujours que la lettre ne se trouve pas dans le mot.
Merci d'avance pour votre aide!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char lireLettre();
char chercheLettre(char lettreEntre, char motSecret[]);
int main()
{ char lettreEntre=0;
char motSecret[]= "AQUARIUM";
printf("Bienvenue au pendu !!\n\n");
printf("Vous devez deviner le mot secret: ********\n");
printf("Proposez une lettre:");
lettreEntre=lireLettre();
chercheLettre(lettreEntre, motSecret);
return 0;
}
char lireLettre()
{
char lettreEntre=0;
lettreEntre = getchar();
lettreEntre = toupper(lettreEntre);
while (getchar()!='\n');
return lettreEntre;
}
char chercheLettre(char lettreEntre, char motSecret[])
{ int i=0, bonneLettre=0;
for (i=0; motSecret[i]!='\0'; i++);
{
if (lettreEntre==motSecret[i])
{
bonneLettre=1;
printf("\nOuiii la lettre %c se trouve dans le mot Secret\n", lettreEntre);
}
else
{
printf("\nEhh non la lettre %c ne se trouve pas dans le mot Secret\n", lettreEntre);
}
}
return bonneLettre;
}
Vu que tu as inclus <string.h> autant utiliser toutes les fonctions à dispositions ta fonction chercheLettre() peut être remplacer par ça ( en suivant ton model ) :
void
isin(char who, char * of) {
if(strchr(of, who))
puts("Blabla elle y est...");
else
puts("Blabla non elle n'y est pas...");
} // En une ligne avec une condition ternaire.
...
isin(lettreEntre, motSecret); // Appel
Merciii beaucoup du coup j'ai modifié mon code, mais j'ai un nouveau problème:
Quand j'entre une lettre on me dit si elle se trouve dans le mot ou pas et on me l'affiche par exemple pour le mot AQUARIUM si j'entre A on me met A**A**** jusque là ça va mais au tour suivant si j'entre Q la lettre A s'efface et on m'affiche *Q******
Je pense que c'est parce que la variable lettrePresente[i] s'actualise a chaque boucle ?? svp comment réparer ça
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char lireLettre();
int chercheLettre(char lettreEntre, char motSecret[], int lettrePresente[]);
int gagner(int lettrePresente[]);
int main()
{ int i=0, bonneLettre=0, lettrePresente[8]={0}, bravo, coupsRestants=10;
char lettreEntre=0;
char motSecret[]= "AQUARIUM";
printf("Bienvenue au pendu !!\n\n");
printf("Vous devez deviner le mot secret: ********\n");
bravo=gagner(lettrePresente);
while (bravo!=0 &&coupsRestants>0)
{
printf("\n\nProposez une lettre:");
lettreEntre=lireLettre();
bonneLettre=chercheLettre(lettreEntre, motSecret, lettrePresente);
if (bonneLettre==1)
{
printf("\nOuiii la lettre %c se trouve dans le mot Secret:", lettreEntre);
}
else
{
printf("\nEhh non la lettre %c ne se trouve pas dans le mot Secret: ", lettreEntre);
coupsRestants--;
}
for (i=0; i<8; i++)
{
if (lettrePresente[i]==1)
{
printf("%c", motSecret[i]);
}
else
{
printf("*");
}
}
}
bravo=gagner(lettrePresente);
if (bravo==0 && coupsRestants>0)
{
printf("\n\nFelicitatiions c'etait bien %s !!! \nVous etes sauvé \n", motSecret);
}
if (coupsRestants==0)
{
printf("\n\nAhahahaha perduu vous allez etre pendu !! \n\n");
}
return 0;
}
char lireLettre()
{
char lettreEntre=0;
lettreEntre = getchar();
lettreEntre = toupper(lettreEntre);
while (getchar()!='\n');
return lettreEntre;
}
int chercheLettre(char lettreEntre, char motSecret[],int lettrePresente[])
{ int i=0, bonneLettre=0;
for (i=0; motSecret[i]!='\0'; i++)
{
if (lettreEntre==motSecret[i])
{
bonneLettre=1;
lettrePresente[i]=1;
}
else
{
lettrePresente[i]=0;
}
}
return bonneLettre;
}
int gagner(int lettrePresente[])
{ int bravo=0, i=0;
for(i=0; i<8;i++)
{
if (lettrePresente[i]==0)
{
bravo=1;
}
}
return bravo;
}
Bien vu le code, je suis sûr que c'est vachement clair pour un débutant qui en est au pendu. Surtout sans le moindre commentaire.
Plutôt que de travailler avec une chaine de char et une chaine de "mémo", il sera plus simple de travailler directement sur 2 chaînes de char et d'actualiser directement le mot à trouver :
char aDeviner[20] = "aquarium",
motJoueur[20] = "********";
....
//et la fonction :
char controlLettre(const char* myst, char* play, char lettre)
{
char isInMyst = 0; //si oui ou non on trouve lettre
int wordLength = strlen(myst); //longueur du mot
for(int i=0; i< wordLength; i++)
{
if(lettre == myst[i]) //si lettre dans mystere
{
play[i] = lettre; //on remplace '*' par lettre
isInMyst = 1; //on a trouvé lettre
}
}
return isInMyst;
}
//Puis dans ton code :
if (controlLettre(aDeviner, motJoueur, lettre);
printf("Tu as trouvé le %c !!\n", lettre);
else
printf("Désolé, %c n'est pas dans le mot mystere.\n", lettre);
puts(motJoueur);
etc...
Tu te compliques un peu trop la tâche, une façon de faire :
Merci mais je viens de débuter y'a environ de 2 semaines donc j'arrive pas a comprendre ton code :/
drx a écrit:
Plutôt que de travailler avec une chaine de char et une chaine de "mémo", il sera plus simple de travailler directement sur 2 chaînes de char et d'actualiser directement le mot à trouver :
Merciii mais cette façon peut marcher même avec le mode 2 joueurs et le dico ? parce que je compte l'améliorer après
Oui, cela devrait fonctionner quelque soit le mot mystère. Il y a cependant une chose que la fonction ne contrôle pas pour être plus robuste : Il faudrait vérifier que les 2 mots ont bien la même taille.
Avec l'habitude, tu apprendras à faire des fonctions génériques. Cela signifie qu'elles doivent faire le boulot quoiqu'il arrive.
Ok merci mais en fait j'aimerai bien comprendre pourquoi la variable lettrePresente dans mon code s'actualise à chaque fois parce que je pense que si elle ne s'actualisait pas mon code pourrait marcher non ?
Tu dois le supprimer pour fixer le problème, il ne sert à rien.
Tu as un autre problème, quand l'utilisateur a trouvé toutes les lettres du mot caché, le programme continue à lui demander de lui proposer une lettre.
Pour fixer ce problème l'expression ligne 17 et ligne 46 :
bravo=gagner(lettrePresente);
Doivent être supprimées et une seule expression doit être mise en dernière instruction de la boucle :
while (bravo!=0 &&coupsRestants>0)
Lors de la déclaration de bravo, la variable doit être initialisée à 1.
Pour assimiler le langage pas longtemps ( Instructions, Types, Opérat... ), mais pour tous ce qui en découle autour ( Thread, Gestion avancée de la mémoire, Tris, recherches et structuration des données, Entrées-sorties, Flux de données, Descrip... ) c'est loin d'être acquis.
(Hors sujet: ça t'as pris combien de temps pour apprendre le langage C ?)
- Edité par Lynnia il y a environ 1 heure
Au final, on n'arrête jamais d'apprendre le C. Déjà parce que tous les 10 ans environ il y a une mise à jour de la norme (la prochaine à l'horizon 2022 ... peut-être). Le langage n'est pas «fondamentalement» remanié depuis C99 et ne semble ni devoir ni en chemin de l'être (quoique je m'avance ^_^).
Mais C n'est qu'un langage, et il y a tout ce qu'il y a autour
les compilateurs (abus de langages), certains ont des particularités parfois utiles dans certaines circonstances
la bibliothèque standard, idem, il en existe plusieurs versions avec des particularités
la plateforme, celle de développement et celle d'exécution (on ne fera pas les mêmes choses sous windows et mac de la même manière)
les outils dédiés : debuger, mem profiler, sanitizer, beautifier, couverture de code, prouveurs, ...
la conception/modélisation, étape importante souvent négligée
l'algorithmique, la culture G du développement, souvent négligée aussi
...
donc non, on ne finit jamais d'apprendre
First solve the problem. Then, write the code. ~ John Johnson
Jeu du pendu: Affichage d'étoiles
× 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.
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.