Partage
  • Partager sur Facebook
  • Partager sur Twitter

une amelioration bisar

comment un tp peut etre amusant

    2 septembre 2007 à 18:47:39

    Bonjour a tous et desole de vous ennuyer.
    Apres avoir lu les cours de m@teo, je suis tombe sous le charme de la POO, voulant tester si j'avais bien compris, je voulu ameliorer le petit jeu de combat (notament en y integrant une IA de mon crue). Cependant une erreur que je ne comprend pas ce produit lors du test de mon code : Le code s'arrete de lui meme apres la selection de son arme. Je vous montre le fautif:


    voici le main
    1. #include <iostream>
    2. #include <string>
    3. #include "Personnage.h" // Ne pas oublier
    4. using namespace std;
    5. int main()
    6. {
    7.     //creation du nom du joueur
    8.     string nom;
    9.     nom.erase();
    10.     while(nom.size() == 0){
    11.     cout << "Entrer le nom de votre heros: " ;
    12.     cin >> nom;
    13.     cout <<endl;
    14.     }
    15.     //choix de l'arme du joueur
    16.     string choix;
    17.     choix.erase();
    18.     int degat;
    19.     string arme;
    20.     arme.erase();
    21.     cout << nom << " choisis ton arme:" << endl << "1: epee rouillee" << endl << "2: cimeterre"<<endl;
    22.     cin >> choix;
    23.     while(choix != "1" || choix != "2"){
    24.     if(choix == "1"){
    25.         arme = "epee rouillee";
    26.         degat = 10;}
    27.     else if(choix == "2"){
    28.         arme = "cimeterre";
    29.         degat = 20;}
    30.     else{
    31.         cout << "choisi ton arme: ";
    32.         cin >> choix;}
    33.     }
    34. cout << arme << endl;
    35.     Personnage joueur(nom, arme, degat),ordi;
    36.     cout << endl << endl;
    37.     while (joueur.estVivant() == true || ordi.estVivant() == true){
    38.         string choix2;
    39.         choix2.erase();
    40.         cout << "Que souhaite tu faire? " <<endl;
    41.         cout << "1: attaquer" << endl << "2: boire une potion" << endl << "3: Changer d'arme" << endl;
    42.         cin >> choix2;
    43.         while ( choix2 != "1" || choix2 != "2" || choix2 != "3"){
    44.         if(choix2 == "1"){
    45.             joueur.attaquer(ordi);}
    46.         else if (choix2 == "2"){
    47.             joueur.boirePotionDeVie(20);}
    48.         else if (choix2 == "3"){
    49.     string choix;
    50.     choix.erase();
    51.     int degat;
    52.     string arme;
    53.     arme.erase();
    54.     cout << "Choisis ta nouvelle arme:" << endl << "1: epee rouillee" << endl << "2: cimeterre"<<endl;
    55.     cin >> choix;
    56.     while(choix != "1" || choix != "2"){
    57.     if(choix == "1"){
    58.         arme = "epee rouillee";
    59.         degat = 10;}
    60.     else if(choix == "2"){
    61.         arme = "cimeterre";
    62.         degat = 20;}
    63.     else{
    64.         cout << "choisi ton arme: ";
    65.         cin >> choix;}
    66.     }
    67.     joueur.changerArme(arme, degat);
    68.     }
    69.         else{
    70.             cout << "Fais un choix." << endl;
    71.             cin >> choix2;}
    72.         }
    73.     }
    74.     return 0;
    75.     system("PAUSE");
    76. }


    et voici personnage.cpp
    1. #include <iostream>
    2. #include "Personnage.h"
    3. using namespace std;
    4. void Personnage::recevoirDegats(int nbDegats)
    5. {
    6.     m_vie -= nbDegats; // On enlève le nombre de dégâts reçus à la vie du personnage
    7.     cout << "Il te reste: " << m_vie << " points de vie." << endl;
    8.     if (m_vie < 0) // Pour éviter d'avoir une vie négative
    9.     {
    10.         m_vie = 0; // On met la vie à 0 (ça veut dire mort)
    11.     }
    12. }
    13. void Personnage::attaquer(Personnage &cible)
    14. {
    15.     cible.recevoirDegats(m_arme.getDegats());
    16.     cout << "Il reste: " << cible.vie() << " points de vie a l'ordi." << endl;
    17. }
    18. void Personnage::boirePotionDeVie(int quantitePotion)
    19. {
    20.     m_vie += quantitePotion;
    21.     m_potion --;
    22.     cout << "Tu bois une potion et tu retrouve 20 points de vie" << endl;
    23.     cout << "Il te reste: " << m_potion << " potion(s)." << endl;
    24.     if (m_vie > 100) // Interdiction de dépasser 100 de vie
    25.     {
    26.         m_vie = 100;
    27.     }
    28. }
    29. void Personnage::changerArme(string nvllarme, int nvdegat)
    30. {
    31.     m_arme.changer(nvllarme, nvdegat);
    32. }
    33. bool Personnage::estVivant()
    34. {
    35.     if (m_vie > 0) // Plus de 0 de vie ?
    36.     {
    37.         return true; // VRAI, il est vivant !
    38.     }
    39.     else
    40.     {
    41.         return false; // FAUX, il n'est plus vivant !
    42.     }
    43. }
    44. Personnage::Personnage() : m_vie(100), m_mana(100)
    45. {
    46. }
    47. Personnage::Personnage(string nom, string nomArme, int degatsArme) : m_vie(100), m_mana(100), m_arme(nomArme, degatsArme), m_nom(nom), m_potion(20)
    48. {
    49. }
    50. void Personnage::afficherEtat()
    51. {
    52.     cout << "Nom : " << m_nom << endl;
    53.     cout << "Vie : " << m_vie << endl;
    54.     cout << "Mana : " << m_mana << endl;
    55.     m_arme.afficher();
    56. }
    57. int Personnage::vie()
    58. {
    59.     return m_vie;
    60. }


    j'aimerais vraiment savoir où se situe le probleme (surtout que j'ai juste demande un string a la place d'un nombre dans le nom de l'arme.)
    Par avance merci
    • Partager sur Facebook
    • Partager sur Twitter
      3 septembre 2007 à 13:03:36

      Bonjour, je n'est pas trouvé la cause de ton problème mais j'ai plusieurs remarques à faire:
      • un objet de classe string est automatiquement initialisé par le destructeur constructeur, il pas necessaire d'appeller la méthode 'erase()'
      • pourquoi ne définis tu pas une autre classe pour gérer tes armes ?
      Voilà. J'aimerai aussi voir le prototype de la classe Personnage si ça te gêne pas.
      • Partager sur Facebook
      • Partager sur Twitter
        3 septembre 2007 à 17:33:40

        Coucou et merci pour le temps que tu prend pour m'aider.

        Voici le header de personnage
        1. #ifndef DEF_PERSONNAGE
        2. #define DEF_PERSONNAGE
        3. #include <string>
        4. #include "Arme.h" // Ne PAS oublier d'inclure Arme.h pour en avoir la définition
        5. class Personnage
        6. {
        7.     public:
        8.     Personnage();
        9.     Personnage(std::string nom, std::string nomArme, int degatsArme);
        10.     void recevoirDegats(int nbDegats);
        11.     void attaquer(Personnage &cible);
        12.     void boirePotionDeVie(int quantitePotion);
        13.     void changerArme(std::string arme, int degat);
        14.     bool estVivant();
        15.     void afficherEtat();
        16.     void nom(std::string nom);
        17.     int vie();
        18.     std::string choixarme();
        19.     private:
        20.     int m_vie;
        21.     int m_mana;
        22.     Arme m_arme; // Notre arme est "contenue" dans le Personnage
        23.     std::string m_nom;
        24.     int m_potion;
        25. };
        26. #endif


        J'ai aussi une autre classe pour les armes regarde:

        arme .cpp
        1. #include <iostream>
        2. #include <string>
        3. #include "Arme.h"
        4. using namespace std;
        5. Arme::Arme() : m_nom("Epée rouillée"), m_degats(10)
        6. {
        7. }
        8. Arme::Arme(string nom, int degats) : m_nom(nom), m_degats(degats)
        9. {
        10. }
        11. void Arme::changer(string nom, int degats)
        12. {
        13.     m_nom = nom;
        14.     m_degats = degats;
        15.     cout << "Votre nouvelle arme est: " << m_nom << endl;
        16. }
        17. void Arme::afficher()
        18. {
        19.     cout << "Arme : " << m_nom << " (Degats : " << m_degats << ")" << endl;
        20. }
        21. int Arme::getDegats() const
        22. {
        23.     return m_degats;
        24. }


        et son header
        1. #ifndef DEF_ARME
        2. #define DEF_ARME
        3. #include <string>
        4. class Arme
        5. {
        6.     public:
        7.     Arme();
        8.     Arme(std::string nom, int degats);
        9.     void changer(std::string nom, int degats);
        10.     void afficher();
        11.     int Arme::getDegats() const;
        12.     private:
        13.     std::string m_nom;
        14.     int m_degats;
        15. };
        16. #endif


        Voila, j'enleve les erase de suite aussi.
        Par avance merci.
        • Partager sur Facebook
        • Partager sur Twitter
          3 septembre 2007 à 19:11:10

          J'ai trouvé! En compilant ton programme j'ai rencontré des boucles infinies.
          Commence par remplacer dans le premier while du main le '||' par '&&'.
          je cherche encore pour le deuxième while.
          • Partager sur Facebook
          • Partager sur Twitter
            3 septembre 2007 à 19:53:48

            Remplace tous simplement tes
            1. if {} else if {} else{}

            par un
            1. switch{}

            et normalement tout fonctionne parfaitement.
            et sinon je te conseille de faire une fonction speciale pour le changement d'arme sa evitera les répétitions et sa allegera le code source.
            • Partager sur Facebook
            • Partager sur Twitter
              3 septembre 2007 à 20:18:28

              bon j'étais partis pour te donner des axes de correctin mais la ya trop de choses qui vont pas :
              les conditions de tes while ne font pas ce que tu veux, tu utilises des string pour stocker des entrées qui pouraient l'être par un int, tu crés la meme variable "degats" 2 fois dans ton main et tu crés de multiples "choix" (1,2..;) alors qu'ils peuvent parfaitment etre remplacés par une seule variable...
              Ah oui, pour tester si un booleen est vrai, inutile de mettre un "== true", if (bool) suffit. ah oui, ton

              1. else{
              2.             cout << "Fais un choix." << endl;
              3.             cin >> choix2;}
              4.         }


              est mal placé. Si l'utilisateur tape un autre chiffre que 1,2 ou 3, il n'entre meme pas dans ton while(). Si on le modifie en do{}while(); pour qu'il y apsse au mooins une fois, a lsortie e toon else, l'utilisateur a probablement tapé un chiffre corect et sort par conséquent de la boucle alors qu'il ne devrait pas.... bref gros probleme de test logique.


              Voila ce que j'ai vu. si tu veux que j'eclaircisse quelque chose (je sais que parfois je suis pas très clair ^^ ) dis le moi.
              • Partager sur Facebook
              • Partager sur Twitter
                4 septembre 2007 à 17:31:43

                coucou et encore merci de m'aider.

                J'ai bien remplacé les || qui étaient des problemes logique par des &&.
                je sais que l'utilise des string pour des entrees qui pourraient l'etre en int, cependant je l'ai fait car lorsque j'avais mis un int et que j'ai teste en tappant n lors du choix, le programme plantai alors que avec le string ca plante plus (c'est le seul moyen d'eviter ca que j'ai trouve a ce moment la).
                Les Choix qui ont differents numeros viennent du faite que j'avais pas encore trouve pourquoi ca plantai lorsque je tappais n et c'etait un test, merci de me l'avoi signale.
                Merci pour la verification des bools.

                Mais j'ai un probleme sur la comprehension de ce passage:

                Citation : Neodyme

                Si l'utilisateur tape un autre chiffre que 1,2 ou 3, il n'entre meme pas dans ton while(). Si on le modifie en do{}while(); pour qu'il y apsse au mooins une fois, a lsortie e toon else, l'utilisateur a probablement tapé un chiffre corect et sort par conséquent de la boucle alors qu'il ne devrait pas....



                Voila, encore desole de vous deranger pour les petits probleme d'un zero.
                • Partager sur Facebook
                • Partager sur Twitter

                une amelioration bisar

                × 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