IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

 C++ Discussion :

[C++] Évaluer mon programme


Sujet :

C++

  1. #21
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Ta fonction newscore n'est pas bonne, il faut que tu réfléchisses un peu et que tu utilises des boucles.

    J'imagine que mon code n'est pas aussi bien que si un vrai programmeur l'avait fait, mais j'imagine que pour un mec qui a commencé à apprendre il y a 2 mois, c'est pas mal, non ? S'il y a encore d'autres trucs que je peux améliorer, n'hésitez pas à me donner davantage de conseils.
    Ton code n'est pas encore bon même pour un débutant, et surtout ta fonction newscore car ce n'est même pas un problème de syntaxe ou de connaissance du langage mais un problème plus profond d'algorithmique. Ce qui signifie que tu aurais pu coder en Java, Python ou pseudo-code tu aurais fait la même erreur, et ça c'est ultra-important de la corriger dès mtn. Les détails du langage comme la const-correctness qu'a cité Bousk sont moins importants à ton niveau. Par contre le fait de rassembler ses données dans une structure c'est également très important et ça revient dans tous les langages. Et une dernière chose, c'est sur que pour un débutant ton code n'est pas si mal mais la règle quand on apprend c'est de ne jamais arrêter d'améliorer son programme et de comprendre pourquoi. Ça fera toute la différence entre toi et les autres dans 2 ans, tu verras.

  2. #22
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Ah mais si je passe par référence constante pour afficherRecords je les tableaux ne seront plus modifiés pour être ensuite utilisés par newScore !
    Bon, pour celui-ci je ne le modifierais pas davantage...Mais je te promets que quand à l'avenir j'utiliserais des même ensembles de paramètres pour plusieurs fonctions, je les rassemblerais en structures...Et je penserais aux références constantes (j'imagien que c'est ce que vous entendez par const-correctness), sauf quand je veux vraiment que le paramètre soit modifié, comme c'est le cas pour afficherRecords.

    Et au fait, newScore utilise des boucles...où est le problème ?
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  3. #23
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Code : 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
        if (score<records[0])//si le joueur a fait un score plus petit que le meilleur, donc moins d'essais...
        {
            nouvellePlace=1;//...on indique que le joueur a battu le record...
            champions[4]=champions[3];//...on decale tout, ici les noms...
            champions[3]=champions[2];
            champions[2]=champions[1];
            champions[1]=champions[0];
            records[4]=records[3];//...puis les scores eux-memes...
            records[3]=records[2];
            records[2]=records[1];
            records[1]=records[0];
            records[0]=score;//pour enfin mettre le score du joueur comme meilleur score ! pour son nom on verra plus tard.
        }
        else if(score<records[1])
        {
            nouvellePlace=2;//ça fonctionne de la meme facon a chaque fois.
            champions[4]=champions[3];
            champions[3]=champions[2];
            champions[2]=champions[1];
            records[4]=records[3];
            records[3]=records[2];
            records[2]=records[1];
            records[1]=score;
        }
        else if(score<records[2])
        {
            nouvellePlace=3;
            champions[4]=champions[3];
            champions[3]=champions[2];
            records[4]=records[3];
            records[3]=records[2];
            records[2]=score;
        }
        else if(score<records[3])
        {
            champions[4]=champions[3];
            records[4]=records[3];
            records[3]=score;
        }
        else if(score<records[4])
        {
            nouvellePlace=5;
            records[4]=score;
        }
    Tu peux le réécrire en 5 lignes de code en réfléchissant un peu mieux.

  4. #24
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Heu, ça c'est parce qu'en fait à la place je n'utilisais pas de tableaux mais tu sais, les var1, var2 etc (ce qui est complètement idiot, je dois utiliser plus de tableaux).
    Bon, sinon comme boucle j'ai fait ça :
    Code : 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
        int nouvellePlace(0);
        if (score<records[0])//si le joueur a fait un score plus petit que le meilleur, donc moins d'essais...
        {
            for(int i(4);i!=0;i--)
            {
                champions[i]=champions[i-1];
                records[i]=records[i-1];
            }
            nouvellePlace=1;
            records[0]=score;
        }
        else if(score<records[1])
        {
            for(int i(3);i!=0;i--)
            {
                champions[i]=champions[i-1];
                records[i]=records[i-1];
            }
            nouvellePlace=2;
            records[1]=score;
        }
    //etc...
    Mais je peux faire encore mieux pas vrai ? Un seule boucle et pas une série de boucles et de conditions ? Si le C++ gérait les équations je pourrais facilement, mais là je bloque.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  5. #25
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Neoflash Okashi Voir le message
    Je sais pas si t'as remarqué mais champions et records sont des tableaux...quand aux structures j'ai appris à en faire en C mais j'ai complètement oublié et j'en m'en fiche un peu, car tant que j'ai pas appris les structures en C++ je considère que c'est pas important...Et puis je vois aps ce que ça changerait de toutes façons, pour 2 éléments...
    Allez savoir

    Ça permettrait peut-être d'ajouter en clarté, les deux éléments étant sémantiquement liés.

    Les structures en C++ sont aussi importante qu'en C. A la base, le C++ est un langage dit "structuré" (avant même d'être un langage objet). Il y a une bonne raison à ça : les structures, ça aide à rendre le code plus compréhensible en recréant les liens sémantiques qui sont absent d'un code où il n'y a pas de structure. Sans lien sémantique, le cerveau doit constamment faire de la gymnastique pour comprendre le sens de telle ou telle partie du code ; cette gymnastique continuelle a deux effets : en 1, elle réduit considérablement la lisibilité du programme (on écrit les programmes pour nous, pas pour le compilateur ; le compilateur serait parfaitement heureux avec une chaîne en hexadécimal). En 2, elle distrait le cerveau de sa véritable tâche, qui est de trouver une solution globale à un problème (et d'éviter de créer des bugs en cours de route) en noyant cette solution dans du bruit.

    Si tu me permet, et vu que tu connais déjà les structures en C, permet moi de te les apprendre en C++.

    En C, tu écrivais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct toto { ..... } toto_type;
    Ce qui avait pour effet de créer un type structure nommé toto_type, alias du type struct toto, en même temps que de déclarer une structure nommée toto. Tu peux séparer cette déclaration en deux lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct toto toto_type;
     
    struct toto {
    ...
    };
    Le code équivalent en C++ est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct toto_type
    {
    ...
    };
    Voilà, tu connais les structures en C++. C'est presque la même chose qu'en C, sauf que le mot clef struct définit un type en même temps qu'il défini une structure - contrairement au C, ou il ne fait que définir la structure et il faut utiliser typedef pour définir le type.

    Ensuite, les structures s'utilisent de la même manière en C et en C++.

    Citation Envoyé par Neoflash Okashi Voir le message
    Pour le using namespace std; je dois le mettre après les inclusions de headers aussi ? Qu'est-ce que ça change ?
    Le using namespace, tu peux aussi ne pas le mettre du tout. Ce qui signifie que chaque utilisation de la librairie standard est préfixée par std::, ce qui permet entre autre d'indiquer "ça, c'est dans la librairie standard, donc inutile de le chercher dans le code".
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #26
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    D'accord, merci beaucoup ! Les structures sont donc encore plus simple à déclarer en C++ qu'en C ! Voilà qui va m'être très utile...
    Je pense que ce sujet peut être clos, je vais le marquer comme résolu. On verra plus tard si j'ai besoin d'autre chose.
    Merci à tous !
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  7. #27
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Mais je peux faire encore mieux pas vrai ? Un seule boucle et pas une série de boucles et de conditions ? Si le C++ gérait les équations je pourrais facilement, mais là je bloque.
    Oui tu peux mieux faire, il suffit que tu regardes ce que tu fais pareillement dans tous tes if. Mais il y a encore plus simple en utilisant les algos standards.

  8. #28
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Je vois pas. Qu'est-ce que tu entends par "algo standart" ?
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  9. #29
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Citation Envoyé par Neoflash Okashi Voir le message
    Je vois pas. Qu'est-ce que tu entends par "algo standart" ?
    http://en.cppreference.com/w/cpp/algorithm

    Mais ça peut dépasser tes objectifs pour le moment, en tout cas ton code peut être simplifié même sans ça, notamment les if en série, ils font tous la même chose sauf que l'index de début est pas le même (indice...).

  10. #30
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Les détails du langage comme la const-correctness qu'a cité Bousk sont moins importants à ton niveau.
    Un ami avec de bonnes connaissances en Java qui se met au C++, au début il ne mettait aucun const dans son code (l'habitude) et n'avait pas de problème particulier. Rapidement il à commencer à inclure des libs dans son projet, et là .. plus rien ne compilait : solution rapide, des const_cast partout. Il s'est très vite lassé et est "rentré dans le rang".

    Bref tout ça pour dire que la const-correctness c'est important même pour un débutant (et en plus ça permet de détecter des erreurs de logique dans le code).

  11. #31
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Je ne suis pas d'accord, vu le niveau de son code il y a des problèmes plus important à gérer en premier ! Je trouve que c'est inutile de parler de const-correctness tout de suite, sinon on peut parler de la noexcept-correctness (?) aussi, puis... Visiblement c'est un de ses premiers programmes donc ma vision est qu'il faut d'abord corriger les erreurs qu'il ferait dans d'autres langages.

  12. #32
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    C'est effectivement mon premier vrai programme ("vrai" car je ne compte pas les fois où j'essayais juste des fonctions pour comprendre comment elles fonctionnaient) et je pense effectivement que j'ai de gros progrès à faire. C'est le cas de tout débutant, non ?
    Pour tes bibliothèques d'algorithmes je vais me pencher dessus et voir quelles fonctions pourront m'aider pour le Jeu du nombre, laisse-moi quelque jours le temps que je comprenne comment tout ça fonctionne...Au pire je chercherais un tuto.

    EDIT : Je comprends rien. Comment fonctionne std::count_if ? C'est ce que je veux utiliser, mais...
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  13. #33
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Je ne suis pas d'accord, vu le niveau de son code il y a des problèmes plus important à gérer en premier ! Je trouve que c'est inutile de parler de const-correctness tout de suite, sinon on peut parler de la noexcept-correctness (?) aussi, puis... Visiblement c'est un de ses premiers programmes donc ma vision est qu'il faut d'abord corriger les erreurs qu'il ferait dans d'autres langages.
    Parce que la const-correctness est spécifique au C++ ?
    Décider que l'objet que je passe en paramètre à ma méthode ne sera pas modifié dans celle-ci est une brique élémentaire de la programmation.
    Toute l'algorithmique n'en est que plus logique. Parce qu'il est logique qu'une fonction d'affichage ne modifie pas ce qu'elle affiche, ça tombe sous le sens qu'elle, ou/et ses paramètres, soient const. Ca permet d'avoir dès le début un code et un algo clair.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #34
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Hmmm, à moins que j'ai loupé un truc, la const-correctness est quand même très spécifique au C++, en Java ou C# tu peux déclarer des membres comme étant immutables mais pas déclarer un paramètre de fonction ou un membre de fonction const (source). Après savoir si la const-correctness est indispensable ou non c'est un autre débat, personnellement je trouve que ça améliore les programmes. Ensuite de là à dire qu'un débutant doit absolument utiliser la const-correctness (notamment pour les méthodes) c'est autre chose, je pense qu'il y a déjà pas mal de connaissance à acquérir comme ça, ajoutons les choses progressivement ;-)

    @Neoflash Okashi, c'est normal que tu comprennes pas tout, cherche un peu par toi-même, c'est pas en 15 minutes que tu vas comprendre, cherche des infos sur internet.

  15. #35
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Je cherche, je cherche...
    Sinon je tiens à préciser que le fait qu'afficherRecords ne fasse pas qu'afficher mais modifie aussi est volontaire, pour le bon fonctionnement de newscore. J'ai sciemment fait une passage par référence non constante.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  16. #36
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Dans ce cas le nom de fonction est très mal choisi.

    On s'attend à ce qu'une fonction nommée "afficher" affiche les données et soit constante si c'est une fonction membre, ou prenne une réf constante si c'est une fonction libre. En aucun cas à ce qu'elle modifie les données.

  17. #37
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Dans ce cas le nom de fonction est très mal choisi.

    On s'attend à ce qu'une fonction nommée "afficher" affiche les données et soit constante si c'est une fonction membre, ou prenne une réf constante si c'est une fonction libre. En aucun cas à ce qu'elle modifie les données.
    Je plussoie.

    La seule chose qu'on pourrait se permettre de modifier dans une telle fonction, c'est un cache d'une valeur dont le calcul est long. Et dans ce cas, la variable membre cache serait mutable (à ma connaissance, seules trois types de données ont mérite à être déclarés mutables: compteurs de références, caches et objets de synchronisation).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #38
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Si ce n'est que ça je la renomme en "enregRecords"

    EDIT : Pfiouh ! Voici enfin mon ultime version du Jeu du nombre ! Enfin peut-être pas ultime, mais au moins j'ai corrigé tout ce que vous m'aviez dit qui devait l'être !

    jeu.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef JEU_H_INCLUDED
    #define JEU_H_INCLUDED
     
    #include <vector>
     
    void regles();
    void enregRecords(std::vector<std::string> &champions,std::vector<int> &records);
    int jeu(int diff);
    void newscore(std::vector<std::string> &champions,std::vector<int> &records,int const& score);
     
    #endif // Bonjour, je suis un commentaire
    jeu.cpp :
    Code : 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
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <ctime>
    #include <vector>
    #include <cstdlib>
    using namespace std;
    #include"jeu.h"
     
    void regles()
    {
        cout<<"Un nombre compris entre 0 et 100 va etre genere aleatoirement. Vous devez le trouver."<<endl;
        cout<<"Moins il vous faut d'essais pour le trouver, mieux c'est."<<endl;
        cout<<"Ne vous inquietez pas, a chaque coup manque, il vous sera dit si le nombre a trouver"<<endl;
        cout<<"est plus grand ou plus petit que celui que vous avez donne."<<endl;
        cout<<"En mode Facile, le nombre n'est compris qu'entre 0 et 50, mais votre score ne sera pas enregistré."<<endl;
        cout<<"Notez que le jeu s'arrete quand vous atteignez 127 essais, mais c'est plus qu'il n'en faut."<<endl;
    }
     
    void enregRecords(std::vector<std::string> &champions,std::vector<int> &records)
    {
        ifstream Records("scoresJeuDuNombre.glan");
        cout<<endl<<endl;
        for (int i=0;i<(int)champions.size();i++)//cette boucle enregistre au fur et a mesure les champions...
        {
            getline(Records,champions[i]);
        }
        for (int i=0; i<(int)records.size(); i++)//...et celle-ci, leurs scores respectifs, en affichant tout le bazar
        {
            Records>>records[i];
            cout<<champions[i]<<" : "<<records[i]<<endl;
            //j'aurais bien tout mis dans la meme boucle en alternant champions et records, mais ça ne marche pas et j'ignore pourquoi...
        }
    }
     
    int jeu(int diff)
    {
        srand(time(0));
        int nbEssais(1);
        int nbSecret;
        if (diff==1)//si on est en facile...
        {
            nbSecret=rand()%51;//...on fait un nombre compris entre 0 et 50. le score n'est pas enregistre en facile.
        }
        else
        {
            nbSecret=rand()%101;//entre 0 et 100 en mode normal. le jeu est en mode normal s'il n'est pas en mode facile.
        }
        /* la seule difference entre le mode normal et le mode facile est l'intervelle a laquelle appartient le nombre a trouver, qui est entier */
        int nbDonne(110);
        cout<<endl<<"Quel est le nombre ? ";
        cin>>nbDonne;
        while(nbDonne!=nbSecret && nbEssais<127)//ici, on compare le nombre donne par le joueur et on compte son nomre d'essais. max d'essais : 127. pourquoi ? parce que.
        {
            if (nbDonne<nbSecret)
            {
                cout<<endl<<endl<<"Plus grand. ";
            }
            else
            {
                cout<<endl<<endl<<"Plus petit. ";
            }
            cin>>nbDonne;
            nbEssais++;
        }
        return nbEssais;
     
    }
     
    void newscore(std::vector<std::string> &champions,std::vector<int> &records,int const& score)
    {
        //cette fonction sert a verifier si le joueur a battu un des 5 records enregistres. si oui il sera enregistre a son tour
        int nouvellePlace(6);
        for(int i(0);i<5;i++){if(score<records[i]){nouvellePlace--;}}//on compte le nombre de records plus petits que le score, et en détermine la nouvelle place du joueur
        if(nouvellePlace<6)
            {
               for(int i(nouvellePlace);i!=0;i--)
                {
                    champions[i]=champions[i-1];
                    records[i]=records[i-1];
                }
                records[nouvellePlace-1]=score;//-1 car c'est un tableau, donc numerote de 0 a 4 et non de 1 a 5 !
            }
        else if (nouvellePlace>=6){cout<<"Vous n'avez battu aucun record...Desole !"<<endl;}//...tant pis !
     
            if(nouvellePlace<6)
            {
                if(nouvellePlace==1){cout<<"Felicitation, vous venez de decrocher la 1re place !"<<endl;}//GG !
                else{cout<<"Felicitation, vous venez de decrocher la "<<nouvellePlace<<"e place !"<<endl;}//bien aussi !
                cout<<"Sous quel nom enregistrer votre score ? (pas d'espaces !) ";//et enfin on lui demande son p'tit nom !
                cin>>champions[nouvellePlace-1];
            }
            ofstream flx_env("scoresJeuDuNombre.glan");//et on reecrit le fichier des scores avec tout ce bazar.
            for(int i(0);i<(int)champions.size();i++)
            {
                flx_env<<champions[i]<<endl;
            }
            for(int i(0);i<(int)records.size();i++)
            {
                flx_env<<records[i]<<endl;
            }
    }
    main.cpp :
    Code : 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
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <ctime>
    #include <vector>
    #include<cstdlib>
    using namespace std;
    #include "jeu.h"
     
     
    int main()
    {
        cout<<"Jeu du Nombre v2.0 par Glan (avec un accent circonflexe sur le a !)"<<endl<<endl;
     
        ifstream flx_rec("scoresJeuDuNombre.glan"); //oui je cree des fichiers dont l'extension est mon pseudo :D
        if(!flx_rec)
        {
            ofstream flx_env("scoresJeuDuNombre.glan");
            flx_env<<"XXXXX"<<endl<<"XXXXX"<<endl<<"XXXXX"<<endl<<"XXXXX"<<endl<<"XXXXX"<<endl<<127<<endl<<127<<endl<<127<<endl<<127<<endl<<127;
            flx_env.close(); //là, il verifiait s'il y avait deja un fichier de meilleurs scores, et si non, il vient de le creer
        }
        flx_rec.close();
        int score(127),diff(1);
        vector<int> records(5);
        vector<string> champions(5);
        string reponse;
        bool rejouer(true);
        cout<<"Menu"<<endl<<"1 : Regles"<<endl<<"2 : Meilleurs scores"<<endl<<"3 : Historique"<<endl<<"Autre reponse : jouer"<<endl;
        cin>>reponse;
        if(reponse=="1")
        {
            regles();
        }
        else if(reponse=="2")
        {
            enregRecords(champions,records);// se trouve dans jeu.cpp. Comme sont nom l'indique, affiche les records...
        }
        else if(reponse=="3")
        {
            cout<<"13/03/2014 : 1.0 : Creation du jeu"<<endl;
            cout<<"08/04/2014 : 2.0 : Oprimisation du code"<<endl;
        }
     
        while(rejouer) //rejouer est un bool, qui est modifie apres chaque partie selon que le joueur veuille rejouer ou non. vous l'aviez vu, rejouer vaut true au moment ou il est cree
        {
            if (diff==1 || diff==2)//c'est-a-dire si le joueur a demande a ne plus etre embeter avec ca, voir plus bas
                {
                    cout<<endl<<"Difficulte ?"<<endl<<"1 : Facile"<<endl<<"2 : Normal"<<endl;
                    cout<<"Autre reponse : Normal et ne plus demander"<<endl;//c'est de ça que je parlais. diff peut valoir n'importe quoi.
                    cin>>diff;
                }
            score=jeu(diff);//on lance la fonction jeu() qui est dans jeu.cpp et retourne de nb d'essais du joueur
            /* D'ici au prochain commentaire, le code sert à rentrer les records dans des variables pour les comparer au score
               qui vient d'etre fait. */
            cout<<"Records acutels :"<<endl;
            enregRecords(champions,records);
            cout<<"Vous avez fait "<<score<<" essais."<<endl;//et on affiche son score au joueur
            if(diff!=1)
            {
                newscore(champions,records,score); //cette fonction est dans jeu.cpp
            }
            else
            {
                cout<<"Comme vous etes en Facile, votre score ne compte pas. Jouez en normal pour"<<endl<<"enregistrer vos records !"<<endl;
            }
            /*yolo*/
            cout<<endl<<endl<<"Rejouer ? ";
            cin>>reponse;
            if(reponse=="oui" || reponse=="OUI" || reponse=="Oui")
            {
                rejouer=true;
            }
            else
            {
                rejouer=false;
            }//je vous avait parle de bool rejouer precedemment. non ?
        }
     
        cout<<endl<<endl<<"Jeu du Nombre v2.0 par Glan (avec un accent circonflexe sur le a !)"<<endl<<endl;
        return 0;
    }
    //j'aime mon travail.
    Au fait, j'ai compris comment fonctionnait count_if, mais finalement, je ne m'en suis pas servi (voir 3e ligne de la fonction newscore, dans jeu.cpp).
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  19. #39
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Hm, donc, qu'en est-il de cette nouvelle version ? Bien, pas bien ?
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  20. #40
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    C'est mieux.

    Encore quelques détails :
    Citation Envoyé par Neoflash Okashi Voir le message
    Au fait, j'ai compris comment fonctionnait count_if, mais finalement, je ne m'en suis pas servi (voir 3e ligne de la fonction newscore, dans jeu.cpp).
    Tu devrais utiliser des fonctions existantes pourtant (au moins pour prendre l'habitude), lower_bound + rotate font exactement ce que tu souhaites, pour "newscore"

    Pour "enregRecords", le nom est toujours mauvais : cette fonction lis les records dans un fichier et les affiches. Deux rôles donc 2 fonctions à créer.

    Regarde du coté des structures pour regrouper les noms et scores des joueurs.

    Et il y a aussi une erreur d'algo ! On ne peut pas perdre : il n'y à pas de différence entre ne pas trouver le nombre et le trouver au 127eme essai (Vui faut être mauvais pour mettre plus de 7 essais pour trouver un nombre entre 1 et 100, mais ça reste possible).

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. envoyer un mail avec mon programme
    Par shrek dans le forum C++Builder
    Réponses: 8
    Dernier message: 06/12/2006, 13h27
  2. [JAR] Lancer mon programme
    Par Nico66 dans le forum Général Java
    Réponses: 6
    Dernier message: 08/12/2004, 16h29
  3. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 15h59
  4. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 15h52
  5. Réponses: 11
    Dernier message: 17/03/2003, 11h56

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