Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon "jeu" David VS Goliath

Vos avis sur le code

Anonyme
    19 septembre 2007 à 16:37:48

    span> Personnage::afficherEtat()
    {
            cout << m_vie << "/ 10 d'energie." << endl;
    }


    Voila, le jeu marche très bien, je voulais juste avoir vos avis sur ce code, je compte faire une version plus améliorée (avec mana, différentes armes, un mode 2 joueurs,des combats plus longs...etc...)

    Voila, tout est dit, Merci d'avance ;)



    de, mais plus forte.
    Vous avez 1/2 chance de toucher Goliath, et vous le ferez perdre 2/10 d'energie.


    L'attaque puissante est tres lente mais tres puissante
    Vous avez 1/3 chance de toucher Goliath, et vous le ferez perdre 3/10 d'energie.



    En plus des attaques, vous pouvez regenerez votre energie en buvant une potion.
    Il y a 1/2 chance que la potion agisse et vous redonne 2/10 d'energie.


    Soyez le meilleur, bonne chance !
    Voici la source :

    Main.cpp :

    1. #include <iostream>
    2. #include <string>
    3. #include<time.h>
    4. #include "Personnage.h" // Ne pas oublier
    5. using namespace std;
    6. int main()
    7. {
    8.     /*Pour commencer, declaration des variables, ,
    9.       ia c'est l'adverssaire qui choisit son attaque (nombre au hasard)
    10.       choixAttaque c'est le joueur qui choisit son attaque
    11.     chance determine si une attaque est reussie ou non (nombre au hasard) */
    12.     int chance = 0, ia = 0, choixMenu = 0, choixAttaque = 0, choixReco = 0;
    13.     bool recommencer = true;
    14.     srand(time(NULL));
    15.     // Création des personnages
    16.     Personnage david, goliath;
    17.     //Presentation
    18.     cout << "              ***************************************************" << endl;
    19.     cout << "              ***************************************************" << endl;
    20.     cout << "              *** Bienvenue dans le combat David VS Goliath ! ***" << endl;
    21.     cout << "              ***************************************************" << endl;
    22.     cout << "              ***************************************************" << endl << endl;
    23.     do //Boucle de recommencer le jeu
    24.     {
    25.         do // Boucle si Aide a été choisi (on revient au menu
    26.         {
    27.             do // Boucle en cas d'erreur
    28.             {
    29.                 cout << endl << endl << "1.Lancer le jeu" << endl << "2.Aide" << endl << "3.Quitter" << endl << endl << "Votre choix : ";
    30.                 cin >> choixMenu;
    31.                 if(choixMenu < 1 || choixMenu > 3)
    32.                 {
    33.                     cout << endl << "Choix incorrect, vous avez le choix entre : ";
    34.                 }
    35.             }while(choixMenu < 1 || choixMenu > 3 );
    36.             if (choixMenu == 2)
    37.             {
    38.                 cout << endl << endl << endl << endl << "Les regles sont simples, vous etes David et votre but est de tuer Goliath." << endl;
    39.                 cout << "Pour cela, vous disposez de 3 attaques :" << endl << endl;
    40.                 cout << endl << "1.Attaque simple" << endl << "2.Attaque double" << endl << "3.Attaque puissante" << endl;
    41.                 cout << endl << "L'attaque simple est tres rapide, mais aussi tres faible." <<endl << "Vous avez 2/3 chance de toucher Goliath, et vous le ferez perdre 1/10 d'energie." << endl;
    42.                 cout << endl << "L'attaque double est moins rapide, mais plus forte." << endl << "Vous avez 1/2 chance de toucher Goliath, et vous le ferez perdre 2/10 d'energie." << endl;
    43.                 cout << endl << "L'attaque puissante est tres lente mais tres puissante" << endl << "Vous avez 1/3 chance de toucher Goliath, et vous le ferez perdre 3/10 d'energie." << endl;
    44.                 cout << endl << endl << "En plus des attaques, vous pouvez regenerez votre energie en buvant une potion." << endl << "Il y a 1/2 chance que la potion agisse et vous redonne 2/10 d'energie." << endl;
    45.                 cout << endl << endl << "Soyez le meilleur, bonne chance !" << endl << endl;
    46.             }
    47.         }while(choixMenu == 2);
    48.         if(choixMenu == 3)
    49.         {
    50.             cout << endl << "Au revoir !" << endl;
    51.             recommencer = false;
    52.         }
    53.         else if(choixMenu == 1)
    54.         {
    55.             while(david.estVivant() == true && goliath.estVivant() == true)
    56.             {
    57.                 cout << endl << endl << "                             *** COMBAT ! ***" << endl;
    58.                 do
    59.                 {
    60.                     cout << endl << "1.Attaque simple" << endl << "2.Attaque double" << endl << "3.Attaque puissante" << endl << "4.Boire Potion" << endl << endl << "Votre choix : ";
    61.                     cin >> choixAttaque;
    62.                     if(choixAttaque < 1 || choixAttaque > 3)
    63.                     {
    64.                         cout << endl << "Choix incorrect, vous avez le choix entre : " << endl;
    65.                     }
    66.                 }while(choixAttaque < 1 || choixAttaque > 4);
    67.                 cout << endl;
    68.                 if(choixAttaque == 1 || choixAttaque == 3)
    69.                 {
    70.                     chance = (rand() % (3 - 1 + 1)) + 1;
    71.                     if(choixAttaque == 1)
    72.                     {
    73.                         if(chance == 1 || chance == 2)
    74.                         {
    75.                             david.attaquer(goliath, 1);
    76.                             cout << "David utilise Attaque simple sur Goliath" << endl;
    77.                         }
    78.                         else if(chance == 3)
    79.                         {
    80.                             cout << "Attaque simple echoue" << endl;
    81.                         }
    82.                     }
    83.                     if(choixAttaque == 3)
    84.                     {
    85.                         if(chance == 1)
    86.                         {
    87.                             david.attaquer(goliath, 3);
    88.                             cout << "David utilise Attaque puissante sur Goliath" << endl;
    89.                         }
    90.                         else if(chance == 2 || chance == 3)
    91.                         {
    92.                             cout << "Attaque puissante echoue" << endl;
    93.                         }
    94.                     }
    95.                 }
    96.                 else if(choixAttaque == 2 || choixAttaque == 4)
    97.                 {
    98.                     chance = (rand() % (2 - 1 + 1)) + 1;
    99.                     if(choixAttaque == 2)
    100.                     {
    101.                         if(chance == 1)
    102.                         {
    103.                             david.attaquer(goliath, 2);
    104.                             cout << "David utilise Attaque double sur Goliath" << endl;
    105.                         }
    106.                         else if(chance == 2)
    107.                         {
    108.                             cout << "Attaque double echoue" << endl;
    109.                         }
    110.                     }
    111.                     else if(choixAttaque == 4)
    112.                     {
    113.                         if(chance == 1)
    114.                         {
    115.                             david.boirePotionDeVie(2);
    116.                             cout << "David boit une potion et regagne 2/10 d'energie." << endl;
    117.                         }
    118.                         else if(chance == 2)
    119.                         {
    120.                             cout << "Potion inneficace" << endl;
    121.                         }
    122.                     }
    123.                 }
    124.                 ia = (rand() % (4 - 1 + 1)) + 1;
    125.                 if(ia == 1 || ia == 3)
    126.                 {
    127.                     chance = (rand() % (3 - 1 + 1)) + 1;
    128.                     if(ia == 1)
    129.                     {
    130.                         if(chance == 1 || chance == 2)
    131.                         {
    132.                             goliath.attaquer(david, 1);
    133.                             cout << "Goliath utilise Attaque simple sur David" << endl;
    134.                         }
    135.                         else if(chance == 3)
    136.                         {
    137.                             cout << "Attaque simple echoue" << endl;
    138.                         }
    139.                     }
    140.                     if(ia == 3)
    141.                     {
    142.                         if(chance == 1)
    143.                         {
    144.                             goliath.attaquer(david, 3);
    145.                             cout << "Goliath utilise Attaque puissante sur David" << endl;
    146.                         }
    147.                         else if(chance == 2 || chance == 3)
    148.                         {
    149.                             cout << "Attaque puissante echoue" << endl;
    150.                         }
    151.                     }
    152.                 }
    153.                 else if(ia == 2 || ia == 4)
    154.                 {
    155.                     chance = (rand() % (2 - 1 + 1)) + 1;
    156.                     if(ia == 2)
    157.                     {
    158.                         if(chance == 1)
    159.                         {
    160.                             goliath.attaquer(david, 2);
    161.                             cout << "Goliath utilise Attaque double sur David" << endl;
    162.                         }
    163.                         else if(chance == 2)
    164.                         {
    165.                             cout << "Attaque double echoue" << endl;
    166.                         }
    167.                     }
    168.                     else if(ia == 4)
    169.                     {
    170.                         if(chance == 1)
    171.                         {
    172.                             goliath.boirePotionDeVie(2);
    173.                             cout << "Goliath boit une potion et regagne 2/10 d'energie." << endl;
    174.                         }
    175.                         else if(chance == 2)
    176.                         {
    177.                             cout << "Potion inneficace" << endl;
    178.                         }
    179.                     }
    180.                 }
    181.                 cout << endl << "Vie de David : ";
    182.                 david.afficherEtat();
    183.                 cout << "Vie de Goliath : ";
    184.                 goliath.afficherEtat();
    185.                 cout << endl;
    186.                 david.estVivant();
    187.                 goliath.estVivant();
    188.             }
    189.             if(david.estVivant() == false && goliath.estVivant() == false)
    190.             {
    191.                 cout << endl << "Match nul !" << endl;
    192.             }
    193.             else if(goliath.estVivant() == false && david.estVivant() == true)
    194.             {
    195.                 cout << endl << "Vous avez gagne !" << endl;
    196.             }
    197.             else if(david.estVivant() == false && goliath.estVivant() == true)
    198.             {
    199.                 cout << endl <<  "Vous avez perdu !" << endl;
    200.             }
    201.             do
    202.             {
    203.                 cout << "Voulez vous refaire une partie ?" << endl << endl << "1.Oui" << endl << "2.Non" << endl << endl << "Votre choix : ";
    204.                 cin >> choixReco;
    205.                 if(choixReco < 1 || choixReco > 2)
    206.                 {
    207.                     cout << endl << "Choix incorrect, vous avez le choix entre : " << endl;
    208.                 }
    209.             }while(choixReco < 1 || choixReco > 2);
    210.             if(choixReco == 1)
    211.             {
    212.                 david.boirePotionDeVie(10);
    213.                 goliath.boirePotionDeVie(10);
    214.                 david.estVivant();
    215.                 goliath.estVivant();
    216.                 recommencer = true;
    217.             }
    218.             else
    219.             {
    220.                 recommencer = false;
    221.                 cout << endl << "Au revoir !" << endl;
    222.             }
    223.         }
    224.         else
    225.         {
    226.             cout << "Une erreur s'est produite, j'ai le regret de devoir fermer le programme." << endl;
    227.             recommencer = false;
    228.         }
    229.     }while(recommencer);
    230.     return 0;
    231. }



    Personnage.h

    1. #ifndef DEF_PERSONNAGE
    2. #define DEF_PERSONNAGE
    3. class Personnage
    4. {
    5.     public:
    6.     Personnage(); // Constructeur
    7.     void recevoirDegats(int nbDegats);
    8.     void attaquer(Personnage &cible, int nbDegats);
    9.     void boirePotionDeVie(int quantitePotion);
    10.     bool estVivant();
    11.     void afficherEtat();
    12.     private:
    13.     int m_vie;
    14. };
    15. #endif


    Personnage.cpp

    1. #include <iostream>
    2. #include <string>
    3. #include "Personnage.h"
    4. using namespace std;
    5. Personnage::Personnage() : m_vie(10)
    6. {
    7.     // Rien à mettre dans le corps du constructeur, tout a déjà été fait !
    8. }
    9. void Personnage::recevoirDegats(int nbDegats)
    10. {
    11.     m_vie -= nbDegats; // On enlève le nombre de dégâts reçus à la vie du personnage
    12.     if (m_vie < 0) // Pour éviter d'avoir une vie négative
    13.     {
    14.         m_vie = 0; // On met la vie à 0 (ça veut dire mort)
    15.     }
    16. }
    17. void Personnage::attaquer(Personnage &cible, int nbDegats)
    18. {
    19.     cible.recevoirDegats(nbDegats); // On inflige à la cible les dégâts que causent notre arme
    20. }
    21. void Personnage::boirePotionDeVie(int quantitePotion)
    22. {
    23.     m_vie += quantitePotion;
    24.     if (m_vie > 10) // Interdiction de dépasser 100 de vie
    25.     {
    26.         m_vie = 10;
    27.     }
    28. }
    29. bool Personnage::estVivant()
    30. {
    31.     if (m_vie > 0) // Plus de 0 de vie ?
    32.     {
    33.         return true; // VRAI, il est vivant !
    34.     }
    35.     else
    36.     {
    37.         return false; // FAUX, il n'est plus vivant !
    38.     }
    39. }
    40. void
    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2007 à 17:01:06

      Salut.

      Si je puis me permettre, je ne vois pas trop le coté "orienté objet" de ton code...
      Avec un main de 250 lignes, tu doit avoir un problème de conception.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        19 septembre 2007 à 17:05:25

        Je viens de survoler le code en diagonale. Il y a quelques trucs, parmis lesquels :
        - mettre un enchaînement de endl est très laid. Ça n'est pas juste un retour à la ligne, endl flush le stdout ;
        - commenter c'est bien. Commenter du code trivial, c'est carrément débile : ton code va être susceptible d'évoluer, le commentaire en lui-même deviendra obsolète, il rend plus difficile la lecture d'un code simple, bref c'est à éviter complètement. Mieux vaut avoir des noms de fonctions corrects et compréhensibles, avec du commentaire sur les parties difficiles plutôt que l'inverse.
        - certaines fonctions sont relativement lourdes et peuvent être réécrites selon des règles plus simples :
        1. bool Personnage::estVivant()
        2. {
        3.     if (m_vie > 0) // Plus de 0 de vie ?
        4.     {
        5.         return true; // VRAI, il est vivant !
        6.     }
        7.     else
        8.     {
        9.         return false; // FAUX, il n'est plus vivant !
        10.     }
        11. }

        C'est moche. Ça peut être réécrit comme ceci :
        1. bool Personnage::estVivant(void)
        2. {
        3.   return (m_vie > 0);
        4. }

        C'est plus court, c'est plus lisible.

        Bon, et comme je suis pas du tout un expert C++ :-° je te souhaite bonne chance ! :)
        • Partager sur Facebook
        • Partager sur Twitter
          19 septembre 2007 à 17:19:07

          Salut

          Tu aurais pu au lieu de tout mettre dans le main créer divers fonctions : une fonction pour l'aide, une autre pour le choix de l'attaque, une autre pour le test de réussite... séparées dans plusieurs fichiers. Le main ne devrait contenir que l'"introduction" et la "conclusion" de ton programme, le corps du programme étant placé dans d'autres fonctions. On voit mieux ainsi comment elles s'enchaînent et quelle est la trame du code. Le main ne constitue qu'un "plan". (j'ai l'impression de parler comme un prof de français tout à coup :D )

          Autrement, bien joué. Ca a l'air très intéressant. :)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            19 septembre 2007 à 17:47:58

            Salut à tous.

            Déjà, merci de vos réponses.

            Kevin > Merci, je savais déjà que mon code avait un proble niveau POO, c'est la première version du code, je changerais ça en améliorant le code.

            Metzgermeister > Merci pour tes remarques, mais je ne connais pas d'autre moyen de sauter une ligne, y en a un ?

            Lutinbleu > Merci, mais c'est pas mélanger 2 styles de programmation ça ? On peut mélanger POO et Prog' impérative ?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              19 septembre 2007 à 18:14:23

              Déjà, oui : on peut mélanger différents paradigmes (par exemple, en Caml on peut mélanger le fonctionnel et l'impératif, et en OCaml on peut mélanger la POO, le fonctionnel et l'impératif).

              Ensuite, le caractère « \n » a toujours une valeur de saut de ligne en C++. ;)
              • Partager sur Facebook
              • Partager sur Twitter
                19 septembre 2007 à 18:16:43

                Hello,

                Ton code fonctionne c'est bien ! Par contre on peut faire beaucoup mieux niveau programmation.

                Essaye de ne pas faire des fonction (main y compris) de plus de 1 écran de long.
                Évite les successions de endl, préfère les \n .
                Mélanger POO et programmation impérative est la marque d'une mauvaise conception du jeu en général.
                Par exemple l'affichage des textes d'action n'ont rien à faire dans le main mais plutot dans la classe.
                Ne jamais faire de copier-coller de quelque partie de code que ce soit.
                • Partager sur Facebook
                • Partager sur Twitter
                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                Anonyme
                  19 septembre 2007 à 18:18:30

                  Puisque le copier/coller pur marque en général une factorisation de code oubliée. ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    19 septembre 2007 à 19:13:16

                    Merci pour vos réponses


                    Nanoc > Je me disais bien que le fait de mélanger posait problème, je vais plutôt me consacrer à la POO (sinon pourquoi faire du c++).

                    Metzgermeister > Je pense mettre tout mon code en méthode découpé minutieusement, le main ne contiendra que des appels de méthodes. Ainsi au moins, mon code sera aussi automatiquement factorisé.

                    Je donnerais des nouvelles quand ça sera fait. ;)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Mon "jeu" David VS Goliath

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown