Je suis actuellement le cours de C afin d'y apprendre ses bases. Je suis arrivé à au TP du Pendu, et je rencontre un problème étrange.
Petite précision, j'ai uniquement effectué la première partie du Pendu, c'est-à-dire qu'il n'y a pas encore de dictionnaire de mot.
Revenons en au problème, quand j'exécute mon programme il m'affiche comme il se doit le menu de départ avec "1.Jouer 2.Manuel 3.Quitter", mais lorsqu'on sélectionne "1" pour jouer soit le programme va planter, donc calculer je ne sais pas quoi pendant x secondes et renvoyer un nombre négatif comme quoi il y a eu un problème, soit il va bien exécuter mon programme et m'afficher la suite du Pendu.
Petit détail, quand le mot est découvert le programme nous redirige vers le menu de départ, et bien si on rejoue en sélectionnant "1", (donc cela a fonctionné la première), et bien le programme ne va jamais planter, on aura beau refaire cela autant de fois que l'on veut il ne va pas planter.
Merci de ta réponse, je vais arranger cela et voir si c'est concluant ou pas.
(ps : je sais qu'il y a les balises </> pour le code, mais je me voyais mal mettre tout mon code dans un poste, je trouve cela pas très agréable si le code commence à faire plus d'une trentaine de lignes)
Il y en a qui en poste des bien plus long et sans la balise code !
30 lignes, ce n'est pas beaucoup .
Et je suis allé voir ton code, mais bien souvent quand c'est de fichiers déporté comme tu as fait, je ne vais même pas y voir, alors tu as eu de la chance.
/* Fichier menu.c */
/* Gestionnaire des menus */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include "menu.h"
void menuPrincipal(char *choix)
{
system("@cls||clear");
printf(" ======================================\n");
printf(" Bienvenue dans le jeu du Pendu !\n\n");
printf(" 1. Joueur\n");
printf(" 2. Manuel\n");
printf(" 3. Quitter\n\n");
printf(" ======================================\n\n\n");
printf(" Que voulez-vous faire ? ");
choix[0] = lireCaractere();
}
void menuManuel()
{
system("@cls||clear");
printf("\n");
printf(" ======================================\n");
printf(" Manuel \n\n");
printf(" Le jeu du Pendu est un jeu dans\n");
printf(" lequel il faut devenir le mot mystere\n");
printf(" que detient l'ordinateur.\n\n");
printf(" Pour cela, vous devez entrer des\n");
printf(" lettres en majuscule une a une pour\n");
printf(" decouvrir le mot mystere.\n\n");
printf(" Vous avez pour cela au maximum 10\n");
printf(" coups possible.\n\n");
printf(" =======================================\n\n\n ");
system("pause");
}
void joueurJeu()
{
char motSecret[] = "COCHON";
int tailleMot = strlen(motSecret), i, nbCoups = 10, decouvert = 0;
char lettre[2];
int *motJoueur = NULL;
motJoueur = malloc(tailleMot * sizeof(char));
if (motJoueur==NULL)
{
system("@cls||clear");
printf("\n Erreur - Aucune place alouee");
exit(0);
}
for (i=0; i<tailleMot; i++) *(motJoueur+i) = '*';
do
{
system("@cls||clear");//ici ça bloque
printf("\n Mot mystere : ");
for (i=0; i<tailleMot; i++) printf("%c", *(motJoueur+i));
printf("\n\n Il vous reste %d coup(s).", nbCoups);
printf("\n Proposez une lettre : ");
lettre[0] = lireCaractere();
verif(motJoueur, motSecret, lettre, &nbCoups, &tailleMot, &decouvert);
} while (!decouvert && nbCoups !=0);
system("@cls||clear");
printf("\n Mot mystere : %s",motSecret);
printf("\n\n Il vous reste %d coup(s).\n\n ", nbCoups);
if (decouvert) printf("Bravo ! Vous avez trouve le mot mystere !\n\n ");
else printf("Desole, vous n'avez pas reussi a trouve le mot mystere.\n\n ");
free(motJoueur);
system("pause");
}
char lireCaractere()
{
char caractere;
int temp;
caractere = getchar(); // On lit le premier caractère
caractere = toupper(caractere);
while ((temp = getchar()) != '\n' && temp != EOF); // On vide le buffer
return caractere;
}
void verif(int *motJoueur, char *motSecret, char *lettre, int *nbCoups, int *tailleMot, int *decouvert)
{
int i, compteur = 0;
if (strchr(motSecret, lettre[0])!=NULL)
{
for (i=0; i<=*tailleMot; i++)
{
if (motSecret[i]==lettre[0]) motJoueur[i] = lettre[0];
}
}
else
{
*nbCoups -= 1;
}
for (i=0; i<*tailleMot; i++)
{
if (motSecret[i]==motJoueur[i]) compteur += 1;
}
if (*tailleMot==compteur) *decouvert = 1;
}
Le "ici !!!!!!!!" s'affiche, mais ensuite, le programme plante sans afficher "trouve !!!"
(je ne connais absolument pas conio.h, mais je trouve ça bizarre que cela ne fonctionne pas à cet endroit, sachant que tu en as mis partout dans ton code ...)
- Edité par Le_Wasabi_Ca_Pik' 27 juin 2019 à 22:09:24
"Il faut toujours viser la lune, car même en cas d'échec on atterit dans les étoiles". -Oscar Wilde-
En enlevant mon fichier main.h et donc en transférant les déclarations de variables de ce dernier dans le code source principal main.c, il semblerait que le programme ne plante plus.
4) Tu déclares motJoueur comme un pointeur sur int, alors que ce devrait être pointeur sur char.
Apparemment cela n'a pas d'incidence sur le fonctionnement du programme, car c'est de l’allocation manuel de mémoire donc je suppose qu'après on en fait un peu ce que l'on veut tant qu'on demande un espace nécessaire etc... Mais je me doute que par convention, vu que je l'utilise comme un char, vaut mieux changer le int afin que ça soit explicite.
(je ne connais absolument pas conio.h, mais je trouve ça bizarre que cela ne fonctionne pas à cet endroit, sachant que tu en as mis partout dans ton code ...)
Je trouve cela tout aussi bizarre que le programme plante à cet endroit, maintenant j'ai aucun problème donc on va dire que c'est good, mais ça serait intéressant de comprendre pourquoi il faisait ça ici ? Mystère et boule de gomme...
4) Tu déclares motJoueur comme un pointeur sur int, alors que ce devrait être pointeur sur char.
Apparemment cela n'a pas d'incidence sur le fonctionnement du programme, car c'est de l’allocation manuel de mémoire donc je suppose qu'après on en fait un peu ce que l'on veut tant qu'on demande un espace nécessaire etc...
Pas d'incidence ? Et l’arithmétique des pointeurs, qu'est ce que tu en fais !
TP : réalisation d'un Pendu
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Pas d'aide concernant le code par MP, le forum est là pour ça :)
"Il faut toujours viser la lune, car même en cas d'échec on atterit dans les étoiles". -Oscar Wilde-
"Il faut toujours viser la lune, car même en cas d'échec on atterit dans les étoiles". -Oscar Wilde-