#26 Le 11/11/2007, à 10:54
- darky0505
Re : Problème de compilation ... de segmentation
tu initialises nbErreur à 0 et tu fais
while (nbErreur>=0)
et dans ton while/else :
nbErreur++;
Je vois pas trop à quoi sert ton nbErreur de ce fait puisqu'il est toujours >= 0
Ton programme s'arrete seulement quand on trouve le mot, et pas quand on arrive au nombre d'erreurs max.
Pour ton erreur à l'execution, je vais déjeuner et je regarde ca après
DarkY
Hors ligne
#27 Le 11/11/2007, à 10:59
- --jb63--
Re : Problème de compilation ... de segmentation
Pas faux ! ... je corrige ça déja
Vas y ... j'te laisse déjeuner ! ... prends ton temps ...
#28 Le 11/11/2007, à 13:04
- darky0505
Re : Problème de compilation ... de segmentation
sorry pour le temps de réponse j'ai eu qq trucs à faire.
bon il a fallut que je pige un peu ce que tu as voulu faire, voici ce que je te propose, ajouter un flag qui indique si on a une erreur (flagerreur), et ajouter un flag qui indique si on a trouvé une lettre (flagtrouve)
Jte poste ton code modifié, en ce sens :
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void pendu (void)
{
char motAdeviner[27], motAdevinerC[27], remplissage[27], proposition[27];
char c, rep, modeAffichage;
int etape, l, i, etapeCourante=1, etapeRestante, modeJeu, nbErreur=0, nbChance=11;
int flagerreur, flagtrouve;
printf("\n---------------------------------------------------------------------------------\n");
printf("Donnez le mot a deviner : ");
scanf("%s",motAdeviner);
printf("\nMode de jeu : \n- [1] par nombre d'erreurs (maximum de 11 erreurs) \n- [2] par nombre d'etapes (fixe par les joueurs) \n\t Choisissez votre mode de jeu : ");
scanf("%d",&modeJeu);
if (modeJeu==1){
l=strlen(motAdeviner);
printf("\n\n\nMot recherche : ");
for (i=0;i<l;i++)
remplissage[i]='-';
remplissage[l]='\0';
printf("%s\n\n", remplissage);
printf("Vous disposez d'un maximum de 10 erreurs autorisees avant d'etre pendu pour trouver ce mot compose de %d caracteres !\nLa partie commence ... Bonne chance !\n",i);
while (nbErreur<=10){
flagtrouve = 0;
printf("\nEtape : %d\n", etapeCourante);
printf("Proposez une lettre : ");
scanf("%*c%c",&c);
for (i=0;i<l;i++){
flagerreur=0;
if (motAdeviner[i]==c){
remplissage[i]=c;
flagtrouve=1;
printf("%s\n\n",remplissage);
if (strcmp(remplissage,motAdeviner)==0){
printf("Bravo !\n");
printf("Vous avez trouve le mot \"%s\" en %d etape(s)\n", motAdeviner, etapeCourante);
exit(1);
}
}
else {
printf("%s\n\n",remplissage);
flagerreur = 1;
}
}
etapeCourante++;
if ((flagerreur == 1) && (flagtrouve == 0)){
flagerreur=0;
nbErreur++;
printf("nombre d'erreurs : %d\n", nbErreur);
}
}
if (nbErreur > 10)
printf("trop d'erreurs le jeu est termine\n");
}
}
int main (void)
{
pendu();
return 0 ;
}
Bien sûr il existe d'autres solutions mais je pense que ca fait ce que tu veux (je suis pas sûr )
edit : sorry pour l'indentation ca a merdé quand j'ai validé le post il a mangé mes tabulations, mets le code dans ton éditeur ca ira mieux pour le lire.
Dernière modification par darky0505 (Le 11/11/2007, à 13:08)
DarkY
Hors ligne
#29 Le 11/11/2007, à 14:59
- --jb63--
Re : Problème de compilation ... de segmentation
Ah voila ! en effet ... l'erreur n'est plus la
... le jeu fonctionne casi bien : y'a juste un tout p'tit problème encore
C'est au niveau du mot qui s'affiche au fur et a mesure des étapes ...
Je choisis le mot cd :
Imaginons que j'tape une lettre fausse voici ce que j'obtiens :
Etape : 1
Proposez une lettre : d
--
--
... puis pour une lettre juste :
Etape : 1
Proposez une lettre : d
--
-d
... et encore une lettre fausse :
Etape : 1
Proposez une lettre : d
-d
-d
On dirais pas ... mais faire un 'tit jeu aussi bête que l'pendu c'est pas si facil qu'on l'croit !
#30 Le 11/11/2007, à 15:09
- darky0505
Re : Problème de compilation ... de segmentation
ben ca c'est juste une question d'affichage (que j'ai pas modifié je pensais que tu le ferai )
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void pendu (void)
{
char motAdeviner[27], motAdevinerC[27], remplissage[27], proposition[27];
char c, rep, modeAffichage;
int etape, l, i, etapeCourante=1, etapeRestante, modeJeu, nbErreur=0, nbChance=11;
int flagerreur, flagtrouve;
printf("\n---------------------------------------------------------------------------------\n");
printf("Donnez le mot a deviner : ");
scanf("%s",motAdeviner);
printf("\nMode de jeu : \n- [1] par nombre d'erreurs (maximum de 11 erreurs) \n- [2] par nombre d'etapes (fixe par les joueurs) \n\t Choisissez votre mode de jeu : ");
scanf("%d",&modeJeu);
if (modeJeu==1){
l=strlen(motAdeviner);
printf("\n\n\nMot recherche : ");
for (i=0;i<l;i++)
remplissage[i]='-';
remplissage[l]='\0';
printf("%s\n\n", remplissage);
printf("Vous disposez d'un maximum de 10 erreurs autorisees avant d'etre pendu pour trouver ce mot compose de %d caracteres !\nLa partie commence ... Bonne chance !\n",i);
while (nbErreur<=10){
flagtrouve = 0;
printf("\nEtape : %d\n", etapeCourante);
printf("%s\n\n",remplissage);
printf("Proposez une lettre : ");
scanf("%*c%c",&c);
for (i=0;i<l;i++){
flagerreur=0;
if (motAdeviner[i]==c){
remplissage[i]=c;
flagtrouve=1;
if (strcmp(remplissage,motAdeviner)==0){
printf("Bravo !\n");
printf("Vous avez trouve le mot \"%s\" en %d etape(s)\n", motAdeviner, etapeCourante);
exit(1);
}
}
else {
flagerreur = 1;
}
}
etapeCourante++;
if (flagtrouve == 1)
printf("OK pour la lettre '%c'", c);
if ((flagerreur == 1) && (flagtrouve == 0)){
printf("dommage la lettre '%c' n'apparait pas dans le mot\n", c);
flagerreur=0;
nbErreur++;
printf("nombre d'erreurs : %d\n", nbErreur);
}
}
if (nbErreur > 10)
printf("trop d'erreurs le jeu est termine\n");
}
}
int main (void)
{
pendu();
return 0 ;
}
Pour reprendre ton exemple :
remi@Asus-F9J:~$ ./test
---------------------------------------------------------------------------------
Donnez le mot a deviner : cd
Mode de jeu :
- [1] par nombre d'erreurs (maximum de 11 erreurs)
- [2] par nombre d'etapes (fixe par les joueurs)
Choisissez votre mode de jeu : 1
Mot recherche : --
Vous disposez d'un maximum de 10 erreurs autorisees avant d'etre pendu pour trouver ce mot compose de 2 caracteres !
La partie commence ... Bonne chance !
Etape : 1
--
Proposez une lettre : a
dommage la lettre 'a' n'apparait pas dans le mot
nombre d'erreurs : 1
Etape : 2
--
Proposez une lettre : b
dommage la lettre 'b' n'apparait pas dans le mot
nombre d'erreurs : 2
Etape : 3
--
Proposez une lettre : c
OK pour la lettre 'c'
Etape : 4
c-
Proposez une lettre : z
dommage la lettre 'z' n'apparait pas dans le mot
nombre d'erreurs : 3
Etape : 5
c-
Proposez une lettre : d
Bravo !
Vous avez trouve le mot "cd" en 5 etape(s)
Pour moi ca semble etre ce qu'il faut, à quelques détails d'affichage près
Dernière modification par darky0505 (Le 11/11/2007, à 15:29)
DarkY
Hors ligne
#31 Le 11/11/2007, à 15:53
- AuraHxC
Re : Problème de compilation ... de segmentation
On dirais pas ... mais faire un 'tit jeu aussi bête que l'pendu c'est pas si facil qu'on l'croit !
C'est pour ça qu'avant de coder, il faut passer beaucoup de temps sur la spécification de ton problème, ainsi le codage est plus simple et très souvent avec moins d'erreurs.
Hors ligne
#32 Le 11/11/2007, à 16:08
- darky0505
Re : Problème de compilation ... de segmentation
C'est pour ça qu'avant de coder, il faut passer beaucoup de temps sur la spécification de ton problème, ainsi le codage est plus simple et très souvent avec moins d'erreurs.
ui d'ailleurs la solution que je lui propose c'est un peu du "bricolage", mais bon ca a l'air de faire ce qu'il veut ^^
DarkY
Hors ligne
#33 Le 11/11/2007, à 17:24
- --jb63--
Re : Problème de compilation ... de segmentation
ben ca c'est juste une question d'affichage (que j'ai pas modifié je pensais que tu le ferai )
Umhumh ... ok ... donc par contre c'est pas possible de conserver l'affichage que j'avais au début ?
Etape : 1
Proposez une lettre : d
-d
Parce qu'en fait, si tu veux, j'essaies de comprendre mais j'vois pas pourquoi il n'accepte pas le " printf("%s\n\n",remplissage); " dans le else ...
Tout du moins, lorsqu'il l'accepte, il le marque en double.
Ta solution marcherait nikel sinon ... mais c'est j'comprends pas d'ou vient l'erreur dans la mienne ...
#34 Le 11/11/2007, à 17:27
- --jb63--
Re : Problème de compilation ... de segmentation
AuraHxC a écrit :C'est pour ça qu'avant de coder, il faut passer beaucoup de temps sur la spécification de ton problème, ainsi le codage est plus simple et très souvent avec moins d'erreurs.
ui d'ailleurs la solution que je lui propose c'est un peu du "bricolage", mais bon ca a l'air de faire ce qu'il veut ^^
Oh ba oué, moi il m'convient très bien ton bricolage !
#35 Le 11/11/2007, à 18:24
- darky0505
Re : Problème de compilation ... de segmentation
ben mets ton affichage à la fin de la boucle while, ou alors au début de la boucle while, mais pas dans le else. il sera alors affiché une seule fois par tour, une seule fois par étape.
DarkY
Hors ligne
#36 Le 11/11/2007, à 18:34
- --jb63--
Re : Problème de compilation ... de segmentation
Bah oui .... tsss ... quel imbécile je suis !
Bon bah c'est parfait ... j'ferais ça dans l'train tout à l'heure !
Encore un week-end ou vous m'avez bien aidé !
MERCI une fois de plus
Prochaine épisode : sélection au hasard des mots du dictionnaire dans un fichier .txt pour jouer au pendu !
Les partiels sont finis, j'crois que j'vais trouver le temps de m'entrainer à ça ....
Bonne semaine à tous !
#37 Le 11/11/2007, à 18:36
- darky0505
Re : Problème de compilation ... de segmentation
si tu rencontres un souci hésite pas à demander
DarkY
Hors ligne
#38 Le 11/11/2007, à 18:57
- --jb63--
Re : Problème de compilation ... de segmentation
si tu rencontres un souci hésite pas à demander
Pas d'soucis ... merci
#39 Le 11/11/2007, à 20:36
- darky0505
Re : Problème de compilation ... de segmentation
yop c'est encore moi, j'avais un petit moment alors j'ai réécrit ton programme du pendu à ma façon, si jamais ca peut t'être utile (sinon ben tanpis j'aurai perdu 15Min )
J'espere que les noms de variables seront assez explicites pour la compréhension (quand j'code pour moi c'est encore plus dégueulasse que ca)
J'ai mis un controle sur la saisie, il manque une chose : vérifier qu'une lettre n'a pas déjà été proposée (mais j'ai la flemme)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* utilisation du programme */
void usage(void){
fprintf(stderr, "Utilisation :\n./pendu [mot] [nberreurs]\n");
}
/* affiche la progression du joueur */
char print_progression(char * motadeviner, char * buffer, int nberreurs){
printf("\nVoici votre progression : %s\n", buffer);
(!nberreurs)?
printf("Vous n'avez pas encore commis d'erreur\n"):
(nberreurs == 1) ?
printf("Vous avez commis 1 erreur\n"):
printf("Vous avez commis %d erreurs\n", nberreurs);
return 0;
}
/* fonction qui regarde si la lettre proposee appartient au mot
a deviner, et si le joueur a trouvé le mot */
int comparer(char * motadeviner, char ** buffer, char c){
int i, propositionOK;
propositionOK=2;
for (i=0 ; i<strlen(motadeviner) ; i++){
if (motadeviner[i] == c){
propositionOK = 1;
(*buffer)[i]=c;
}
}
if (strcmp(motadeviner, *buffer) == 0)
return 0;
return propositionOK;
}
/* fonction du jeu du pendu */
void pendu(char * motadeviner, int nberreurspossibles){
char * buffer;
char proposition [5];
int i, nberreurs, comparaison, saisieOK;
buffer = (char *) malloc (sizeof(char)*strlen(motadeviner));
system("clear");
printf("Bienvenue au jeu du pendu\n\n");
printf("Le mot a deviner possede %d caracteres\n", strlen(motadeviner));
for (i=0; i<strlen(motadeviner) ; buffer[i++]='-');
buffer[i]='\0';
for (i=0, nberreurs=0 ; nberreurs < nberreurspossibles ; i++){
(i>0)?print_progression(motadeviner, buffer, nberreurs):printf("A vous de jouer !\n");
saisieOK=0;
while (!saisieOK){
printf("Proposez une lettre : ");
if (fgets(proposition, sizeof(proposition), stdin) != NULL){
char * badchar = strchr (proposition, '\n');
if (badchar)
*badchar='\0';
}
if ( isalpha(proposition[0]) )
saisieOK = 1;
}
comparaison = comparer(motadeviner, &buffer, proposition[0]);
if (!comparaison){
printf("Bravo, vous avez trouve le mot, c'etait bien : %s\n", motadeviner);
break;
}
else if (comparaison == 1){
printf("OK, la lettre %c est dans le mot\n", proposition[0]);
}
else {
printf("Dommage, la lettre '%c' n'est pas dans le mot\n", proposition[0]);
nberreurs++;
}
}
if (nberreurs>=nberreurspossibles)
printf("\nLe jeu est termine, vous avez fait trop d'erreurs !\nIl fallait trouver : %s\n", motadeviner);
}
/* fonction principale */
int main(int argc, char ** argv){
if (argc == 3){
pendu(argv[1], atoi(argv[2]));
}
else{
usage();
}
exit(0);
}
Si tu piges pas quelques chose je t'expliquerai.
edit : enleve la ligne "system("clear")" si t'es sous windows
Dernière modification par darky0505 (Le 11/11/2007, à 20:39)
DarkY
Hors ligne
#40 Le 24/11/2007, à 19:14
- --jb63--
Re : Problème de compilation ... de segmentation
Wooh ... sympa !
J'vais regarder un peu tout ça ... parce que en effet j'avais un peu négliger les fonctions en fait dans mon programme !
J'avais un peu arranger mon programme la semaine d'avant, mais disons que depuis que la période 2 il devient dure de faire mumuze sur le Pc
Merci en tout cas