Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Avis code jeu pendu


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Avis code jeu pendu
    Salut je m'appelle Yves , je débute en programmation informatique et je voudrais avoir des conseils et avis sur mon code que voici :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int recherche_et_modifie_caractere(char *c,char mot[],char mot2[]);
    
    int main ()
    {
        char lettreentre=0;
        int nombre_de_coup=5;
        char mot[100]="";
        char mot2[100]="";
        int i=0;
        int j=0;
        int h=0;
    
    
    
        printf("bienvenue dans le jeu du pendu pourriez vous deviner le mot ??\n\n");
    
    
        FILE *ptr=NULL;
        ptr=fopen("/storage/emulated/0/backups/dico.txt","r");
    
    
        if(ptr==NULL)
            {
                printf("impossible d'ouvrir le fichier");
                return 0;
            }
    
    
        else
    
            srand(time(NULL));
        j=rand()%3+1;
    
        for(h=0; h<j; h++)
            {
                fgets(mot,100,ptr);
            }
    
        strcpy(mot2,mot);
    
        for(i=0; i<strlen(mot)-1; i++)
            {
                mot[i]='*';
            }
    
    
        while(nombre_de_coup != 0)
            {
                printf("\nsaisissez votre lettre\n");
                printf("%s\n",mot);
                scanf("%c",&lettreentre);
                while(!(getc(stdin)=='\n'));
                recherche_et_modifie_caractere(&lettreentre,mot,mot2);
    
    
                printf("%s\n",mot);
    
                if(recherche_et_modifie_caractere(&lettreentre,mot,mot2) < 1)
                    {
                        nombre_de_coup--;
                        printf("cette lettre ne se trouve pas dans le mot\n");
                        printf("il vous reste %d coups\n",nombre_de_coup);
                    }
    
    
                else if(strcmp(mot2,mot)==0)
                    {
                        printf("\ncongratulation vous avez trouvez le mot mystere\n");
                        return 0;
                    }
            }
    
        printf("vous avez perdu");
        return 0;
    }
    
    
    
    
    
    
    
    int recherche_et_modifie_caractere(char *c,char mot[],char mot2[])
    {
    
        int j=0;
        int i =0;
    
        while(mot2[j] != '\0')
            {
    
                if(mot2[j] == *c)
                    {
    
                        mot[j]=*c;
                        i++;
    
                    }
                j++;
            }
    
    
    
        return i;
    }

    Merci !!

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    11 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 234
    Points : 27 801
    Points
    27 801
    Par défaut
    Salut, et bienvenue sur le forum.

    De manière générale, une fonction de cent lignes est une fonction qui en fait beaucoup trop. Cela se confirme dans ton code, car, si on y regarde d'un peu plus près:
    1. les lignes 10 à 16 déclarent les données dont tu as besoin
    2. les lignes 22 à 48 ont essentiellement pour objectif d'aller lire dans un fichier (au fait : fais attention aux accolades au niveau des if, else et autre "blocs d'instructions" )
    3. les lignes 51 à 77 s'occupent de la partie proprement dite, à savoir
      1. les lignes 53 à 56 s'occupent de l'introduction de l'utilisateur
      2. les lignes 62 à 67 gèrent la présence (ou l'absence) du caractère introduit par l'utilisateur dans le mot choisi
      3. les lignes 70 à 74 congratulent l'utilisateur pour avoir trouvé le mot

    Tu te retrouves donc à faire six choses totalement différentes dans une seule fonction, c'est cinq choses de trop

    De plus, ta logique est loin d'être excellente, parce que :
    • tu oblige le joueur à relancer l'application après avoir perdu. Pourquoi ne lui permettrais tu pas de jouer plusieurs parties d'affilée
    • tu ouvres un fichier que tu ne fermes jamais... C'est pas bien du tout
    • tu indiques clairement au joueur que la lettre introduite n'existe pas dans le mot qu'il cherche, ce qui est très bien, mais tu ne lui dit rien si la lettre existe : il doit attendre t'avoir trouvé le mot entier pour savoir qu'il a gagné! il serait peut-être utile de lui dire que la lettre qu'il a choisie se trouve (éventuellement le nombre de fois ) dans le mot, non


    Enfin, à ma connaissance, les mots de plus de vingt lettres sont excessivement rares en francais (je n'en connais qu'un : anticonstitutionnel, et ses dérivées). Pourquoi prévoir 99 caractères pour le mot
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oups j'ai oublier de fermer le fichier.
    Faire des fonctions pour tous ça wouah !!

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    11 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 234
    Points : 27 801
    Points
    27 801
    Par défaut
    Citation Envoyé par hades_h Voir le message
    Faire des fonctions pour tous ça wouah !!
    Cela n'a l'air de rien, mais c'est une excellente habitude à prendre dés le départ !

    Pour l'instant, tu "fais joujou" avec un code de 109 lignes à peine, et c'est compréhensible, vu que tu essayes visiblement d'apprendre. Mais tu vas très rapidement en arriver à vouloir faire des choses largement plus compliquées, et ce ne sera plus 109 lignes que tu devras maintenir, mais ... 109 fichiers de plusieurs milliers de lignes (et peut-être même encore bien d'avantage)

    Dans une telle configuration, ta seule planche de salut, ta seule chance d'arriver à t'y retrouver "un tant soit peu" dans ton code -- que ce soit pour corriger un bug, pour ajouter une nouvelle fonctionnalité ou, simplement, pour retrouver "facilement" la fonction que tu doit appeler pour obtenir le résultat attendu -- est d'avoir un code parfaitement structuré, parfaitement organisé.

    Et, pour y arriver, il n'y a pas trente-six solutions : il faut respecter certaines règles. La principale étant que chaque donnée, chaque type de donnée et chaque fonction doit se limiter à une et une seule responsabilité bien précise; ne doit servir qu'à une et une seule chose clairement définie.

    Cela peut te paraitre superflu, voire même exagéré, de créer une fonction qui n'a que quatre ou cinq instructions à exécuter (et parfois encore moins que cela), mais si cette fonction correspond à un verbe (ou à un groupe verbal) dans ton analyse des besoins, c'est tout à fait justifié, car il faut impérativement que tous les besoins exprimés trouvent un équivalent dans le code.

    Et, surtout, cela t'apportera une flexibilité à nulle autre pareille, car, à partir du moment où tu as plusieurs fonctions qui s'occupent de choses bien précises, tu peux décider de les assembler, dans l'ordre que tu veux (ou peu s'en faut) -- exactement comme des pièces de lego -- pour obtenir des comportements plus complexes.

    Ne vas donc pas croire que "c'est une perte de temps" de créer de petites fonctions. Bien au contraire, cela t'en fera gagner énormément sur le long terme:
    • parce qu'une fonction qui ne fait qu'une chose est facile à tester, et que, une fois que l'on a la certitude qu'elle fait cette chose correctement, on peut l'écarter de la raison probable d'un problème
    • parce que, si tu as trois fonctions qui peuvent chacune n'être appelées qu'une seule fois, tu te retrouves malgré tout avec ... six combinaisons possibles pour les appeler toutes les trois
    • parce que l'on s'y retrouve beaucoup plus facilement, en cas de problème, dans un code de dix lignes que dans un code de 100 lignes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ok merci pour le conseil

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 362
    Points : 20 982
    Points
    20 982
    Billets dans le blog
    1
    Par défaut
    Bonjour

    En dehors des excellents conseils de koala01, moi je vais parler de la forme. Parce que la forme d'un code aide à mieux le lire, le relire ou le corriger

    Exemple dans cette partie
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(ptr==NULL)
            {
                printf("impossible d'ouvrir le fichier");
                return 0;
            }
     
     
        else
     
            srand(time(NULL));

    Déjà, il y a une ligne vide inutile avant le "else" et une autre avant sa conséquence. Ensuite tu décales deux fois (une fois pour les accolades, une fois pour les instructions). Or un des soucis majeurs de ceux qui indentent à chaque niveau c'est que parfois ils en arrivent à commencer leur code au milieu de l'écran. Si toi tu décales deux fois par niveau, tu en arriveras alors à commencer complètement à droite. Et enfin si tu sors du programme quand le fichier n'est pas ouvert, alors inutile de mettre un "else" puisque si on arrive à cette étape, c'est que le fichier a bien été ouvert.
    Et puis aère un peu tes instructions quoi. Pas la peine de tout serrer quand tu écris. Aimeraistuquetoutesmesphrasessoientécritesainsi???

    Détail: rajoute un "\n" systématique en fin d'affichage. Déjà ce sera beaucoup plus propre à l'écran (une fois le programme terminé, ton prompt ne s'affichera pas bêtement en fin de texte mais bien proprement sur une nouvelle ligne) et surtout, l'affichage est alors immédiat. Parce qu'en C, les IO sont bufferisées et sans '\n', il est alors possible qu'un printf() ne s'affiche pas réellement quand il est invoqué mais bien plus tard ce qui peut être source de confusion.

    Voici donc deux façons d'écrire ces lignes
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (ptr == NULL)
    {
    	printf("impossible d'ouvrir le fichier\n");
    	return 0;
    }
    srand(time(NULL));

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (ptr == NULL) {
    	printf("impossible d'ouvrir le fichier\n");
    	return 0;
    }
    srand(time(NULL));
    Perso j'ai utilisé par la première pendant assez longtemps puis un jour je me suis rendu compte que la seconde était plus "stylée"...

    Citation Envoyé par koala01 Voir le message
    Enfin, à ma connaissance, les mots de plus de vingt lettres sont excessivement rares en francais
    Il y en a 157 http://www.liste-de-mots.com/mots-nombre-lettre/
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    11 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 234
    Points : 27 801
    Points
    27 801
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Perso j'ai utilisé par la première pendant assez longtemps puis un jour je me suis rendu compte que la seconde était plus "stylée"...
    Et surtout, elle réduit encore le nombre de lignes

    Dans une fonction contenant deux boucles imbriquée et un test avec sa partie else, tu gagne tout de suite quatre lignes de code, ce qui n'est pas négligeable lorsque tu subi une règle absurde de "maximum XXX lignes par fonction"
    Je te crois sur parole, mais la liste présentée par le lien s'arrête à 25 (ah, je me suis rendu compte que j'oubliais otho-rhino-laringologistes )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    septembre 2015
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : septembre 2015
    Messages : 86
    Points : 504
    Points
    504
    Par défaut
    à propos de cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for(i=0; i<strlen(mot)-1; i++)
            {
                mot[i]='*';
            }
    strlen va être appelée à chaque tour de boucle
    comme la boucle ne modifie par la longueur, strlen va retourner la même valeur

    donc tu peux remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        longueur = strlen(mot);
        for(i=0; i<longueur-1; i++)
            {
                mot[i]='*';
            }
    ici, tu ne gagneras pas beaucoup en performance
    mais dans des algos plus complexes, tu pourras gagner un peu de temps
    et c'est aussi valable pour d'autres langages


    tu peux aussi faire ceci (moins lisible)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *c = mot;
    while (*c)
    {
        *c = '*';
        c++;
    }

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 362
    Points : 20 982
    Points
    20 982
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Je te crois sur parole, mais la liste présentée par le lien s'arrête à 25
    Oui, et j'ai compté ceux de 21 + ceux de 22 + ceux de 23 + ceux de 24 + ceux de 25 = 157 ...


    Citation Envoyé par Xelland Voir le message
    tu peux aussi faire ceci (moins lisible)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *c = mot;
    while (*c)
    {
        *c = '*';
        c++;
    }
    Dans ce cas, la boucle for() est justement faite pour ça
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *c;
    for (c=mot; *c /* autant être explicite ça ne coûte pas plus cher */ != '\0'; c++)
        *c = '*';

    Mais je ne dirais pas que c'est "moins lisible". C'est juste l'utilisation d'un pointeur pour balayer un tableau et c'est une chose qui devient assez courante dès qu'on maitrise le pointeur...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    11 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 234
    Points : 27 801
    Points
    27 801
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Oui, et j'ai compté ceux de 21 + ceux de 22 + ceux de 23 + ceux de 24 + ceux de 25 = 157 ...
    Oups, je croyais que tu voulais dire qu'il existe un mot de 157 lettres

    Une preuve de plus qu'il est facile de mal se comprendre, même quand on parle la même langue
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Besoin d'aide code jeu du pendu python
    Par Dirty_Monkey dans le forum Programmation multimédia/Jeux
    Réponses: 1
    Dernier message: 12/05/2016, 20h54
  2. [Débutant] Erreur de code-jeu du pendu
    Par jocelyn77 dans le forum C#
    Réponses: 8
    Dernier message: 15/02/2014, 01h14
  3. Vos avis: mon jeu Sonic 3D GL ( moteur 3D perso)
    Par Flipz137 dans le forum Moteurs 3D
    Réponses: 21
    Dernier message: 28/06/2006, 18h02
  4. Bout de code - Jeu
    Par GO dans le forum Langage
    Réponses: 1
    Dernier message: 29/01/2006, 19h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo