Compare commits

...

11 commits
1 ... main

4 changed files with 64 additions and 34 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
.vscode .vscode
*.pdf *.pdf
main main
main.exe

12
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,12 @@
image: gcc
stages:
- build
build:
stage: build
script:
- gcc main.c -o pendu
artifacts:
paths:
- pendu

View file

@ -1,4 +1,6 @@
# Pendu # Pendu
Mon premier pendu tout language confondu, s'il y a des approximations tu peux faire une PR 😀 Mon premier pendu tout language confondu, s'il y a des approximations tu peux faire une PR 😀
Pour lancer le pendu : `git clone https://github.com/Mylloon/pendu-C.git && cd pendu-C && gcc main.c -o main && ./main listeMots.txt` devrait fonctionner. Pour lancer le pendu : `git clone https://gitlab.com/Mylloon/penduEnC.git && cd penduEnC && gcc main.c -o main && ./main listeMots.txt` devrait fonctionner.
Tu peux aussi télécharger l'artéfact de la [dernière pipeline](https://gitlab.com/Mylloon/penduEnC/-/pipelines/).

81
main.c
View file

@ -2,14 +2,14 @@
#include <time.h> #include <time.h>
#include <stdlib.h> #include <stdlib.h>
int longueurMot(const char mot[]) { int longueurMot(const char mot[]) { // pour connaitre la longueur d'un mot
int taille; int taille;
for(taille = 0; mot[taille] != 0; taille++); for(taille = 0; mot[taille] != 0; taille++);
return taille; return taille;
} }
char * recuperationMot(const char file[]) { char * recuperationMot(const char file[]) { // pour récupérer un mot aléaotoirement dans un fichier
int tailleMaxMot = 25; int tailleMaxMot = 25;
char * mot = malloc(tailleMaxMot * sizeof(char)); char * mot = malloc(tailleMaxMot * sizeof(char));
@ -48,63 +48,78 @@ char * recuperationMot(const char file[]) {
return mot; return mot;
} }
char * obfuscation(char mot[], int lettresValidees[], int taille) { int caractereSpecial(char lettre) { // vérification que la lettre n'est pas un caractere special
int tailleMot = taille * 2; if(lettre == ' ') return 1;
char * motCache = malloc(tailleMot * sizeof(char)); if(lettre == '\'') return 1;
if(lettre == '-') return 1;
return 0;
}
char * obfuscation(char mot[], int lettresValidees[], int taille) { // pour afficher les trous dans le mot
int tailleMotCache = taille * sizeof(char) * 2;
char * motCache = malloc(tailleMotCache); // x2 pour l'espace entre les "_"
int j = 0; int j = 0;
for(int i = 0; i < taille; i++) { for(int i = 0; i < taille; i++) {
if(lettresValidees[i] != 1) motCache[j] = '_'; else motCache[j] = mot[i]; if(lettresValidees[i] != 1) { // pas trouvé
motCache[j + 1] = ' '; if(caractereSpecial(mot[i]) == 0) motCache[j] = '_'; // si c'est pas un caractère spéciale
else { // si c'en est un
motCache[j] = mot[i];
lettresValidees[i] = 1;
}
} else motCache[j] = mot[i]; // trouvé
motCache[j + 1] = ' '; // on rajoute un espace entre les underscores
j = j + 2; j = j + 2;
} }
for(int i = 0; i < longueurMot(motCache); i++)
if(i >= tailleMotCache) motCache[i] = 0;
return motCache; return motCache;
} }
int lettreDansMot(char mot[], int tailleMot, char lettre[], int lettresValidees[]) { int lettreDansMot(char mot[], int tailleMot, char lettre[], int lettresValidees[]) { // pour vérifier si la lettre est dans le mot
int ok = 0; int ok = 0;
for(int i = 0; i < tailleMot; i++) if(mot[i] == lettre[0]) { for(int i = 0; i < tailleMot; i++) if(mot[i] == lettre[0]) {
lettresValidees[i] = 1; lettresValidees[i] = 1; // note que la lettre a été découverte
ok = 1; ok = 1;
}; };
return ok; return ok;
} }
int partieGagnee(int lettresValidees[], int taille) { int partieGagnee(int lettresValidees[], int taille) { // pour vérifier si la partie est gagné
for(int i = 0; i < taille; i++) if(lettresValidees[i] != 1) return 0; for(int i = 0; i < taille; i++) if(lettresValidees[i] != 1) return 0;
return 1; return 1;
} }
int jeu() { int jeu(const char liste[]) { // déroulement du jeu
// mot aléatoire char * mot = recuperationMot(liste); // mot aléatoire
char liste[14] = "listeMots.txt"; int tailleMot = longueurMot(mot); // longueur du mot
char * mot = recuperationMot(liste); int tableauLettresValidees[tailleMot]; // tableau des lettres trouvés par le joueur
int tailleMot = longueurMot(mot); for(int i = 0; i < tailleMot; i++) tableauLettresValidees[i] = 0; // initialisation de tout le tableau à 0
int tableauLettresValidees[tailleMot]; char * motObfusque; // mot avec les lettres pas encore trouvées cachées
char * motObfusque; int demandeLettre; // scanf
int demandeLettre; char lettre; // lettre que le joueur propose
char lettre; short int essaisRestants = 10; // nombre d'essais
for(int i = 0; i < tailleMot; i++) tableauLettresValidees[i] = 0; int finDuJeu = 0; // 0 si partie en cours, 1 si partie terminée
// lancement jeu // lancement jeu
short int essaisRestants = 10;
int finDuJeu = 0;
while(finDuJeu == 0) { while(finDuJeu == 0) {
motObfusque = obfuscation(mot, tableauLettresValidees, tailleMot); motObfusque = obfuscation(mot, tableauLettresValidees, tailleMot); // récupération du mot a trou
printf("\nMot à trouver : %s\n", motObfusque); printf("\nMot à trouver : %s\n", motObfusque);
free(motObfusque); free(motObfusque);
printf("Nombre d'erreurs restantes : %hu\n", essaisRestants); printf("Nombre d'erreurs restantes : %hu\n", essaisRestants);
printf("Saisissez une lettre : "); printf("Saisissez une lettre : ");
demandeLettre = scanf(" %c", &lettre); demandeLettre = scanf(" %c", &lettre); // demande de la lettre au joueur
if(demandeLettre == 1) { if(demandeLettre == 1) {
printf("\n"); printf("\n");
if(lettre >= 97 && lettre <= 122) lettre = lettre - 32; if(lettre >= 97 && lettre <= 122) lettre = lettre - 32; // capitalisation de la lettre
// vérification si lettre dans le mot // vérification si lettre dans le mot
if(lettreDansMot(mot, tailleMot, &lettre, tableauLettresValidees) == 1) { if(lettreDansMot(mot, tailleMot, &lettre, tableauLettresValidees) == 1) { // vérification lettre dans le mot
printf("La lettre %c est dans le mot !\n", lettre); printf("La lettre %c est dans le mot !\n", lettre);
if(partieGagnee(tableauLettresValidees, tailleMot) == 1) { if(partieGagnee(tableauLettresValidees, tailleMot) == 1) { // vérification partie gagnée
printf("Le mot est %s\n", mot); printf("Le mot est %s\n", mot);
return 1; return 1;
} }
@ -113,12 +128,12 @@ int jeu() {
essaisRestants--; essaisRestants--;
} }
} else perror("Error"); } else perror("Error");
// verification plus d'essais restants
if(essaisRestants == 0) finDuJeu = 1;
}
if(essaisRestants == 0) finDuJeu = 1; // verification plus d'essais restants
}
printf("\nLe mot était %s\n", mot);
free(mot); free(mot);
return 0; return 0;
} }
@ -130,8 +145,8 @@ int main(const int argc, const char * argv[]) {
return 0; return 0;
} }
argv++; argv++;
if(jeu(argv) == 1) printf("\\o/ Bravo ! Vous remportez la partie ! \\o/\n"); if(jeu(argv[0]) == 1) printf("\\o/ Bravo ! Vous remportez la partie ! \\o/\n");
else printf("Euh.. sérieux ? Vous perdez la partie.\n"); else printf("Vous perdez la partie.\n");
} else printf("Veuillez préciser le dictionnaire à utiliser.\n"); } else printf("Veuillez préciser le dictionnaire à utiliser.\n");
return 0; return 0;