Quelqu'un qui si connait en code c pourrait m'aider svp

Résolu/Fermé
aloudi12 - 1 juin 2015 à 19:17
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 - 2 juin 2015 à 20:29
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



A voir également:

4 réponses

-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 155
1 juin 2015 à 19:34
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.
1
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é.
0
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 155
1 juin 2015 à 21:33
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.
0
aloudi12 > -L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018
1 juin 2015 à 21:37
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
0
chris79 Messages postés 91 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
1 juin 2015 à 21:49
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 ^^
0
Merci beaucoup de ton aide, on ne m'avait jamais m'expliquer ça merci beaucoup x)
0
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 155
2 juin 2015 à 00:50
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. ^^'
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
2 juin 2015 à 13:38
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,
0
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 155
2 juin 2015 à 16:51
Il y a un problème avec ta balise code, manque la fermeture pour qu'elle marche. ^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > -L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018
Modifié par fiddy le 2/06/2015 à 17:30
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.
0
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 155
2 juin 2015 à 18:10
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > -L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018
2 juin 2015 à 18:43
Ah oui. Tout juste :-).
0
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 155
Modifié par -L0Lock- le 2/06/2015 à 20:29
ze zui drop vort! :o)
0