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
-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
A voir également:
- Quelqu'un qui si connait en code c pourrait m'aider svp
- Le code ascii en informatique - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
- Code gta 4 ps4 - Guide
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 166
1 juin 2015 à 19:34
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.
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é.
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é.
-L0Lock-
Messages postés
5998
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 166
1 juin 2015 à 21:33
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.
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.
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
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
chris79
Messages postés
97
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
25
1 juin 2015 à 21:49
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 :
Par :
(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 ^^
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 ^^
-L0Lock-
Messages postés
5998
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 166
2 juin 2015 à 00:50
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. ^^'
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
2 juin 2015 à 13:38
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() :
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,
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,
-L0Lock-
Messages postés
5998
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 166
2 juin 2015 à 16:51
2 juin 2015 à 16:51
Il y a un problème avec ta balise code, manque la fermeture pour qu'elle marche. ^^
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
-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
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.
C'est pour montrer comment ça s'utilise ;-). D'ailleurs la balise de fermeture est bien présente.
-L0Lock-
Messages postés
5998
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 166
2 juin 2015 à 18:10
2 juin 2015 à 18:10
Je parle de là :
Je pense pas que tu ais ouvert la balise code pour ne pas la fermer après ledit code justement.
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.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
-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
2 juin 2015 à 18:43
Ah oui. Tout juste :-).
-L0Lock-
Messages postés
5998
Date d'inscription
dimanche 10 février 2013
Statut
Membre
Dernière intervention
18 mars 2018
1 166
Modifié par -L0Lock- le 2/06/2015 à 20:29
Modifié par -L0Lock- le 2/06/2015 à 20:29
ze zui drop vort! :o)