Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeux du pendu

Sujet résolu
    12 décembre 2023 à 18:36:17

    Bonjour,

    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.

    • Partager sur Facebook
    • Partager sur Twitter
      12 décembre 2023 à 19:03:29

      Je n'ai pas regardé en détail, mais je viens de le tester et il semble fonctionner.
      • Partager sur Facebook
      • Partager sur Twitter
      ...
        12 décembre 2023 à 19:16:19

        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.

        • Partager sur Facebook
        • Partager sur Twitter

        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)

          12 décembre 2023 à 19:17:28

          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.
          • Partager sur Facebook
          • Partager sur Twitter
            12 décembre 2023 à 20:25:06

            Peut-être ton dictionnaire était en minuscules ? J'avait testé avec un en majuscules.
            • Partager sur Facebook
            • Partager sur Twitter
            ...
              13 décembre 2023 à 13:18:30

              PabloThieriot1 a écrit:

              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) ?

              "La ligne qui met tout en majuscule", c'est ça ?

              char lireCaractere()
              {
                  char caractere = 0;
               
                  caractere = getchar();
                  caractere = toupper(caractere);
               
                  while (getchar() != '\n');
               
                  return caractere;
              }

              Dans ce cas,  ça ne met pas tout en majuscule, ça

              • lit un caractère
              • ça lit les suivants en les ignorant jusqu'à la fin de la ligne
              • et ça retourne le premier en majuscule

               et quel problème ça pose ?

              -
              Edité par michelbillaud 13 décembre 2023 à 13:24:49

              • Partager sur Facebook
              • Partager sur Twitter

              Jeux du pendu

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown