Résolu Jeu du Pendu

Solutions (1)
|
Bonjour,
je suis entrain d’améliorer le jeu du pendu (choix entre deux modes, choix d'un niveau parmi trois, rejouer une autre partie? etc...). le mode solo fonctionne a merveille mais j'ai un soucis avec le mode multi : lorsque le mot secret est saisis, il se passe deux choses, 1-si le mot secret est inférieur ou égal a 4, le système choisit un mot de passe dans le dictionnaire de mot 'dico.txt' alors qu'il devrait plutôt prendre en compte le mot saisis au clavier, 2- si le mot secret est supérieur a 4 alors la c'est la cata! le jeu s’arrête immédiatement.
voici d'ailleurs le code du jeu :
Bien vouloir l'executer et voir le mode Multi svp!!!

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <time.h>
  6.  
  7. #define SOLO 1
  8. #define MULTI 2
  9.  
  10. #define TAILLE_MAX 100
  11.  
  12.  
  13. typedef struct NiveauJeu NiveauJeu;
  14. struct NiveauJeu
  15. {
  16. char nomNiveau[100];
  17. int nombreMot;
  18. int coupMax;
  19. };
  20.  
  21. NiveauJeu niveaux[] =
  22. {
  23. {"Facile", 'nombreMot', 15},
  24. {"Moyen", 'nombreMot', 10},
  25. {"Difficile", 'nombreMot', 7}
  26. };
  27.  
  28. int demanderModeJeu(int modeJeu)
  29. {
  30. printf("\n");
  31. printf("MODE DE JEU\n");
  32. printf("Bien vouloir choisir un mode de jeu !\n");
  33. printf("1. Mode Solo\n2. Mode Multi\n");
  34. do
  35. {
  36. printf("Votre choix ? ");
  37. scanf("%d", &modeJeu);
  38. }while(modeJeu < 1 || modeJeu > 2);
  39.  
  40. return modeJeu;
  41. }
  42.  
  43. NiveauJeu demanderNiveauJeu()
  44. {
  45. int choixNiveau;
  46. printf("\n");
  47. printf("NIVEAU DE JEU\n");
  48. printf("Bien vouloir choisir un niveau de jeu !\n");
  49. printf("1. Facile\n2. Moyen\n3. Difficile\n");
  50. do
  51. {
  52. printf("Votre choix ? ");
  53. scanf("%d", &choixNiveau);
  54. }while(choixNiveau < 1 || choixNiveau > 3);
  55.  
  56. return niveaux[choixNiveau - 1];
  57.  
  58. }
  59.  
  60. int demanderNombre(int nbCoupRestants)
  61. {
  62. int nombreSaisi;
  63. printf("\n");
  64. printf("Attention, il vous reste seuleument %d coups\n", nbCoupRestants);
  65. printf("Quel est le nombre ? ");
  66. scanf("%d", &nombreSaisi);
  67.  
  68. return nombreSaisi;
  69. }
  70.  
  71. int choixMotSecretAleatoire(NiveauJeu niveauJeu)
  72. {
  73. srand(time(NULL));
  74. return (rand() % niveauJeu.nombreMot);
  75. }
  76.  
  77. int demanderMotSecret(NiveauJeu niveauJeu)
  78. {
  79. int nombreMot;
  80. char motSecret[TAILLE_MAX];
  81. printf("\n");
  82.  
  83. printf("Entrez le mot secret : ");
  84. scanf("%s", &motSecret[TAILLE_MAX]);
  85.  
  86. printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  87.  
  88. return motSecret[TAILLE_MAX];
  89. }
  90.  
  91. int nombreAleatoire(int nombreMot)
  92. {
  93. srand(time(NULL));
  94. return (rand() % nombreMot); //le nombre de mot contenu dans le dictionnaire.
  95. }
  96.  
  97. void debutPartie()
  98. {
  99. printf("\n");
  100. printf("**************************************\n");
  101. printf("************LE JEU DU PENDU***********\n");
  102. printf("********Code par Jean Dechanel********\n");
  103. printf("**************************************\n\n");
  104. }
  105.  
  106. void viderBuffer()
  107. {
  108. int c = 0;
  109. while(c != '\n' && c != EOF)
  110. {
  111. c = getchar();
  112. }
  113. }
  114.  
  115. int lire(char* chaine, int longueurChaine)
  116. {
  117. int* positionEntree = NULL;
  118.  
  119. if(fgets(chaine, longueurChaine, stdin) != NULL)
  120. {
  121. positionEntree = strchr(chaine, '\n');
  122.  
  123. if(positionEntree != NULL)
  124. {
  125. *positionEntree = '\0';
  126. }else
  127. {
  128. viderBuffer();
  129. }return 1;
  130. }else
  131. {
  132. viderBuffer();
  133. return 0;
  134. }
  135.  
  136. }
  137.  
  138. long lireLong()
  139. {
  140. char nombreTexte[100] = {0};
  141. if(lire(nombreTexte, 100))
  142. {
  143. return strtol(nombreTexte, NULL, 10);
  144. }else
  145. {
  146. return 0;
  147. }
  148. }
  149.  
  150.  
  151. int tireMotAleatoire(char motSecret[])
  152. {
  153. int caractereLu = 0, nombreMot = 0;
  154.  
  155. FILE* dico = NULL;
  156. int caracterelu = 0;
  157. dico = fopen("/home/ubuntu/workspace/dico.txt", "r");
  158.  
  159. if(dico == NULL)
  160. exit(0);
  161.  
  162. else
  163. {
  164. do
  165. {
  166. caracterelu = fgetc(dico);
  167. if(caracterelu == '\n')
  168. nombreMot++;
  169.  
  170. }while(caracterelu != EOF);
  171.  
  172. int numMotSecret = nombreAleatoire(nombreMot);
  173.  
  174. rewind(dico);
  175.  
  176. while(numMotSecret > 0)
  177. {
  178. caractereLu = fgetc(dico);
  179. if(caractereLu == '\n')
  180. numMotSecret--;
  181. }
  182.  
  183. fgets(motSecret, 100, dico);
  184. motSecret[strlen(motSecret) - 1] = '\0';
  185.  
  186. fclose(dico);
  187. }
  188.  
  189. return 1;
  190. }
  191.  
  192.  
  193.  
  194. int compterMot(int nombreMot)
  195. {
  196. FILE* dico = NULL;
  197. int caracterelu = 0;
  198. dico = fopen("/home/ubuntu/workspace/dico.txt", "r");
  199.  
  200. if(dico == NULL)
  201. exit(0);
  202.  
  203. else
  204. {
  205. do
  206. {
  207. caracterelu = fgetc(dico);
  208. if(caracterelu == '\n')
  209. nombreMot++;
  210.  
  211. }while(caracterelu != EOF);
  212.  
  213. }
  214.  
  215. return nombreMot;
  216. }
  217.  
  218.  
  219. typedef enum Bool Bool;
  220. enum Bool
  221. {
  222. TRUE, FALSE
  223. };
  224.  
  225. Bool rejouerPartie(long choice)
  226. {
  227. printf("Voulez-vous rejouer une autre Partie ?\n");
  228. printf("1. Oui\n2. Non\n");
  229. do
  230. {
  231. printf("Votre choix ? ");
  232. choice = lireLong();
  233. }while(choice < 1 || choice > 2);
  234.  
  235. return choice == 1;
  236. }
  237.  
  238. int gagnerJeu(int lettreTrouvee[], int tailleMot)
  239. {
  240. int remplir = 1;
  241. int i = 0;
  242. for(i = 0; i < tailleMot; i++)
  243. {
  244. if(lettreTrouvee[i] == 0)
  245. remplir = 0;
  246.  
  247. }
  248.  
  249.  
  250. return remplir == 1;
  251. }
  252.  
  253.  
  254. char lireCaractere()
  255. {
  256. char caractere = 0;
  257. caractere = getchar();
  258. caractere = toupper(caractere);
  259. while(getchar() != '\n');
  260.  
  261. return caractere;
  262. }
  263.  
  264.  
  265. int rechercherLettre(char lettreSaisie, char motSecret[], int lettreTrouvee[])
  266. {
  267. int i = 0;
  268. int bonneLettre = 0;
  269. for(i = 0; motSecret[i] != '\0'; i++)
  270. {
  271. if(lettreSaisie == motSecret[i])
  272. {
  273. bonneLettre = 1;
  274. lettreTrouvee[i] = 1;
  275. }
  276. }
  277.  
  278. return bonneLettre == 1;
  279. }
  280.  
  281.  
  282. int afficherLettre(int lettreTrouvee[], char motSecret[], int tailleMot)
  283. {
  284. int i = 0;
  285. for(i = 0; i < tailleMot; i++)
  286. {
  287. if(lettreTrouvee[i])
  288. printf("%c", motSecret[i]);
  289. else
  290. printf("*");
  291. }
  292.  
  293. return lettreTrouvee[i];
  294. }
  295.  
  296.  
  297.  
  298.  
  299. int main(int argc, char* argv[])
  300. {
  301. char motSecret[100] = {0};
  302. int i = 0, choice = 0, caractereLu = 0, numMotSecret = 0, tailleMot = 0;
  303. char lettreSaisie = 0;
  304. int* lettreTrouvee = NULL;
  305.  
  306. printf("\n");
  307. debutPartie();
  308.  
  309. do
  310. {
  311.  
  312.  
  313. int modeJeu = demanderModeJeu(modeJeu);
  314. printf("Bienvenu au mode %s !\n", modeJeu == SOLO ? "Solo" : "Multi");
  315.  
  316. NiveauJeu niveauJeu = demanderNiveauJeu();
  317. printf("Bienvenu au niveau %s !\n", niveauJeu.nomNiveau);
  318.  
  319. int nbCoupsRestants = niveauJeu.coupMax;
  320.  
  321. int nombreMystere = modeJeu == SOLO ? choixMotSecretAleatoire(niveauJeu) : demanderMotSecret(niveauJeu);
  322.  
  323. if(! tireMotAleatoire(motSecret))
  324. exit(0);
  325.  
  326. tailleMot = strlen(motSecret);
  327. lettreTrouvee = malloc(tailleMot * sizeof(int));
  328.  
  329. if(lettreTrouvee == NULL)
  330. {
  331. printf("Impossibe d'ouvrir le fichier dico.txt !\n");
  332. exit(0);
  333. }
  334.  
  335. for(i = 0; i < tailleMot; i++)
  336. lettreTrouvee[i] = 0;
  337.  
  338. do
  339. {
  340. printf("\n\nIl vous reste %d coups a jouer ! ", nbCoupsRestants);
  341.  
  342. printf("\nQuel est le mot secret ? ");
  343.  
  344. lettreTrouvee[i] = afficherLettre(lettreTrouvee, motSecret, tailleMot);
  345.  
  346. printf("\nProposez une lettre ");
  347. lettreSaisie = lireCaractere();
  348.  
  349. if(!rechercherLettre(lettreSaisie, motSecret, lettreTrouvee))
  350. {
  351. nbCoupsRestants--;
  352. printf("Cette lettre ne figure pas dans le mot secret \n");
  353. }
  354.  
  355. }while(nbCoupsRestants > 0 && !gagnerJeu(lettreTrouvee, tailleMot));
  356.  
  357. if(gagnerJeu(lettreTrouvee, tailleMot))
  358. {
  359. printf("\n\n");
  360. printf("GAGNE, le mot secret etait bien %s !!!\n\n", motSecret);
  361. printf("Partie terminee !\n\n");
  362. }else
  363. {
  364. printf("\n\n");
  365. printf("PERDU, le mot secret etait %s !!!\n\n", motSecret);
  366. printf("Partie terminee !\n\n");
  367. }
  368.  
  369. }while(rejouerPartie(choice));
  370. printf("\n\n\n");
  371. printf("Partie terminee !!!\n");
  372.  
  373. return 0;
  374.  
  375. }
  • jeandechanel a édité ce message
  • jeandechanel a édité ce message
Contenus similaires
Meilleure solution
partage
|
Dans demanderMotSecret(), tu crées la variable locale motSecret (donc dans la pile du programme). A la sortie de la fonction, tout ce qui a été créé sur la pile dans la fonction est supprimé (toutes les variable locales sont supprimées de la mémoire).
cette variable locale motSecret est différente de l'autre variable motSecret dans ton main.
Donc, tu perds ton mot dans demanderMotSecret, et le motSecret du main n'a jamais été modifié (d'où les erreurs, car il est rempli avec le reste de mémoire de pile, donc n'importe quoi).
Tu dois faire comme avec tireMotAleatoire : donner en paramètre l'adresse mémoire du motSecret du main, pour bien modifier celui-ci.
Autre point : dans tous les cas, tu appelles tireMotAleatoire quel que soit le mode choisi.
  • jeandechanel a sélectionné cette solution comme la meilleure réponse
  • Commenter cette solution |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS