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. #1
    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++] Évaluer mon programme
    Alors je vous préviens, je débute donc c'est un programme console...Un jeu tout bête : le jeu génère un nombre aléatoirement qu'il faut trouver. Je l'avais à l'origine créé en BASIC et finalement je l'ai porté sur C++...Le jeu enregistre également les 5 meilleurs scores sur un fichier qui est dans le même dossier que l'exe.

    Si vous pouviez me donner un note détaillée (une pour les fonctionnalités, une pour l'optimisation, etc) je vous en serais reconnaissant. Pour ma part je l'ai testé dans tous les sens et fait tester par des amis/famille et à priori il est très bien.
    J'en ferais une version fenêtre...quand je saurais le faire.
    J'ai l'impression d'avoir été trop zélé sur les commentaires, n'hésitez pas à me dire aussi ce qu'il en est (trop, pas assez, pas assez explicites...).

    Merci d'avance.
    Fichiers attachés Fichiers attachés
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Mets-nous directement le code.

  3. #3
    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
    Salut,

    Tu peux déjà aller lire ceci : http://www.developpez.net/forums/d14...-jeux-mystere/

    Les commentaires sont aussi valables pour ton code (en grande partie).

    En plus je dirais :

    1. Utilise les const référence pour le passage de paramètre.
    2. Généralise ton programme pour avoir un nombre quelconque de champion et record, tu auras moins de lignes de code.
    3. Même si tu as déjà des fonctions, fait-en plus ! Une pour chaque fonctionnalité.

  4. #4
    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
    1. Merci, en fait je ne connaissais pas encore les références constantes quand je l'avais fait
    2. "Généraliser mon programme" ? Je ne comprends pas. Et, je laisse volontairement 5 records, je ne veux pas en enregistrer plus je trouve ça inutile. Pour ce jeu précisément en tous cas.
    3. Tu veux dire n'avoir que des appels de fonctions de main() ?
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  5. #5
    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
    Tu ne dois pas avoir var1, var2, ..., varN car on a ce qu'on appelle des tableaux pour regrouper des données de même type. Utilise vector par exemple.

    Tes fonctions sont trop grandes, découpe mieux ton programme.

  6. #6
    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. Est-ce que je re-upload mon code quand j'aurais arrangé ça ?
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  7. #7
    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
    Non, tu fais comme oodini a dit, utilise la balise [ code] [/ code]

  8. #8
    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
    Même pour quelque chose d'aussi long ? D'accord.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  9. #9
    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
    Bon, alors j'ai, comme qui dirait, un petit problème. J'ai voulu faire comme tu m'as dit et utiliser des tableaux, ce qui est effectivement bien plus pratique puisque ça permet de faire des boucles. Mais en voulant les mettre en paramètre (je sais que c'est possible) j'obtient ce log d'erreurs :

    Voici le code :
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    #include <iostream>
    #include <string>
    #include <fstream>
    #include<ctime>
    #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 afficherRecords(string champion[],int records[])
    {
        ifstream Records("scoresJeuDuNombre.glan");
        cout<<endl<<endl;
        for (int ctr=0;ctr<=4;ctr++)//cette boucle enregistre et affiche au fur et a mesure les champions et leurs scores respectifs
        {
            getline(Records,champion[ctr]);
            Records>>records[ctr];
            cout<<champion[ctr]<<" : "<<records[ctr]<<endl;
        }
    }
     
    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(string champions[],int records[],int 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(0);
        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;
        }
        else
        {
            cout<<"Vous n'avez battu aucun record...Desole !"<<endl;//...tant pis !
        }
     
        if(nouvellePlace!=0)
        {
            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 !
            switch(nouvellePlace)//et en fonction de sa place, enregistree precedemment, on remplace le nom de l'ancien champion par celui du joueur.
            {
            case 1:
                cin>>champions[0];
                break;
            case 2:
                cin>>champions[1];
                break;
            case 3:
                cin>>champions[2];
                break;
            case 4:
                cin>>champions[3];
                break;
            case 5:
                cin>>champions[4];
                break;
            }
            ofstream flx_env("scoresJeuDuNombre.glan");//et on reecrit le fichier des scores avec tout ce bazar.
            for(int ctr(0);ctr<=4;ctr++)
            {
                flx_env<<champions[ctr]<<endl<<records[ctr]<<endl;
            }
     
            flx_env.close();//j'aime fermer mes flux manuellement. c'est bon pour ma tranquillite d'esprit.
        }
    }
    jeu.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef JEU_H_INCLUDED
    #define JEU_H_INCLUDED
     
    void regles();
    void afficherRecords(string champion[],int records[]);
    int jeu(int diff);
    void newscore(string champions[],int records[],int score);
     
    #endif // Bonjour, je suis un commentaire
    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
    #include <iostream>
    #include <string>
    #include <fstream>
    #include<ctime>
    #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);
        int records[5];
        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")
        {
            afficherRecords(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. */
     
            afficherRecords(champions,records);
            cout<<endl<<endl<<endl<<"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<<"Jeu du Nombre v2.0 par Glan (avec un accent circonflexe sur le a !)"<<endl<<endl;
        return 0;
    }
    //j'aime mon travail.
    Je ne trouve pas le problème. Merci d'avance.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  10. #10
    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
    D'abord ta question, il faut que tu enlèves le "&" devant score, car le & prend l'adresse d'une variable ce qui donne un pointeur, or ta fonction prend un int et non pas une adresse.

    Ensuite, au lieu d'utiliser les tableaux "à la C", tu auras plus facile d'utiliser les vecteurs, petit exemple :

    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
    #include <vector>
     
    // Le & permet de passer l'argument par référence (au lieu de le copier entièrement)
    // Le const nous dit que la fonction ne modifie pas l'argument, sans le const si on modifie text, alors il sera modifier dans le main aussi...
    void print(const std::vector<std::string> &text)
    {
      for(int i=0; i < (int)text.size(); ++i)
        std::cout << text[i] << std::endl;
     
      // Ou en C++11 (-std=c++11 dans gcc)
      for(const std::string& e : text)
        std::cout << e << std::endl;
    }
     
    int main()
    {
      std::vector<int> i;
      i.push_back(5);
      i.push_back(9);
      // i est un tableau d'entier contenant {5,9}.
      // En c++11 tu peux aussi l'initialiser comme ça:
      std::vector<int> i = {5,9};
     
      std::string x = "test2";
      std::vector<std::string> s;
      s.push_back("test");
      s.push_back(x);
      print(s);
    }
    (Code non compilé ni testé).
    L'exemple te montre comment parcourir une boucle et afficher les résultats. Toutes les méthodes de la classe std::vector sont disponible dans la ref (http://en.cppreference.com/w/cpp/container/vector).

  11. #11
    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 ne peux pas passer par référence avec un tableau ? Parce que je voudrais justement modifier le tableau via la fonction, c'est important pour la fonction newscore, je n'ai pas envie de réutiliser afficherRecords...
    Du reste bien sûr que je pourrais utiliser des tableaux dynamiques mais je n'en ai pas l'utilité...
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  12. #12
    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
    T'en a pas besoin car ton programme est mal conçu, tu dois généraliser à N champions (car il y a encore plein de redondance que tu élimineras par généralisation) — cf. premier commentaire.

  13. #13
    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
    Tu veux vraiment que je laisse un nombre infini de champions hein ? Mais à la longue, quand je vais afficher les champions...Ça va juste pas être possible, il faut une limite, et cette limite restera 5 ! Je veux bien utiliser des références constantes et des tableaux dynamiques vu que ça a l'air important pour la suite (je rappelle que je suis encore débutant, là la dernière chose que j'ai apprise est de me servir des classes, donc la base de la base quoi) mais je ne vois vraiment pas pourquoi je ne pourrais pas laisser un nombre fini de records...
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  14. #14
    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
    Vu qu'un ordinateur a une mémoire limitée, l'infini ça n'existe pas.

    En plus ici, tu as plusieurs champions, je suppose que c'est des joueurs, or ton jeu peut se jouer à 2, 3, ou n joueurs non ? Si ton jeu ne peut se jouer que à 4 joueurs et que sans ça c'est impossible alors on peut discuter d'une solution avec des tableaux fixes mais sinon non.

  15. #15
    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
    Vu qu'un ordinateur a une mémoire limitée, l'infini ça n'existe pas.

    En plus ici, tu as plusieurs champions, je suppose que c'est des joueurs, or ton jeu peut se jouer à 2, 3, ou n joueurs non ? Si ton jeu ne peut se jouer que à 4 joueurs et que sans ça c'est impossible alors on peut discuter d'une solution avec des tableaux fixes mais sinon non.
    Cet un jeu 1 joueur (pas de possibilité de jouer à 2 ou plus).
    Les 5 champions, c'est juste les 5 meilleurs scores effectués (nom du joueur + score). Plusieurs personnes peuvent jouer, mais 1 à la fois, pas plus.

  16. #16
    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
    Ok, merci, j'aurais du lire un peu plus en détail Quoi qu'il en soit mon commentaire tiens toujours, tu ne devrais pas fixer de limite dans la taille de ton tableau, ne fusse que pour que tes algorithmes soit généralisés et plus clair...

  17. #17
    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
    Bien ! Voici le nouveau code ! Merci pour l'idée des tableaux, ça m'a vraiment permis d'optimiser mon programme : l'exe final ne prend plus 1Mo mais 487ko...bref il est deux fois moins gros ! Pour les performances, j'en sais rien, sur un programme aussi petit on ne peut sentir aucune différence...Mais j'imagine que c'est mieux aussi ! Voici le nouveau code :

    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 afficherRecords(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 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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    #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 afficherRecords(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 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(0);
        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;
        }
        else
        {
            cout<<"Vous n'avez battu aucun record...Desole !"<<endl;//...tant pis !
        }
     
        if(nouvellePlace!=0)
        {
            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 !
            switch(nouvellePlace)//et en fonction de sa place, enregistree precedemment, on remplace le nom de l'ancien champion par celui du joueur.
            {
            case 1:
                cin>>champions[0];
                break;
            case 2:
                cin>>champions[1];
                break;
            case 3:
                cin>>champions[2];
                break;
            case 4:
                cin>>champions[3];
                break;
            case 5:
                cin>>champions[4];
                break;
            }
            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")
        {
            afficherRecords(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. */
     
            afficherRecords(champions,records);
            cout<<endl<<endl<<endl<<"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.
    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.

    Merci d'avance ! Oh, et merci Idrasille...
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    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 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    quitte à trimballer champions et records à chaque fois, pourquoi tu fais pas une structure ?

    using namespace std;
    avant l'include de "jeu.h" vaut mieux éviter
    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.

  19. #19
    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 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...
    Pour le using namespace std; je dois le mettre après les inclusions de headers aussi ? Qu'est-ce que ça change ?
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    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 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Quel est le rapport avec les tableaux ?
    Demain tu rajoutes une date au champion, bonne chance pour modifier toutes les fonctions pour maintenant passer 3 tableaux en paramètres et non plus 2, puis après-demain 4, puis revenir à 2, ...
    Tu considères mal, btw les structures en C++ sont quasi identiques au C. Je parle pas de faire de l'objet mais de faire un agglomérat de données logiques : exactement ce que tu as
    Quand tu compiles un fichier, les include sont remplacés par leur contenu. Un using namespace mal placé pourrit juste tout ce qui suit dans ton unité de compilation

    ta fonction newScore devrait clairement utiliser les méthodes de vector : push_back, insert etc
    de même, je trouverais bien plus logique de limiter les 5 premiers enregistrements.. à l'enregistrement
    je milite pour la const-correctness (afficherRecords)
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 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, 12h27
  2. [JAR] Lancer mon programme
    Par Nico66 dans le forum Général Java
    Réponses: 6
    Dernier message: 08/12/2004, 15h29
  3. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59
  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, 14h52
  5. Réponses: 11
    Dernier message: 17/03/2003, 10h56

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