This repository has been archived on 2022-03-31. You can view files and clone it, but cannot push or open issues or pull requests.
penduEnC/main.c

151 lines
5.1 KiB
C
Raw Permalink Normal View History

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
2021-05-22 22:35:25 +02:00
int longueurMot(const char mot[]) { // pour connaitre la longueur d'un mot
int taille;
for(taille = 0; mot[taille] != 0; taille++);
return taille;
}
2021-05-22 22:35:25 +02:00
char * recuperationMot(const char file[]) { // pour récupérer un mot aléaotoirement dans un fichier
int tailleMaxMot = 25;
char * mot = malloc(tailleMaxMot * sizeof(char));
// gestion erreur
FILE * fp = fopen(file, "r");
if(fp == NULL) {
perror("Error");
}
long int tailleFichier = 0;
// on récupère le nombre de mots qu'il y a dans le fichier
while(fgets(mot, tailleMaxMot, fp) != NULL) tailleFichier++;
// chiffre aléatoire pour mot aléatoire
srand(time(NULL));
int chiffreAleatoire = (rand() % tailleFichier) + 1;
// recuperation du mot sélectionner
tailleFichier = 0;
rewind(fp); // reset le pointeur au début du fichier
while(fgets(mot, tailleMaxMot, fp) != NULL) {
tailleFichier++;
if(tailleFichier == chiffreAleatoire) break;
}
// fermeture du fichier
fclose(fp);
2021-05-21 23:45:21 +02:00
// suppression du saut de ligne à la fin du mot
int tailleMot = longueurMot(mot);
if(mot[tailleMot - 1] == '\n') mot[tailleMot - 1] = 0;
2021-05-21 23:45:21 +02:00
// passage en majusucule du mot
for(int i = 0; i < tailleMot; i++) if(mot[i] >= 97 && mot[i] <= 122) mot[i] = mot[i] - 32;
return mot;
}
2021-05-22 23:07:04 +02:00
int caractereSpecial(char mot) { // vérification que la lettre n'est pas un caractere special
if(mot == ' ') return 1;
if(mot == '\'') return 1;
if(mot == '-') return 1;
return 0;
}
2021-05-22 22:35:25 +02:00
char * obfuscation(char mot[], int lettresValidees[], int taille) { // pour afficher les trous dans le mot
int tailleMot = taille * 2;
char * motCache = malloc(tailleMot * sizeof(char));
int j = 0;
for(int i = 0; i < taille; i++) {
2021-05-22 23:07:04 +02:00
if(lettresValidees[i] != 1) {
if(caractereSpecial(mot[i]) == 0) motCache[j] = '_'; else {
motCache[j] = mot[i];
lettresValidees[i] = 1;
}
} else motCache[j] = mot[i];
2021-05-22 22:35:25 +02:00
motCache[j + 1] = ' '; // on rajoute un espace entre les underscores
2021-05-21 23:45:21 +02:00
j = j + 2;
}
return motCache;
}
2021-05-22 22:35:25 +02:00
int lettreDansMot(char mot[], int tailleMot, char lettre[], int lettresValidees[]) { // pour vérifier si la lettre est dans le mot
2021-05-22 00:00:12 +02:00
int ok = 0;
for(int i = 0; i < tailleMot; i++) if(mot[i] == lettre[0]) {
2021-05-22 22:35:25 +02:00
lettresValidees[i] = 1; // note que la lettre a été découverte
2021-05-22 00:00:12 +02:00
ok = 1;
};
return ok;
2021-05-21 23:14:56 +02:00
}
2021-05-22 22:35:25 +02:00
int partieGagnee(int lettresValidees[], int taille) { // pour vérifier si la partie est gagné
2021-05-21 23:45:21 +02:00
for(int i = 0; i < taille; i++) if(lettresValidees[i] != 1) return 0;
return 1;
}
2021-05-22 22:37:02 +02:00
int jeu(const char liste[]) { // déroulement du jeu
char * mot = recuperationMot(liste); // mot aléatoire
int tailleMot = longueurMot(mot); // longueur du mot
int tableauLettresValidees[tailleMot]; // tableau des lettres trouvés par le joueur
2021-05-22 22:46:15 +02:00
for(int i = 0; i < tailleMot; i++) tableauLettresValidees[i] = 0; // initialisation de tout le tableau à 0
char * motObfusque; // mot avec les lettres pas encore trouvées cachées
int demandeLettre; // scanf
char lettre; // lettre que le joueur propose
short int essaisRestants = 10; // nombre d'essais
int finDuJeu = 0; // 0 si partie en cours, 1 si partie terminée
// lancement jeu
while(finDuJeu == 0) {
motObfusque = obfuscation(mot, tableauLettresValidees, tailleMot); // récupération du mot a trou
printf("\nMot à trouver : %s\n", motObfusque);
free(motObfusque);
printf("Nombre d'erreurs restantes : %hu\n", essaisRestants);
2021-05-21 23:14:56 +02:00
printf("Saisissez une lettre : ");
demandeLettre = scanf(" %c", &lettre); // demande de la lettre au joueur
2021-05-21 23:14:56 +02:00
if(demandeLettre == 1) {
2021-05-21 23:45:21 +02:00
printf("\n");
if(lettre >= 97 && lettre <= 122) lettre = lettre - 32; // capitalisation de la lettre
2021-05-21 23:14:56 +02:00
// vérification si lettre dans le mot
if(lettreDansMot(mot, tailleMot, &lettre, tableauLettresValidees) == 1) { // vérification lettre dans le mot
2021-05-21 23:14:56 +02:00
printf("La lettre %c est dans le mot !\n", lettre);
if(partieGagnee(tableauLettresValidees, tailleMot) == 1) { // vérification partie gagnée
2021-05-21 23:45:21 +02:00
printf("Le mot est %s\n", mot);
return 1;
}
2021-05-21 23:14:56 +02:00
} else {
printf("La lettre %c n'est pas dans le mot !\n", lettre);
essaisRestants--;
}
} else perror("Error");
if(essaisRestants == 0) finDuJeu = 1; // verification plus d'essais restants
}
printf("\nLe mot était %s\n", mot);
free(mot);
return 0;
}
int main(const int argc, const char * argv[]) {
printf("-- Jeu du Pendu --\n");
if(argc > 1) {
if(argc > 2) {
printf("Trop d'arguments renseignés.\n");
return 0;
}
argv++;
2021-05-22 22:37:02 +02:00
if(jeu(argv[0]) == 1) printf("\\o/ Bravo ! Vous remportez la partie ! \\o/\n");
else printf("Vous perdez la partie.\n");
} else printf("Veuillez préciser le dictionnaire à utiliser.\n");
return 0;
}