Projet amelioration jeu du Pendu
Résolu
jeandchanel
Messages postés
135
Date d'inscription
Statut
Membre
Dernière intervention
-
jeandchanel Messages postés 135 Date d'inscription Statut Membre Dernière intervention -
jeandchanel Messages postés 135 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; }
A voir également:
- Projet amelioration jeu du Pendu
- Jeu du pendu - Télécharger - Vie quotidienne
- 94 jeu - Télécharger - Puzzle & Réflexion
- 94 degrés jeu - Télécharger - Divers Jeux
- Filigrane projet - Guide
- Jeu zuma - Télécharger - Jeux vidéo
1 réponse
Je crois que tu ne comprends pas très bien ce que signifie
- Dans une déclaration ou un paramètre de fonction (par exemple:
- Dans une expression (par exemple
É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 type
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...
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 exemple
return 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 type
void), 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"); }
merci pour tes conseilles, j'ai fait cette correction mais cela n'a pas résolu le problème.
Dans une déclaration ou un paramètre de fonction (par exemple:
char motSecret[TAILLE_MAX];
), cela signifie "Allouer automatiquement un tableau
Oui dans une déclaration mais pas dans un paramètre de fonction. Dans le paramètre de fonction, cela est remplacé par un pointeur.
Si c'est un paramètre de fonction, le tableau n'est pas alloué et seule son adresse est passée.
j'ai fait toutes ces corrections mais je ne suis pas satisfait.
s'il vous plait, executez le jeu et observez le mode Multi, il ne fonctionne pas correctement !!!