16 Commits

Author SHA1 Message Date
b7de5a5c70 Supprimer exependu 2024-10-25 22:36:12 +02:00
5970b43f61 correction final historique partie 2024-10-25 22:35:10 +02:00
16f081c454 correctif bug save file 2024-10-25 18:43:33 +02:00
c0024eb101 Ajouter README.md 2024-10-24 23:53:23 +02:00
64baba6c61 Fix merge 2024-10-23 21:32:59 +02:00
159c83ea8d Added difficulty and comments 2024-10-23 21:01:29 +02:00
8877777c62 Commentaires 2024-10-15 12:27:04 +02:00
10c9aca59a Actualiser pendu.c 2024-10-15 12:16:52 +02:00
3c4ed87d6c ajout des commentaires. 2024-10-15 12:12:39 +02:00
ebfe656cf4 ajout du cooldown sur le scanf 2024-10-15 12:12:04 +02:00
4960203ced Merge pull request 'dev-landrin' (#6) from dev-landrin into master
Reviewed-on: #6
2024-10-15 12:04:07 +02:00
2598c1951d Supprimer exependu 2024-10-15 12:02:39 +02:00
fba618ec0e Dylan Landrin add some comments 2024-10-15 12:01:14 +02:00
509db16917 Added comments 2024-10-15 11:59:29 +02:00
179c7b82c0 Dylan Landrin add save file 2024-10-15 11:33:30 +02:00
2fd6561591 Added difficulty 2024-10-15 11:32:49 +02:00
3 changed files with 155 additions and 2 deletions

23
README.md Normal file
View File

@@ -0,0 +1,23 @@
# TD3_DEV51_Qualite_Algo
###### par SCHIED Killian, LANDRIN Dylan et ROCHER Léo
## Exercice 4
### Complexité cyclomatique
Pour la complexité cyclomatique de chaque fonction nous avons calculé ceci :
| Fonction | Complexité Cyclomatique |
|---------------------------------------|-------------------------|
| `display_hangman(int tries)` | 7 |
| `save_party(char *status, const char *good_word, char try[])` | 3 |
| `sig_handler(int signum)` | 2 |
| `getWordByLength()` | 3 |
| `main()` | 13 |
### Utilisation de gprof
Le programme étant petit et fait appel à peu de fonction, l'utilisation de gprof ne nous permet pas d'obtenir d'information utile.
### Conclusion sur la qualité du code
Le code est fonctionnel et globalement efficace. On peut améliorer la quantité de commentaire et trouver un moyen de réduire la complexité cyclomatique du main.

122
pendu.c
View File

@@ -1,7 +1,9 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#define MAX_WORDS 14
#define MAX_TRIES 6
@@ -35,13 +37,118 @@ void display_hangman(int tries) {
}
}
/*
this function allow to save the last party
Parameters:
status -> state that save if the gamer win or lose the party
good_word -> the word to guess
try -> the wrong letters try by the gamer
cpt_try -> the try's table size
good_try -> the good letters try by the gamer
cpt_good_try -> the good_try's table size
*/
void save_party(char * status, const char * good_word, char try[], int cpt_try, char good_try[], int cpt_good_try) {
time_t t;
time(&t); //stock the current time
char * date;
date = ctime(&t); //stock the current time format as: day, month, number of the month, hour, year
FILE* fichier = fopen("save_party.txt", "a");
if (fichier != NULL)
{
fputs("Date and time: ", fichier);
fputs(date,fichier);
fputs("Status: ", fichier);
fputs(status,fichier);
fputs("\n",fichier);
fputs("Good word: ", fichier);
fputs(good_word,fichier);
fputs("\n",fichier);
fputs("tried letters: ", fichier);
for (int i = 0; i < cpt_try; i++) {
fputc(try[i],fichier);
}
fputs("\n",fichier);
fputs("guessed letters: ", fichier);
for (int i = 0; i < cpt_good_try; i++) {
fputc(good_try[i],fichier);
}
fputs("\n",fichier);
fputs("\n",fichier);
fclose(fichier); // Close the opened file
}
}
/* this function display time out when user does nothing during 30s and verify signal*/
void sig_handler(int signum){
if (signum == SIGALRM){
printf("\ntime out\n");
exit (1);
}
}
/*
getWordByLength() function adds the possibility to the user to choose how many letters maximum the word to guess can contains.
Returns:
A random word from the words list that correspond to the user input
*/
const char* getWordByLength(){
int maxLetters;
printf("Difficulté - Entrez le nombre de lettres maximum à deviner : ");
scanf(" %d", &maxLetters);
const char *newWords[MAX_WORDS];
int wordsFound = 0;
for (int i = 0; i < MAX_WORDS; i++) {
if(strlen(words[i]) <= maxLetters){
newWords[wordsFound] = words[i];
wordsFound++;
}
}
if(wordsFound==0){
return "";
}
const char *word = newWords[rand() % wordsFound];
/* SECOND WORD TO GUESS (NOT WORKING)
wordsFound = 0;
for (int i = 0; i < MAX_WORDS; i++) {
if(strlen(words[i]) <= maxLetters-strlen(word)){
newWords[wordsFound] = words[i];
wordsFound++;
}
}
if(wordsFound != 0){
word = (const char*) strcat((char *) word, newWords[rand() % wordsFound]);
}*/
return word;
}
int main() {
srand(time(NULL));
const char *word = words[rand() % MAX_WORDS];
const char *word = getWordByLength();
if(word==""){
printf("Aucun mot n'a été trouvé.");
return 1;
}
int word_length = strlen(word);
char guessed[word_length];
int tries = 0;
int guessed_correctly = 0;
char try[MAX_TRIES]; //save the carcater false
char good_try[word_length]; //save the carcater good
int cpt = 0;
signal(SIGALRM,sig_handler);
signal(SIGALRM,sig_handler);
for (int i = 0; i < word_length; i++) {
guessed[i] = '_';
@@ -49,11 +156,16 @@ int main() {
guessed[word_length] = '\0';
while (tries < MAX_TRIES && guessed_correctly < word_length) {
printf("\nMot à deviner : %s\n", guessed);
display_hangman(tries);
char guess;
alarm(30);
printf("Entrez une lettre : ");
alarm(30);
scanf(" %c", &guess);
int found = 0;
for (int i = 0; i < word_length; i++) {
@@ -67,16 +179,22 @@ int main() {
}
if (!found) {
try[tries] = guess;
tries++;
}else{
good_try[cpt] = guess;
cpt++;
}
}
if (guessed_correctly == word_length) {
printf("Félicitations ! Vous avez deviné le mot : %s\n", word);
save_party("Win", word, try, tries, good_try, cpt);
} else {
printf("Désolé, vous avez perdu. Le mot était : %s\n", word);
display_hangman(MAX_TRIES);
save_party("Lose", word, try, tries, good_try, cpt);
}
return 0;
}
}

12
save_party.txt Normal file
View File

@@ -0,0 +1,12 @@
Date and time: Fri Oct 25 22:29:13 2024
Status: Lose
Good word: koala
tried letters: zertyu
guessed letters: a
Date and time: Fri Oct 25 22:29:40 2024
Status: Win
Good word: code
tried letters: a
guessed letters: code