Je découvre la programmation en C grâce aux cours d'Open classroom et j'en suis au jeux du pendu. Et voici mon problème : le programme pioche bien un mot aléatoire dans un fichier texte (tester avec printf), mais lorsque je rentre les lettres qui le compose, elle ne s'affiche pas et les * restent des * au lieux de se faire remplacer par les bonnes lettres. Je commence à avoir relus mon programme beaucoup de fois et je ne comprend pas d'ou viens l'erreur. Voici mon programme
#pragma once
#ifndef DEF_DICO
#define DEF_DICO
int piocherMot(char* motPioche);
int nombreAléatoire(int nombreMax);
#endif
#pragma once
int tailleMot(char motSecret[]);
void initTableau(int* lettreTrouvee, int taille);
int gagne(int* lettreTrouvee, int nombreLettres);
char lireCaractere();
int rechercheLettre(char lettre, char motSecret[], int* lettreTrouvee);
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include "Header.h"
#include"GestionDico.h"
#define _CRT_SECURE_NO_WARNINGS
int main(int argc, const char* argv[])
{
char lettre = 0;
char motSecret[100] = { 0 };
int* lettreTrouvee = NULL;
int coupRestant = 10;
//int nombreLettres/*= taille du mot*/ = tailleMot(motSecret); /*égale au nombre de lettre (5 pour l'ex)*/
int i = 0;
int tailleMot = 0;
//lettreTrouvee = (int *)malloc(nombreLettres * sizeof(int));
//initTableau(lettreTrouvee, nombreLettres);
printf("Bienevenue dans le Pendu\nBonne chance !\n");
if (!piocherMot(motSecret))
exit(0);
tailleMot = strlen(motSecret);
lettreTrouvee = (int*)malloc(tailleMot * sizeof(int));/*on alloue dynamiquement le tableau lettreTrouvee maintenant qu'on à la taille*/
if (lettreTrouvee == NULL)
exit(0);
for (i = 0; i < tailleMot; i++)
lettreTrouvee[i] = 0;
while (coupRestant > 0 && !gagne(lettreTrouvee, tailleMot))
{
printf("\n\nIl vous reste %d coups a jouer", coupRestant);
printf("\nQuel 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 (!rechercheLettre(lettre, motSecret, lettreTrouvee))
{
coupRestant--;
}
}
if (gagne(lettreTrouvee, tailleMot))
{
printf("\n\nGagne ! Le mot secret etait bien : %s", motSecret);
}
else
printf("\n\nNullos ! Le mot secret etait : %s", motSecret);
free(lettreTrouvee);
return 0;
}
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[])
{
int i = 0, bonneLettre = 0;
for (i = 0; motSecret[i] != '\0'; i++)
{
if (lettre == motSecret[i] && !lettreTrouvee[i])
{
bonneLettre = 1;
lettreTrouvee[i] = 1;
break;
}
}
return bonneLettre;
}
char lireCaractere()
{
char caractere = 0;
caractere = getchar();
caractere = toupper(caractere);
while (getchar() != '\n');
return caractere;
}
int tailleMot(char motSecret[])
{
int nombreLettres = 0;
int i = 0;
for (i = 0; motSecret[i] !='\0'; i++)
{
nombreLettres++;
}
return nombreLettres;
}
void initTableau(int* lettreTrouvee, int taille)
{
for (int i = 0; i < taille; i++)
{
lettreTrouvee[i] = 0;
}
}
int gagne(int lettreTrouvee[], int tailleMot)
{
int i = 0;
int joueurGagne = 1;
for (i = 0; i < tailleMot; i++)
{
if (lettreTrouvee[i] == 0)
joueurGagne = 0;
}
return joueurGagne;
}
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include"GestionDico.h"
#define _CRT_SECURE_NO_WARNINGS
int nombreAleatoire(int nombreMax)
{
srand(time(NULL));
return (rand() % nombreMax);
}
int piocherMot(char* motPiocher)
{
FILE* dico = NULL;
int nombreMots = 0;
int numMotChoisi, i = 0;
int caractereLu = 0;
dico = fopen("dico.txt.txt", "r"); /*On ouvre le dico en lecture seul*/
if(dico == NULL)/*l'ouverture a fail*/
{
printf("\nL'ouverture du fichier du dictionnaire a rate");
return 0;
}
do
{
caractereLu = fgetc(dico);
if (caractereLu == '\n')
nombreMots++;/*22735 normalement*/
} while (caractereLu != EOF);
numMotChoisi = nombreAleatoire(nombreMots);/*on prend un mot random*/
rewind(dico);
while (numMotChoisi > 0)
{
caractereLu = fgetc(dico);
if (caractereLu == '\n')
numMotChoisi--;
}
/*Maintenant le curseur est au bon endroit*/
fgets(motPiocher, 100, dico);
motPiocher[strlen(motPiocher) - 1] = '\0';
printf("mot choisi : %s\n", motPiocher);
fclose(dico);
return 1; /*Tout est OK, on return 1*/
}
Les deux fichier .h au début puis le main est le fichier pour gérer le fichier texte.
Je précise que le nom du fichier est le bon car l'ouverture se passe très bien, ainsi que la sélection du mot, c'est vraiment la gestion des lettres en entrée qui pose problème. Merci d'avance.
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[])
{
int i = 0, bonneLettre = 0;
for (i = 0; motSecret[i] != '\0'; i++)
{
if (lettre == motSecret[i] && !lettreTrouvee[i])
{
bonneLettre = 1;
lettreTrouvee[i] = 1;
break;
}
}
return bonneLettre;
}
Le break n'empêcherait pas de chercher les autres occurrences de lettre ?
Je retirerai le break à mon sens.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Je t'assure que non, pour y avoir passe qlq heure mdr, la ligne qui met tout en majuscule pose problème, et le break empêche de compléter des mots avec plusieurs même lettre. Mais un pote a trouvé la solution du coup c'est bon, merci beaucoup quand même.
Je t'assure que non, pour y avoir passe qlq heure mdr, la ligne qui met tout en majuscule pose problème, et le break empêche de compléter des mots avec plusieurs même lettre. Mais un pote a trouvé la solution du coup c'est bon, merci beaucoup quand même.
et alors, c'est quoi la solution (si elle est restée proche du code d'origine) ?
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)