J'ai un sérieux problème dans mon code du Pendu. En fait, comme vous allez le voir, j'ai crée un mode 2 joueurs (*il n'y a pas encore de CASH !), et au moment de taper une lettre pour trouver le mot de l'autre utilisateur, et bah... la première lettre tapée n'est pas comptabilisée, ce qui signifie qu'il faut taper deux fois la même lettre ! et on perd alors un coup également !
Pouvez-vous m'en dire plus ?
Ci-joint le fichier MAIN,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "dico.h"
int gagne(int lettreTrouvee[], int tailleMot);
int rechercherCaractere(char lettre, char motSecret1[], int lettreTrouvee[]);
char lireCaractere();
char motMajuscule(char motSecret[]);
int *erreur = NULL;
int main()
{
int refairePartie = 0;
do{
int nombreDeCoupsAjouer = 10;
char motSecret[100] = {0};
char lettre = 0;
int *lettreTrouvee = NULL;
int i = 0;
int tailleMot = 0;
int nombreDeCoupsJoues =1;
int nbJoueurs = 1;
int erreurJoueurs = 0;
if(refairePartie == 0)
{
printf("Bienvenue dans le jeu du Pendu !\n");
printf("\nLe but du jeu est de trouver le mot secret.\nProposez des lettres afin de trouver ce mot.\n\
Si vous echouer sur une lettre, vous perdez un point.\nIl existe aussi le mode CASH, essayez de \
trouver directement le mot cache,\n cependant si vous echouez, vous perdez trois points d'un coup.\n");
printf("------------------------------------------------------------------------------------------------------------------------\n");
}
do{
printf("\nVoulez-vous jouer tout seul ou a 2 joueurs ? \nPour jouer a deux, tapez 2, sinon tapez 1.\n");
scanf("%d", &nbJoueurs);
printf("\n");
if(nbJoueurs != 1 && nbJoueurs != 2)
{
printf("Vous n'avez pas choisi un nombre entre 1 et 2.\n");
erreurJoueurs = 1;
erreur = &erreurJoueurs;
}
}while(nbJoueurs != 1 && nbJoueurs != 2);
if(nbJoueurs == 2)
{
printf("------------------------------------------------------------------------------------------------------------------------\n");
printf("Joueur 1, eloigner votre compagnon pour qu'il ne voie votre mot secret.\n\n");
printf("Maintenant, tapez le mot que devra trouver votre complice :");
scanf("%s", motSecret);
motMajuscule(motSecret);
printf("\nAPPUYEZ SUR ENTREE");
system("cls");
printf("Vous pouvez desormais faire venir votre complice.\n");
printf("\nLe but du jeu est de trouver le mot secret.\nProposez des lettres afin de trouver ce mot.\n\
Si vous echouer sur une lettre, vous perdez un point.\nIl existe aussi le mode CASH, essayez de \
trouver directement le mot cache,\n cependant si vous echouez, vous perdez trois points d'un coup.\n");
printf("------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n");
printf("Joueur 2, a vous de jouer !\n");
tailleMot = strlen(motSecret);
lettreTrouvee = malloc(tailleMot * sizeof(int));
if(lettreTrouvee == NULL)
{
printf("ECHEC\n");
exit(0);
}
for(i = 0; i < tailleMot; i++)
{
lettreTrouvee[i] = 0;
}
while(nombreDeCoupsAjouer > 0 && !gagne(lettreTrouvee, tailleMot))
{
printf("\nIl vous reste %d coups a jouer.\n", nombreDeCoupsAjouer);
printf("Quel est le mot secret ?");
for(i = 0; i < tailleMot; i++)
{
if(lettreTrouvee[i])
{
printf("%c", motSecret[i]);
}
else
printf("*");
}
printf("\nProposez une lettre :");
lettre = lireCaractere();
if(!rechercherCaractere(lettre, motSecret, lettreTrouvee))
{
nombreDeCoupsAjouer--;
nombreDeCoupsJoues++;
}
}
if(gagne(lettreTrouvee, tailleMot))
{
printf("\nBravo ! Le mot mystere est bien %s.\n", motSecret);
}
else
{
printf("\nPerdu ! Le mot mystere etait %s.\n", motSecret);
}
if(gagne(lettreTrouvee, tailleMot))
{
printf("Vous avez gagne en %d coups. Bravo !\n", nombreDeCoupsJoues);
}
printf("Si vous voulez refaire une partie, tapez 1, sinon, tapez 0.\n");
scanf("%d", &refairePartie);
if(refairePartie > 1)
{
printf("Vous n'avez pas tapez un chiffre entre 1 et 0.\n");
}
system("cls");
free(lettreTrouvee);
}
//COMMENCEMENT PARTIE MODE SOLO
if(nbJoueurs == 1)
{
if(!piocherMot(motSecret))
{
printf("ECHEC\n");
exit(0);
}
//
tailleMot = strlen(motSecret);
lettreTrouvee = malloc(tailleMot * sizeof(int));
if(lettreTrouvee == NULL)
{
printf("ECHEC\n");
exit(0);
}
for(i = 0; i < tailleMot; i++)
{
lettreTrouvee[i] = 0;
}
//
//
while(nombreDeCoupsAjouer > 0 && !gagne(lettreTrouvee, tailleMot))
{
printf("\nIl vous reste %d coups a jouer.\n", nombreDeCoupsAjouer);
printf("Quel est le mot secret ?");
for(i = 0; i < tailleMot; i++)
{
if(lettreTrouvee[i])
{
printf("%c", motSecret[i]);
}
else
printf("*");
}
printf("\nProposez une lettre :");
lettre = lireCaractere();
if(!rechercherCaractere(lettre, motSecret, lettreTrouvee))
{
nombreDeCoupsAjouer--;
nombreDeCoupsJoues++;
}
}
if(gagne(lettreTrouvee, tailleMot))
{
printf("\nBravo ! Le mot mystere est bien %s.\n", motSecret);
}
else
{
printf("\nPerdu ! Le mot mystere etait %s.\n", motSecret);
}
if(gagne(lettreTrouvee, tailleMot))
{
printf("Vous avez gagne en %d coups. Bravo !\n", nombreDeCoupsJoues);
}
printf("Si vous voulez refaire une partie, tapez 1, sinon, tapez 0.\n");
scanf("%d", &refairePartie);
if(refairePartie > 1)
{
printf("Vous n'avez pas tapez un chiffre entre 1 et 0.\n");
}
system("cls");
free(lettreTrouvee);
}
}while(refairePartie == 1);
//
if(erreur == 0)
{
printf("\nMerci d'avoir joue au Pendu !\n");
printf("\n\nUNE PRODUCTION CLEMENT MARIE\n\n\n\n");
}
return 0;
}
char lireCaractere()
{
char caractere = 0;
caractere = getchar();
caractere = toupper(caractere);
while(getchar() != '\n');
return caractere;
}
int rechercherCaractere(char lettre, char motSecret[], int lettreTrouvee[])
{
int bonneLettre = 0;
int i;
for(i = 0; motSecret[i] != '\0';i++)
{
if(lettre == motSecret[i])
{
bonneLettre =1;
lettreTrouvee[i] = 1;
}
}
return bonneLettre;
}
int gagne(int lettreTrouvee[], int tailleMot)
{
int joueurGagne = 1;
int i;
for(i = 0; i < tailleMot; i++)
{
if(lettreTrouvee[i] == 0)
{
joueurGagne = 0;
}
}
return joueurGagne;
}
char motMajuscule(char motSecret[])
{
int i;
for(i = 0; motSecret[i] != '\0'; i++)
{
motSecret[i] = toupper(motSecret[i]);
}
return *motSecret;
}
Je n'ai (presque) pas regardé le code, l'indentation (particulièrement du main() ) est à revoir. Mais 6 appels à la fonction gagne() pour un pendu ! Et presque 300 lignes de code ! Voilà qui est énorme. Je pense que tu devrais commencer par revoir ta manière de réaliser le jeu du pendu.
- Edité par edgarjacobs 24 juin 2017 à 18:11:49
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Je n'ai (presque) pas regardé le code, l'indentation (particulièrement du main() ) est à revoir. Mais 6 appels à la fonction gagne() pour un pendu ! Et presque 300 lignes de code ! Voilà qui est énorme. Je pense que tu devrais commencer par revoir ta manière de réaliser le jeu du pendu.
Si un joueur, prendre un mot au hasard dans le dictionnaire
Si deux joueurs, demander au joueur 2 de donner un mot
Boucle (commune au deux modes, le mot mystère étant déjà choisi): demander au joueur 1 une lettre, vérifier, et si le mot rechercher est toujours incomplet, recommencer
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Tu devrais commencer par utiliser davantage de fonctions, sépares en fichiers, n'utilise pas de variables globales quand tu peux faire autrement, etc...
Tout cela fait parti de l'organisation qui te permettra d'avoir un code propre et de t'y retrouver. Car là, il faut avouer que c'est dur de te lire.
Ra'Jiska : ne brûlons pas les étapes, la programmation en plusieurs fichiers se voit plus tard, et c'est normal.
J'ai l'impression que le premier souci est plutôt d'ordre algorithmique, donc que la réponse d'edgarjacobs devrait aider.
Quant au problème précis, je pense qu'une méthode pour comprendre ce qu'il se passe est de faire afficher le compteur à divers endroits pour voir à quel endroit précis sa valeur n'est pas celle attendue. C'est bien 'nombreDeCoupsJoues' le compteur ? Il est initialisé où ? Ligne 25 il est initialisé à 1. Ne serait-il pas plus logique de l'initialiser à 0 ? (Mais ça dépend comment il est utilisé, et comme je n'ai pas le temps de lire les 300 lignes...) Ce que je dis n'apporte pas d'aide concrète, mais c'est une illustration de la démarche à avoir pour trouver l'erreur : rentrer dans les détails du programme, se demande quelle doit être la valeur de telle variable et vérifier si c'est le cas, etc.
Ra'Jiska : ne brûlons pas les étapes, la programmation en plusieurs fichiers se voit plus tard, et c'est normal.
J'ai l'impression que le premier souci est plutôt d'ordre algorithmique, donc que la réponse d'edgarjacobs devrait aider.
Quant au problème précis, je pense qu'une méthode pour comprendre ce qu'il se passe est de faire afficher le compteur à divers endroits pour voir à quel endroit précis sa valeur n'est pas celle attendue. C'est bien 'nombreDeCoupsJoues' le compteur ? Il est initialisé où ? Ligne 25 il est initialisé à 1. Ne serait-il pas plus logique de l'initialiser à 0 ? (Mais ça dépend comment il est utilisé, et comme je n'ai pas le temps de lire les 300 lignes...) Ce que je dis n'apporte pas d'aide concrète, mais c'est une illustration de la démarche à avoir pour trouver l'erreur : rentrer dans les détails du programme, se demande quelle doit être la valeur de telle variable et vérifier si c'est le cas, etc.
Merci robun pour ta réponse,
Je code la nouvelle version du programme et je vais de nouveau avoir besoin de vous, chers zéros.
Je tiens juste à préciser que j'ai initialisé nombreDeCoupsJoués à 1, parce que si on trouvait le mot Secret du premier coup, la console afficherait :
"Vous avez trouvé en 0 coups." Etrange, non ?
En tout cas, merci pour vos remarques très pertinentes.
Ah OK. Il faut peut-être revoir l'algorithme. Quand tu posteras la nouvelle version, n'oublie pas de faire une identation correcte, ça augmentera les chances que quelqu'un qui a le temps regarde ça de plus près.
Erreur inquiétante Entrée
× 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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent