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;
}