Probleme de fonction
Bonjour,
Je me suis mis à la programmation en C++ récemment pour le plaisir. J'ai donc commencé par suivre le tutoriel du site du zéro, au demeurant un très bon tuto.
J'ai appris à écrire une classe, à la mettre dans un autre fichier que le main.ccp, et j'en suis à coder un mini-RPG très simple via la console. Voici mon problème :
j'ai une classe nommée Personnage, et dedans une fonction Tour, appelée par le main lorsque l'initiative du personnage atteint une valeur seuil. La voici :
void Personnage::tour()
{
do
{
cout << "Tour de " << m_nomPersonnage << " : que voulez-vous faire ? /n [potion] [attaquer] [rien]" << endl;
cin >> m_action;
if (m_action=="potion")
{
boirePotionDeVie(20);
}
else if (m_action=="attaquer")
{
m_cibleAttaque=&goliath
attaquer(m_cibleAttaque);
}
else if (m_action=="rien")
{
nefaisrien();
}
}while (estActif()==1);
cout << endl;
}
ou nefaisrien() et boirepotiondevie(20) sont des fonctions qui marchent.
Seulement la fonction attaquer(Personnage) ci-dessous prend en argument un objet de type personnage, et je n'arrive pas à l'intégrer dans ma fonction tour. L'idée est de demander à l'utilisateur le personnage à attaquer, mais je ne vois pas comment faire. J'ai essayé de déclarer un objet de type personnage en attribut, et d'utiliser un pointeur mais rien ne marche. Une idée?
void Personnage::attaquer(Personnage &cible)
{
cout << m_nomPersonnage << " attaque " << cible.getName() << "." << endl;
cible.recevoirDegats(m_arme.getDegats());
cout << endl;
m_estActif=false;
}
Merci d'avance
Je me suis mis à la programmation en C++ récemment pour le plaisir. J'ai donc commencé par suivre le tutoriel du site du zéro, au demeurant un très bon tuto.
J'ai appris à écrire une classe, à la mettre dans un autre fichier que le main.ccp, et j'en suis à coder un mini-RPG très simple via la console. Voici mon problème :
j'ai une classe nommée Personnage, et dedans une fonction Tour, appelée par le main lorsque l'initiative du personnage atteint une valeur seuil. La voici :
void Personnage::tour()
{
do
{
cout << "Tour de " << m_nomPersonnage << " : que voulez-vous faire ? /n [potion] [attaquer] [rien]" << endl;
cin >> m_action;
if (m_action=="potion")
{
boirePotionDeVie(20);
}
else if (m_action=="attaquer")
{
m_cibleAttaque=&goliath
attaquer(m_cibleAttaque);
}
else if (m_action=="rien")
{
nefaisrien();
}
}while (estActif()==1);
cout << endl;
}
ou nefaisrien() et boirepotiondevie(20) sont des fonctions qui marchent.
Seulement la fonction attaquer(Personnage) ci-dessous prend en argument un objet de type personnage, et je n'arrive pas à l'intégrer dans ma fonction tour. L'idée est de demander à l'utilisateur le personnage à attaquer, mais je ne vois pas comment faire. J'ai essayé de déclarer un objet de type personnage en attribut, et d'utiliser un pointeur mais rien ne marche. Une idée?
void Personnage::attaquer(Personnage &cible)
{
cout << m_nomPersonnage << " attaque " << cible.getName() << "." << endl;
cible.recevoirDegats(m_arme.getDegats());
cout << endl;
m_estActif=false;
}
Merci d'avance
A voir également:
- Probleme de fonction
- Fonction si et - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Fonction remplacer sur word - Guide
- Fonction somme excel - Guide
1 réponse
Quel est le message d'erreur ?
Ici attaquer est une méthode de l'objet personnage et prend en paramètre un personnage. On peut effectivement passer une référence vers le personnage attaqué (cible). Si la cible n'est pas modifiée par le fonction attaquer, on peut même passer une const référence (const Personnage & cible).
Si l'instance de personnage qui attaque n'est pas modifiée par la méthode attaquer, tu peux le préciser en rajoutant le mot clé const devant l'accolade ouvrante de la fonction.
En gros voici à quoi ça va ressembler vu de loin :
Personnage.h
class Personnage {
...
public:
Personnage(const char *nom);
void attaquer(Personnage & personnage) const;
};
Personnage.c
void Personnage::attaquer(Personnage & personnage) const {
...
}
main.c
Voici un exemple fait vite fait car je n'ai pas ton code :
... et qui donne :
Bonne chance
Ici attaquer est une méthode de l'objet personnage et prend en paramètre un personnage. On peut effectivement passer une référence vers le personnage attaqué (cible). Si la cible n'est pas modifiée par le fonction attaquer, on peut même passer une const référence (const Personnage & cible).
Si l'instance de personnage qui attaque n'est pas modifiée par la méthode attaquer, tu peux le préciser en rajoutant le mot clé const devant l'accolade ouvrante de la fonction.
En gros voici à quoi ça va ressembler vu de loin :
Personnage.h
class Personnage {
...
public:
Personnage(const char *nom);
void attaquer(Personnage & personnage) const;
};
Personnage.c
void Personnage::attaquer(Personnage & personnage) const {
...
}
main.c
int main() { Personnage toto("toto"); Personnage tata("tata"); toto.attaquer(tata); return 0; }
Voici un exemple fait vite fait car je n'ai pas ton code :
#include <string> #include <iostream> #include <ostream> class personnage_t { private: std::string name; unsigned health; public: personnage_t(const char * name0, unsigned health0 = 100): name(name0), health(health0) {} inline unsigned get_health() const { return health; } inline void set_health(unsigned health0) { health = health0; } inline bool is_dead() const { return health == 0; } inline bool is_alive() const { return !is_dead(); } inline const std::string & get_name() const { return name; } void attack(personnage_t & target, unsigned damages = 10) const { int target_health = target.get_health() - damages; if (target_health < 0) target_health = 0; target.set_health((unsigned) target_health); } }; std::ostream & operator << (std::ostream & out, const personnage_t & p) { out << "Personnage: " << p.get_name() << ' ' << p.get_health(); return out; } int main() { size_t round; personnage_t toto("toto", 100), tata("tata", 150); for(round = 1; toto.is_alive() && tata.is_alive(); round++) { std::cout << "Round " << round << ':' << std::endl << toto << std::endl << tata << std::endl; toto.attack(tata, 20); tata.attack(toto, 15); } std::cout << "The end!" << std::endl << toto << std::endl << tata << std::endl; return 0; }
... et qui donne :
Round 1: Personnage: toto 100 Personnage: tata 150 Round 2: Personnage: toto 85 Personnage: tata 130 Round 3: Personnage: toto 70 Personnage: tata 110 Round 4: Personnage: toto 55 Personnage: tata 90 Round 5: Personnage: toto 40 Personnage: tata 70 Round 6: Personnage: toto 25 Personnage: tata 50 Round 7: Personnage: toto 10 Personnage: tata 30 The end! Personnage: toto 0 Personnage: tata 10
Bonne chance