Projet amelioration jeu du Pendu
Résolu
jeandchanel
Messages postés
140
Date d'inscription
Statut
Membre
Dernière intervention
-
jeandchanel Messages postés 140 Date d'inscription Statut Membre Dernière intervention -
jeandchanel Messages postés 140 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je suis entrain d’améliorer le jeu du pendu (choix entre deux modes, choix d'un niveau parmi trois, rejouer une autre partie? etc...). le mode solo fonctionne a merveille mais j'ai un soucis avec le mode multi : lorsque le mot secret est saisis, il se passe deux choses, 1-si le mot secret est inférieur ou égal a 4, le système choisit un mot de passe dans le dictionnaire de mot 'dico.txt' alors qu'il devrait plutôt prendre en compte le mot saisis au clavier, 2- si le mot secret est supérieur a 4 alors la c'est la cata! le jeu s’arrête immédiatement.
voici d'ailleurs le code du jeu :
je suis entrain d’améliorer le jeu du pendu (choix entre deux modes, choix d'un niveau parmi trois, rejouer une autre partie? etc...). le mode solo fonctionne a merveille mais j'ai un soucis avec le mode multi : lorsque le mot secret est saisis, il se passe deux choses, 1-si le mot secret est inférieur ou égal a 4, le système choisit un mot de passe dans le dictionnaire de mot 'dico.txt' alors qu'il devrait plutôt prendre en compte le mot saisis au clavier, 2- si le mot secret est supérieur a 4 alors la c'est la cata! le jeu s’arrête immédiatement.
voici d'ailleurs le code du jeu :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#define SOLO 1
#define MULTI 2
#define TAILLE_MAX 100
typedef struct NiveauJeu NiveauJeu;
struct NiveauJeu
{
char nomNiveau[100];
int nombreMot;
int coupMax;
};
NiveauJeu niveaux[] =
{
{"Facile", 'nombreMot', 15},
{"Moyen", 'nombreMot', 10},
{"Difficile", 'nombreMot', 7}
};
int demanderModeJeu(int modeJeu)
{
printf("\n");
printf("MODE DE JEU\n");
printf("Bien vouloir choisir un mode de jeu !\n");
printf("1. Mode Solo\n2. Mode Multi\n");
do
{
printf("Votre choix ? ");
scanf("%d", &modeJeu);
}while(modeJeu < 1 || modeJeu > 2);
return modeJeu;
}
NiveauJeu demanderNiveauJeu()
{
int choixNiveau;
printf("\n");
printf("NIVEAU DE JEU\n");
printf("Bien vouloir choisir un niveau de jeu !\n");
printf("1. Facile\n2. Moyen\n3. Difficile\n");
do
{
printf("Votre choix ? ");
scanf("%d", &choixNiveau);
}while(choixNiveau < 1 || choixNiveau > 3);
return niveaux[choixNiveau - 1];
}
int demanderNombre(int nbCoupRestants)
{
int nombreSaisi;
printf("\n");
printf("Attention, il vous reste seuleument %d coups\n", nbCoupRestants);
printf("Quel est le nombre ? ");
scanf("%d", &nombreSaisi);
return nombreSaisi;
}
int choixMotSecretAleatoire(NiveauJeu niveauJeu)
{
srand(time(NULL));
return (rand() % niveauJeu.nombreMot);
}
int demanderMotSecret(NiveauJeu niveauJeu)
{
int nombreMot;
char motSecret[TAILLE_MAX];
printf("\n");
printf("Entrez le mot secret : ");
scanf("%s", &motSecret[TAILLE_MAX]);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
return motSecret[TAILLE_MAX];
}
int nombreAleatoire(int nombreMot)
{
srand(time(NULL));
return (rand() % nombreMot); //le nombre de mot contenu dans le dictionnaire.
}
void debutPartie()
{
printf("\n");
printf("**************************************\n");
printf("************LE JEU DU PENDU***********\n");
printf("********Code par Jean Dechanel********\n");
printf("**************************************\n\n");
}
void viderBuffer()
{
int c = 0;
while(c != '\n' && c != EOF)
{
c = getchar();
}
}
int lire(char* chaine, int longueurChaine)
{
int* positionEntree = NULL;
if(fgets(chaine, longueurChaine, stdin) != NULL)
{
positionEntree = strchr(chaine, '\n');
if(positionEntree != NULL)
{
*positionEntree = '\0';
}else
{
viderBuffer();
}return 1;
}else
{
viderBuffer();
return 0;
}
}
long lireLong()
{
char nombreTexte[100] = {0};
if(lire(nombreTexte, 100))
{
return strtol(nombreTexte, NULL, 10);
}else
{
return 0;
}
}
int tireMotAleatoire(char motSecret[])
{
int caractereLu = 0, nombreMot = 0;
FILE* dico = NULL;
int caracterelu = 0;
dico = fopen("/home/ubuntu/workspace/dico.txt", "r");
if(dico == NULL)
exit(0);
else
{
do
{
caracterelu = fgetc(dico);
if(caracterelu == '\n')
nombreMot++;
}while(caracterelu != EOF);
int numMotSecret = nombreAleatoire(nombreMot);
rewind(dico);
while(numMotSecret > 0)
{
caractereLu = fgetc(dico);
if(caractereLu == '\n')
numMotSecret--;
}
fgets(motSecret, 100, dico);
motSecret[strlen(motSecret) - 1] = '\0';
fclose(dico);
}
return 1;
}
int compterMot(int nombreMot)
{
FILE* dico = NULL;
int caracterelu = 0;
dico = fopen("/home/ubuntu/workspace/dico.txt", "r");
if(dico == NULL)
exit(0);
else
{
do
{
caracterelu = fgetc(dico);
if(caracterelu == '\n')
nombreMot++;
}while(caracterelu != EOF);
}
return nombreMot;
}
typedef enum Bool Bool;
enum Bool
{
TRUE, FALSE
};
Bool rejouerPartie(long choice)
{
printf("Voulez-vous rejouer une autre Partie ?\n");
printf("1. Oui\n2. Non\n");
do
{
printf("Votre choix ? ");
choice = lireLong();
}while(choice < 1 || choice > 2);
return choice == 1;
}
int gagnerJeu(int lettreTrouvee[], int tailleMot)
{
int remplir = 1;
int i = 0;
for(i = 0; i < tailleMot; i++)
{
if(lettreTrouvee[i] == 0)
remplir = 0;
}
return remplir == 1;
}
char lireCaractere()
{
char caractere = 0;
caractere = getchar();
caractere = toupper(caractere);
while(getchar() != '\n');
return caractere;
}
int rechercherLettre(char lettreSaisie, char motSecret[], int lettreTrouvee[])
{
int i = 0;
int bonneLettre = 0;
for(i = 0; motSecret[i] != '\0'; i++)
{
if(lettreSaisie == motSecret[i])
{
bonneLettre = 1;
lettreTrouvee[i] = 1;
}
}
return bonneLettre == 1;
}
int afficherLettre(int lettreTrouvee[], char motSecret[], int tailleMot)
{
int i = 0;
for(i = 0; i < tailleMot; i++)
{
if(lettreTrouvee[i])
printf("%c", motSecret[i]);
else
printf("*");
}
return lettreTrouvee[i];
}
int main(int argc, char* argv[])
{
char motSecret[100] = {0};
int i = 0, choice = 0, caractereLu = 0, numMotSecret = 0, tailleMot = 0;
char lettreSaisie = 0;
int* lettreTrouvee = NULL;
printf("\n");
debutPartie();
do
{
int modeJeu = demanderModeJeu(modeJeu);
printf("Bienvenu au mode %s !\n", modeJeu == SOLO ? "Solo" : "Multi");
NiveauJeu niveauJeu = demanderNiveauJeu();
printf("Bienvenu au niveau %s !\n", niveauJeu.nomNiveau);
int nbCoupsRestants = niveauJeu.coupMax;
int nombreMystere = modeJeu == SOLO ? choixMotSecretAleatoire(niveauJeu) : demanderMotSecret(niveauJeu);
if(! tireMotAleatoire(motSecret))
exit(0);
tailleMot = strlen(motSecret);
lettreTrouvee = malloc(tailleMot * sizeof(int));
if(lettreTrouvee == NULL)
{
printf("Impossibe d'ouvrir le fichier dico.txt !\n");
exit(0);
}
for(i = 0; i < tailleMot; i++)
lettreTrouvee[i] = 0;
do
{
printf("\n\nIl vous reste %d coups a jouer ! ", nbCoupsRestants);
printf("\nQuel est le mot secret ? ");
lettreTrouvee[i] = afficherLettre(lettreTrouvee, motSecret, tailleMot);
printf("\nProposez une lettre ");
lettreSaisie = lireCaractere();
if(!rechercherLettre(lettreSaisie, motSecret, lettreTrouvee))
{
nbCoupsRestants--;
printf("Cette lettre ne figure pas dans le mot secret \n");
}
}while(nbCoupsRestants > 0 && !gagnerJeu(lettreTrouvee, tailleMot));
if(gagnerJeu(lettreTrouvee, tailleMot))
{
printf("\n\n");
printf("GAGNE, le mot secret etait bien %s !!!\n\n", motSecret);
printf("Partie terminee !\n\n");
}else
{
printf("\n\n");
printf("PERDU, le mot secret etait %s !!!\n\n", motSecret);
printf("Partie terminee !\n\n");
}
}while(rejouerPartie(choice));
printf("\n\n\n");
printf("Partie terminee !!!\n");
return 0;
}
1 réponse
-
Je crois que tu ne comprends pas très bien ce que signifie
motSecret[TAILLE_MAX]
.
- Dans une déclaration ou un paramètre de fonction (par exemple:char motSecret[TAILLE_MAX];
), cela signifie "Allouer automatiquement un tableau de TAILLE_MAX éléments de type char (seulement dans l'exemple, pour le type char) appelé motSecret". Si c'est un paramètre de fonction, le tableau n'est pas alloué et seule son adresse est passée.
- Dans une expression (par exemplereturn motSecret[TAILLE_MAX];
), cela signifie "Donner la valeur se trouvant à la TAILLE_MAXème case du tableau (ou plutôt la (TAILLE_MAX+1)ème case du tableau, car il ne faut pas oublier que la première case a l'index 0)."
Évidemment je simplifie, pour le compilateur la signification est un peu plus complexe, mais pour un humain ça revient exactement à ça ^^
Que dois-tu faire donc ? Une fonction qui ne retourne rien (donc de typevoid
), et qui prend en paramètre un pointeur sur la chaîne de caractères dans laquelle elle met le mot.
De plus, ta fonction actuelle prend un paramètre "niveaujeu" qui n'est pas utilisé. Ça ne pose pas de problème de fonctionnement, mais ce n'est pas propre et certains compilateurs te donneront un Warning "unused parameter". Autre chose encore, ta fonction déclare une variable "nombreMot" qui elle non plus n'est pas utilisée...
void demanderMotSecret(char* mot) { printf("\n" "Entrez le mot secret : "); fgets(mot, TAILLE_MAX, stdin); // Évite les buffer overflow, contrairement à scanf ;-) printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); }