Pendu
Résolu
Xifly
Messages postés
49
Statut
Membre
-
Xifly Messages postés 49 Statut Membre -
Xifly Messages postés 49 Statut Membre -
Bonjour,
Voici mon programme :
celui-ci fonctionne avec un fichier nommé dictionnaire.txt contenant différents mots avec un retour à la ligne entre chacun et fini par un dernier retour à la ligne (et une ligne vide donc).
Le problème, un tableau lettres_utilisees de 26 cases rempli de '-' et dans lequel viennent s'ajouter dans l'ordre alphabétique les lettres déjà entrées par l'utilisateur mais je ne sais pour quelle raison, le mot à trouver s'ajoute à la fin de celle ci.
Merci d'avance pour votre aide !
Voici mon programme :
celui-ci fonctionne avec un fichier nommé dictionnaire.txt contenant différents mots avec un retour à la ligne entre chacun et fini par un dernier retour à la ligne (et une ligne vide donc).
Le problème, un tableau lettres_utilisees de 26 cases rempli de '-' et dans lequel viennent s'ajouter dans l'ordre alphabétique les lettres déjà entrées par l'utilisateur mais je ne sais pour quelle raison, le mot à trouver s'ajoute à la fin de celle ci.
Merci d'avance pour votre aide !
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <ctype.h> #define TAILLE_MAX 1000 char flettre (char lettre) { int ascii = 0; lettre = toupper(lettre); //mise en majuscule while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée ascii = lettre; while ( (ascii < 65) || (ascii > 90) ) { printf("\nVotre caract\212re n'est pas valide.\nVous devez entrer une lettre.\nLes accents ne sont pas pris en compte.\n\nVeuillez saisir une nouvelle lettre : "); lettre = getchar(); //mémorise la lettre tapée lettre = toupper(lettre); //mise en majuscule while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée ascii = lettre; } return (lettre); } int main(void) { //Initialisation int i = 0; int j = 0; char lettre; int coupsRestants = 10; int bonneLettre = 0; int ascii = 0; FILE* fichier = NULL; char motAtrouver[TAILLE_MAX] = ""; fichier = fopen("dictionnaire.txt", "r"); int nombre_mots = 0; int caractereActuel = 0; char lettre_utilisees[26]; //Initialiser la graine aléatoire: srand (time (NULL)); //Initialisation de lettre_utilises for (j=0 ; j < 26; j++) { lettre_utilisees[j]= '-'; } lettre_utilisees[26] = '\0'; if (fichier != NULL) { do { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire } } while (caractereActuel != EOF); fseek(fichier, 0, SEEK_SET); //On remet le pointeur au début du fichier int nombre_aleatoire = rand() % nombre_mots; //On choisi un nombre aléatoire compris entre 0 et le nombre de mots while(nombre_aleatoire >= 0 && fgets(motAtrouver, TAILLE_MAX, fichier) != NULL) { nombre_aleatoire--; } fgets(motAtrouver, TAILLE_MAX, fichier); //on va chercher le mot aléatoire motAtrouver[strlen(motAtrouver) - 1] = '\0'; //on supprime le retour à la ligne et on ferme la chaine fclose(fichier); //on referme le dictionnaire } else { printf("Impossible d'ouvrir le dictionnaire"); } //initialisation char lettresTrouvees[strlen(motAtrouver) + 1]; int resteAtrouver = strlen(motAtrouver); //Initialisation de lettresTrouvees for (i=0 ; i < strlen(motAtrouver); i++) { lettresTrouvees[i]= '*'; } lettresTrouvees[strlen(motAtrouver)] = '\0'; while ( (coupsRestants > 0) && (resteAtrouver > 0) ) { system("cls"); switch(coupsRestants) { case 1 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | / |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 2 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 3 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( ) |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 4 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | ( ) |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 5 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 6: printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 7: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 8: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| ___ ___ |\n"); printf("|_________________|\n"); break; case 9: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("|_________________|\n"); break; case 10: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("|_________________|\n"); break; } printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees); printf("Il vous reste %d chance(s)\n\n", coupsRestants); printf("lettre utilisées : %s\n", lettre_utilisees); printf("\n\nQuelle lettre choississez-vous ? "); lettre = getchar(); //mémorise la lettre tapée lettre = flettre(lettre); ascii = lettre; for (i=0 ; i < strlen(motAtrouver); i++) { if (lettre == motAtrouver[i]) { lettresTrouvees[i] = motAtrouver[i]; bonneLettre = bonneLettre + 1; //permet de savoir si le joueur a trouvé au moins une lettre à cette manche resteAtrouver = resteAtrouver - 1;//permet de comptabiliser le nombre de lettre qu'il lui reste à trouver } } lettre_utilisees[ascii-65] = lettre; lettre_utilisees[26] = '\0'; if (bonneLettre == 0) { coupsRestants = coupsRestants - 1; } bonneLettre = 0; //on remet le compteur a zéro pour chaque manche if (resteAtrouver == 0) { printf("\nVous avez gagn\202 ! :D \n"); } } if (coupsRestants ==0) { system("cls"); printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | / \\ |\n"); printf("| ___|___ |\n"); printf("|_________________|\n\n"); printf("Vous avez perdu, le mot \205 trouver \202t\202 %s \n",motAtrouver); } return 0; }
A voir également:
- Pendu ascii
- Code ascii - Guide
- Jeu du pendu - Télécharger - Vie quotidienne
- Etoile ascii ✓ - Forum Clavier
- Code ascii tabulation - Forum Access
- Coder une tabulation en XSLT - Forum Programmation
3 réponses
pourtant j'ai fais un petit programme de test et ça marche très bien :
#include <stdio.h> #include <string.h> int main(void) { char lettre_utilisees[26]; int i = 0; char lettre; int ascii; //Initialisation de lettre_utilises for (i=0 ; i < 26; i++) { lettre_utilisees[i]= '-'; } lettre_utilisees[26] = '\0'; printf("lettre utilisées : %s\n", lettre_utilisees); printf("Entrez une lettre :"); lettre = getchar(); //mémorise la lettre tapée lettre = toupper(lettre); //mise en majuscule while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée printf("lettre tapée : %c\n", lettre); ascii = lettre; printf("ascii : %d\n", ascii); lettre_utilisees[ascii-65] = lettre; lettre_utilisees[26] = '\0'; printf("lettre utilisées : %s\n", lettre_utilisees); }
Salut Xifly,
C'est dû au fait que tu n'alloues pas le bon espace pour lettre_utilisees, qui, pour contenir l'alphabet doit être
J'ai testé ton code, et il y a des tests amusants à faire.
Par exemple, si la bonne réponse est "QUATRE" et que tu tapes la réponse "A" cinq fois, tu gagnes sans avoir trouvé les lettres restantes :-)
Dal
C'est dû au fait que tu n'alloues pas le bon espace pour lettre_utilisees, qui, pour contenir l'alphabet doit être
char lettre_utilisees[27];et non pas
char lettre_utilisees[26];, car il manquerait un espace pour le caractère
'\0'devant terminer la chaîne.
J'ai testé ton code, et il y a des tests amusants à faire.
Par exemple, si la bonne réponse est "QUATRE" et que tu tapes la réponse "A" cinq fois, tu gagnes sans avoir trouvé les lettres restantes :-)
Dal
Merci pour ta réponse
En effet en mettant 27, les lettres entrées se rentre bien dans mon tableau, à leur place. Mais je ne sais pour quelle raison, la variable
Sinon l'histoire du "a" 5 fois est réglée ;)
En effet en mettant 27, les lettres entrées se rentre bien dans mon tableau, à leur place. Mais je ne sais pour quelle raison, la variable
motAtrouverdevient une variable vide ... je peux donc rentré autant de lettre que je veux je perd au bout de 10 lettres sans rien pouvoir trouver ...
Sinon l'histoire du "a" 5 fois est réglée ;)
Tout marche, merci pour tout ! :D
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <ctype.h> #define TAILLE_MAX 1000 char flettre (char lettre) { int ascii = 0; lettre = toupper(lettre); //mise en majuscule while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée ascii = lettre; while ( (ascii < 65) || (ascii > 90) ) { printf("\nVotre caract\212re n'est pas valide.\nVous devez entrer une lettre.\nLes accents ne sont pas pris en compte.\n\nVeuillez saisir une nouvelle lettre : "); lettre = getchar(); //mémorise la lettre tapée lettre = toupper(lettre); //mise en majuscule while(getchar() != '\n'); //permet de comptabiliser uniquement la première lettre entrée ascii = lettre; } return (lettre); } void fmotAtrouver(FILE* fichier, char * motAtrouver) { int caractereActuel = 0; int nombre_mots = 0; char *p; do { caractereActuel = fgetc(fichier); if (caractereActuel == '\n') { nombre_mots = nombre_mots + 1; //on comptabilise le nombre de mots dans le dictionnaire } } while (caractereActuel != EOF); if (nombre_mots < 1) { printf("Le dictionnaire ne contient aucun mot,ou un seul mot sans retour à la ligne. Nous ne pouvons pas jouer\n"); exit(EXIT_FAILURE); } rewind(fichier); //On remet le pointeur au début du fichier int nombre_aleatoire = rand() % nombre_mots; //On choisi un nombre aléatoire compris entre 0 et nombre_mots - 1 while(nombre_aleatoire >= 0 && fgets(motAtrouver, TAILLE_MAX, fichier) != NULL) { nombre_aleatoire--; } fgets(motAtrouver, TAILLE_MAX, fichier); //on va chercher le mot aléatoire motAtrouver[strlen(motAtrouver) - 1] = '\0'; //on supprime le retour à la ligne et on ferme la chaine //if ((p = strchr(motAtrouver,'\n')) != NULL) *p='\0'; //on supprime le retour à la ligne et on ferme la chaine } void fdessin(int coupsRestants) { switch(coupsRestants) { case 1 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | / |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 2 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 3 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( ) |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 4 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | ( ) |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 5 : printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 6: printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 7: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| | |\n"); printf("| ___|___ |\n"); printf("|_________________|\n"); break; case 8: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| ___ ___ |\n"); printf("|_________________|\n"); break; case 9: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("|_________________|\n"); break; case 10: printf("___________________\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("|_________________|\n"); break; } } void faffichage(char * lettresTrouvees, int coupsRestants, int resteAtrouver, char * lettre_utilisees) { int i = 0; printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees); printf("Il vous reste %d chance(s)\n\n", coupsRestants); printf("Il vous reste %d lettres à trouver.\n\n", resteAtrouver); printf("Vous avez déjà utilisé les lettres suivantes : "); for (i=0; i < 27; i++) { if (lettre_utilisees[i] != '-') { printf("%c", lettre_utilisees[i]); } } printf("\n\nQuelle lettre choississez-vous ? "); } void fgagne(int resteAtrouver, char * lettresTrouvees, int coupsRestants) { if (resteAtrouver == 0) { system("cls"); fdessin(coupsRestants); printf("\nVoici le mot a trouver : %s \n\n", lettresTrouvees); printf("Il vous restait encore %d chance(s)\n\n", coupsRestants); printf("\nBravo, Vous avez gagn\202 ! :D \n"); } } void fperdu(int coupsRestants, char * motAtrouver) { if (coupsRestants ==0) { system("cls"); printf("___________________\n"); printf("| |\n"); printf("| __________ |\n"); printf("| | / | |\n"); printf("| |/ 8 |\n"); printf("| | (O.o) |\n"); printf("| | /( )\\ |\n"); printf("| | / \\ |\n"); printf("| ___|___ |\n"); printf("|_________________|\n\n"); printf("Vous avez perdu, le mot \205 trouver \202t\202 %s. \n",motAtrouver); } } void finitialisation(char * lettre_utilisees) { int j = 0; for (j = 0 ; j < 26; j++) { lettre_utilisees[j]= '-'; } lettre_utilisees[26] = '\0'; } void flettre_utilisees(char * lettre_utilisees, char lettre) { int ascii = 0; ascii = lettre; lettre_utilisees[ascii-65] = lettre; lettre_utilisees[26] = '\0'; } int main(void) { //Initialisation int i = 0; char lettre; int ascii = 0; int coupsRestants = 10; int bonneLettre = 0; FILE* fichier = NULL; char motAtrouver[TAILLE_MAX] = ""; fichier = fopen("dictionnaire.txt", "r"); char lettre_utilisees[27]; //Initialiser la graine aléatoire: srand (time (NULL)); finitialisation(lettre_utilisees); if (fichier != NULL) { fmotAtrouver(fichier, motAtrouver); fclose(fichier); //on referme le dictionnaire } else { printf("Impossible d'ouvrir le dictionnaire"); return EXIT_FAILURE; } //initialisation char lettresTrouvees[strlen(motAtrouver) + 1]; int resteAtrouver = strlen(motAtrouver); //Initialisation de lettresTrouvees for (i=0 ; i < strlen(motAtrouver); i++) { lettresTrouvees[i]= '*'; } lettresTrouvees[strlen(motAtrouver)] = '\0'; while ( (coupsRestants > 0) && (resteAtrouver > 0) ) { system("cls"); fdessin(coupsRestants); faffichage(lettresTrouvees, coupsRestants, resteAtrouver, lettre_utilisees); lettre = getchar(); //mémorise la lettre tapée lettre = flettre(lettre); for (i=0 ; i < strlen(motAtrouver); i++) { if (lettre == motAtrouver[i] && lettresTrouvees[i]!=motAtrouver[i]) { lettresTrouvees[i] = motAtrouver[i]; bonneLettre = bonneLettre + 1; //permet de savoir si le joueur a trouvé au moins une lettre à cette manche resteAtrouver = resteAtrouver - 1;//permet de comptabiliser le nombre de lettre qu'il lui reste à trouver } } flettre_utilisees(lettre_utilisees, lettre); if (bonneLettre == 0) { coupsRestants = coupsRestants - 1; } bonneLettre = 0; //on remet le compteur a zéro pour chaque manche fgagne(resteAtrouver, lettresTrouvees, coupsRestants); } fperdu(coupsRestants, motAtrouver); return 0; }