Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/09/2020, à 14:10

Nuliel

deviner mot en C: conseils pour progresser

Bonjour,
J'ai fait un début de jeu doù il faut deviner un mot (chaussette ici) en C, le voici

#include <string.h>
#include <stdio.h>
#include <stdbool.h>

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define REMAINING_TRIES 10

int main()
{
    char word[] = "chaussette";
    char word2[strlen(word)+1];
    bool not_found = true;
    char letter;
    int remaining_tries = REMAINING_TRIES;
    int c;

    for (int i = 0; i < strlen(word); i++)
    {
        word2[i] = '*';
    }
    word2[strlen(word)] = '\0';
 
    printf("Find the word: \n");
    printf("%s \n", word2);
    do
    {
        scanf("%c", &letter);
        while((c = getchar()) != '\n' && c != EOF);
        if (strchr(word, letter) != NULL)
        {
            for (int i = 0; i < strlen(word); i++)
            {
                if (word[i] == letter)
                {
                    word2[i] = letter;
                }
            }
            printf("%s \n", word2);
            if (strcmp(word, word2) == 0)
            {
                printf("You found the word!\n");
                not_found = false;
            }
        }
        else
        {
            if (remaining_tries == 1)
            {
                printf("Game Over\n");
                return EXIT_FAILURE;
            }
            remaining_tries--;
            printf("Letter is not in the word, %d tries remaining\n", remaining_tries);
        }
        
    } while (not_found);
    
    return EXIT_SUCCESS;
}

Quels conseils pourriez vous donner pour améliorer la lisibilité de ce programme, et permettre une saisie sécurisée aussi?
Si vous pouviez ne pas me donner directement le code corrigé mais plutôt m'aiguiller vers les fonctions plus adaptées (en particulier pour la saisie sécurisée), ce serait top!
(en particulier enlever le while((c = getchar()) != '\n' && c != EOF); que je trouve affreux mais qui a le mérite de fonctionner en attendant une solution propre)
Merci d'avance,
Nuliel

Hors ligne

#2 Le 14/09/2020, à 16:02

grigouille

Re : deviner mot en C: conseils pour progresser

Il faut mettre srlen(word) en cache dans une variable


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#3 Le 14/09/2020, à 18:49

Nuliel

Re : deviner mot en C: conseils pour progresser

Merci grigouille, du coup

#include <string.h>
#include <stdio.h>
#include <stdbool.h>

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define REMAINING_TRIES 10

int main()
{
    char word[] = "chaussette";
    int length_word = strlen(word);
    char word2[length_word+1];
    bool not_found = true;
    char letter;
    int remaining_tries = REMAINING_TRIES;
    int c;

    for (int i = 0; i < length_word; i++)
    {
        word2[i] = '*';
    }
    word2[length_word] = '\0';
 
    printf("Find the word: \n");
    printf("%s \n", word2);
    do
    {
        scanf("%c", &letter);
        while((c = getchar()) != '\n' && c != EOF);
        if (strchr(word, letter) != NULL)
        {
            for (int i = 0; i < length_word; i++)
            {
                if (word[i] == letter)
                {
                    word2[i] = letter;
                }
            }
            printf("%s \n", word2);
            if (strcmp(word, word2) == 0)
            {
                printf("You found the word!\n");
                not_found = false;
            }
        }
        else
        {
            if (remaining_tries == 1)
            {
                printf("Game Over\n");
                return EXIT_FAILURE;
            }
            remaining_tries--;
            printf("Letter is not in the word, %d tries remaining\n", remaining_tries);
        }
        
    } while (not_found);
    
    return EXIT_SUCCESS;
}

C'est vrai que c'est pas utile de calculer 15 fois la longueur du texte fixé.

Hors ligne

#4 Le 14/09/2020, à 18:55

NicoApi73

Re : deviner mot en C: conseils pour progresser

Salut Nuliel,

Je te conseille de faire plusieurs blocs plutôt qu'une seule fonction main, avec un minimum dans main pour initialiser.

Tu peux également décomposer en MVC, aussi simple soient ils

Hors ligne

#5 Le 14/09/2020, à 19:14

Nuliel

Re : deviner mot en C: conseils pour progresser

Merci NicoApi73. Comme ça prenait pas tant de lignes, j'ai tout fait dans le main, mais je vais séparer tout ça, ce sera plus propre et plus modulaire.

Au passage, je vais faire beaucoup beaucoup de C cette année, en réalité je prends de l'avance pour pouvoir produire du code lisible rapidement.

Dernière modification par Nuliel (Le 14/09/2020, à 19:15)

Hors ligne

#6 Le 14/09/2020, à 19:18

NicoApi73

Re : deviner mot en C: conseils pour progresser

D'autant qu'à un moment donné tu vas travailler sur des sujets spécifiques. Par exemple un générateur de mot aléatoire (utilisant un dictionnaire par exemple). Ca ne doit pas impacter la présentation de l'information. A un autre moment tu souhaiteras peut être présenter l'information dans une interface fenêtrée, ça ne doit pas impacter la gestion (et génération) des mots...

Les lignes que tu sauves maintenant te feront perdre beaucoup de temps par la suite smile

Hors ligne

#7 Le 14/09/2020, à 19:28

Nuliel

Re : deviner mot en C: conseils pour progresser

Exactement, il faut que je perde maintenant les mauvaises habitudes, et que je prenne de bonnes habitudes de codage.

Hors ligne