Quelqu'un qui si connait en code c pourrait m'aider svp [Résolu/Fermé]

Signaler
-
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
-
Bonjour, j'ai un problème avec mon programme qui exécute un jeu du pendu, je n'est pas beaucoup de temps devant moi, si quelqu'un peut montrer le bout de son nez, je partage le programme sinon tan pis. Merci d'avance



4 réponses

Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 070
Bonjour. Ça irait tellement plus vite si tu expliquais dès le début ton problème, code à l'appui.
Là tu perds du temps à attendre une première réponse, et nous à attendre que tu expliques après t'avoir répondu, et...
Tout ce temps perdu pendant lequel on aurait pu analyser le problème et te donner tout de suite des pistes.
Désolé, c'est mon premier post et je ne savais pas si j'allais avoir une réponse rapide.

Alors pour commencer voici mon programme, c'est un jeu du pendu:

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


int main()//fonction principale
{

char mot[5];
char moti[5];
char lettre;
int success = 0;
int erreur = 0;

mot[0]=80;//P
mot[1]=79;//O
mot[2]=77;//M
mot[3]=77;//M
mot[4]=69;//E


moti[0]='P';
moti[1]='-';
moti[2]='-';
moti[3]='-';
moti[4]='-';


printf("Bienvenue dans le jeu du pendu!\n");
printf("Entrez une lettre en majuscule\n");
printf("Ne rentrez qu'une fois chaque lettre\n");
printf("Tant que vous n'avez pas trouve le mot\n");
printf("ou que vous n'etes pas mort, entrez des lettres\n");
printf("Le mot est P - - - - \n\n");
printf("A vous de jouer:\n\n");


while(success !=3 || erreur !=3 )

{


scanf("%c", &lettre);

if(lettre == 79 || lettre == 77 || lettre == 69)

{

if(lettre==79)
{
moti[1]=79;
printf("Bien joue\n\n ");

int i;
for (i = 0 ; i < 5 ; i++)
{
printf("%c ",moti[i]);
}

success = success+1;

}

if(lettre==77)
{
moti[2]=77;
moti[3]=77;
printf("Bien joue\n\n");

int i;
for (i = 0 ; i < 5 ; i++)
{
printf("%c ",moti[i]);
}

success = success+1;
}

if(lettre==69)
{
moti[4]=69;
printf("Bien joue\n\n ");

int i;
for (i = 0 ; i < 5 ; i++)
{

printf("%c",moti[i]);
}

success = success+1;
}
if(success==3)
{
break;
}


}





else
{



erreur = erreur+1;

{

if(erreur==1)
{
printf("rate\n\n");
printf("----------\n");
}

if(erreur==2)
{
printf("encore rate\n\n");
printf("______________\n |/ |\n | \n | \n | \n | \n | \n_|__________\n\n");
}

if(erreur==3)

{
printf("perdu\n\n");
printf("______________\n |/ |\n | @\n | -|-\n | |\n | |^|\n | - -\n_|__________\n\n");
break;
}

}

}
}
}


Le joueur doit deviner le mot pomme au joueur, si il ce trompe 3 fois on affiche différente image du pendu et si il donne les bonnes lettres, il gagne. 79, 77 et 69 représente les lettres O, M et E en ascii
Il y a différent problème, quand on rentre 1 mauvaise réponse, le programme affiche les printf des if(erreur=1) et if(erreur=2), quand on rentre les 2 premieres reponses quelque soit l'ordre, ca affiche le mot avec la lettre en plus et aussi le raté. Je vois pas ce que j'ai mal fait, je vous remercie de votre spontanéité.
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 070
Question commentaires et indentation, c'est pas fameux...

J'ai fais des tests, j'ai réussi à avoir un bon déroulement de programme en donnant des réponses correctes. Pour cela, j'ai remplacé la structure de condition avec la variable lettre par un switch (lettre). Par-contre, va savoir pourquoi mais il ne se passe rien quand j'entre une mauvaise réponse dans le programme.
>
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018

j'ai enlevé les commentaires, car ils rendaient le visuel assez bizarre, et pour les réponse négatives, il faut remplacer les valeurs de if(erreur=) par if(erreur=2) if(erreur=4) et if(erreur= 6) je sais pas pourquoi ,mais le erreur=erreur+1; marche de 2 en 2, alors que j'ai défini erreur a 0 au début du programme
Messages postés
91
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
17
Salut,

Ton problème vient du fait que lorsque tu rentres un caractère, tu rentres également un retour chariot de valeur 0x0A pour valider: c'est ce dernier caractère qui explique pourquoi tu as une boucle supplémentaire et donc pourquoi tu affiches une erreur. Ce comportement est classique à la fonction scanf et beaucoup se font avoir ;)

Une solution parmi d'autres serait de remplacer :
scanf("%c", &lettre); 

Par :
scanf(" %c", &lettre); 

(Ajout d'un espace avant %c).

Tu peux aussi te pencher vers d'autres fonctions fgets, getchar ou autres...mais il faudra tout de même gérer ce dernier caractère ;)

Sinon comme dit LOlock, un switch case serait tout de même plus joli ^^
Merci beaucoup de ton aide, on ne m'avait jamais m'expliquer ça merci beaucoup x)
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 070
Maintenant que tu le dis, j'avais eu ce problème de caractère en décembre dernier, ça m'était complètement sorti de la tête. ^^'
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 752
Bonjour,

Différents conseils :
scanf("%c", &lettre);
Attention à l'utilisation du scanf("%c",...). Cela engendrera un retour chariot dans le buffer. Pour le vider, tu peux faire un simple getchar() :
scanf("%c",&lettre);
getchar();


mot[0]=80;//P
mot[1]=79;//O
mot[2]=77;//M
mot[3]=77;//M
mot[4]=69;//E

Il vaut mieux faire : mot[0]='P'; etc. C'est plus lisible la manipulation du caractère que le code ascii... Sinon encore mieux : <code c>char mot[]="POMME";

if(lettre==79)
{
moti[1]=79;
[...]

Fonctionnellement c'est bon, mais difficilement maintenable. Il vaut mieux faire une boucle for sur chacune des lettres. Ainsi tu n'as plus qu'à changer le mot sans rien changer d'autres.

Je te conseille l'utilisation de fonctions pour rendre ton code plus lisible.

Enfin, n'oublie pas le return 0; à la fin du main().

Note : pour la prochaine fois, n'oublie pas d'utiliser la balise "code" pour poster ton code. Exemple :
<code c>ici tu mets ton code</code>

Cdlt,
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 070
Il y a un problème avec ta balise code, manque la fermeture pour qu'elle marche. ^^
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 752 >
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018

Si tu parles de la dernière ligne, ce n'est pas une erreur...
C'est pour montrer comment ça s'utilise ;-). D'ailleurs la balise de fermeture est bien présente.
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 070
Je parle de là :
Sinon encore mieux : <code c>char mot[]="POMME";  (...)

Je pense pas que tu ais ouvert la balise code pour ne pas la fermer après ledit code justement.
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 752 >
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018

Ah oui. Tout juste :-).
Messages postés
5965
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 070
ze zui drop vort! :o)