Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 tongue


DarkY

Hors ligne

#27 Le 11/11/2007, à 10:59

--jb63--

Re : Problème de compilation ... de segmentation

Pas faux ! roll big_smile ... je corrige ça déja wink
Vas y ... j'te laisse déjeuner ! big_smile ... prends ton temps ... tongue

#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 tongue )


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 tongue
... le jeu fonctionne casi bien : y'a juste un tout p'tit problème encore hmm

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 ! big_smile

#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 tongue )

#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 smile

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

--jb63-- a écrit :

On dirais pas ... mais faire un 'tit jeu aussi bête que l'pendu c'est pas si facil qu'on l'croit ! big_smile

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

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 ^^


DarkY

Hors ligne

#33 Le 11/11/2007, à 17:24

--jb63--

Re : Problème de compilation ... de segmentation

darky0505 a écrit :

ben ca c'est juste une question d'affichage (que j'ai pas modifié je pensais que tu le ferai tongue )

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 wink ... 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

darky0505 a écrit :
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 ! big_smile

#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 ! big_smile

Bon bah c'est parfait ... j'ferais ça dans l'train tout à  l'heure !

Encore un week-end ou vous m'avez bien aidé ! tongue
MERCI une fois de plus wink

Prochaine épisode : sélection au hasard des mots du dictionnaire dans un fichier .txt pour jouer au pendu ! tongue
Les partiels sont finis, j'crois que j'vais trouver le temps de m'entrainer à  ça .... roll big_smile

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 smile


DarkY

Hors ligne

#38 Le 11/11/2007, à 18:57

--jb63--

Re : Problème de compilation ... de segmentation

darky0505 a écrit :

si tu rencontres un souci hésite pas à  demander smile

Pas d'soucis smile ... merci wink

#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 smile (sinon ben tanpis j'aurai perdu 15Min tongue)
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 ! wink
J'vais regarder un peu tout ça ... parce que en effet j'avais un peu négliger les fonctions en fait dans mon programme big_smile !
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 lol
Merci en tout cas wink