Bonjour a toutes et tous,

Dans le cadre de mon apprentissage au langage c++, je décidé de faire un projet pour appliquer les différents points que j'ai appris, à savoir la création d'un mini RPG (je sais, rien de bien original mais bon).

Avant de vous expliquer mon problème en détail, je vais vous expliquer le but de mon programme et mettre les différents codes écrit jusque là.

L'idée de mon RPG est un petit jeu de duel entre deux mages (je sais, niveau originalité je peux repasser). Les deux joueurs vont créer, tour à tour, leur mage en indiquant son nom et le type de mage qu'il veut utiliser (feu, eau, vent, terre ... mais pour l'instant celle le feu est créé). Puis de les faire combattre (cette partie ne sera pas aborder ici car non-créée pour l'instant vu que la partie création a des problèmes).

Pour la création des mages, j'ai d'abord créé une classe mère nommé Mage afin que tous les mages, quelques soit leur type soit initialisé pareillement et ont tous des actions de base

fichier Mage.h:
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
 
#ifndef MAGE_H_INCLUDED
#define MAGE_H_INCLUDED
 
#include <iostream>
#include <vector>
#include <string>
 
class Mage
{
    public:
        //Constructeur
        Mage(std::string nom);
 
        //Destructeur
        virtual ~Mage();
 
        //Methodes
        virtual void recevoirDegats(int degats);
        virtual void recevoirGuerison();
        virtual void coupDePoing(Mage &cible) const;
        virtual void sePresenter () const;
        virtual void afficherEtat();
 
    protected:
        //Attributs
        int m_vie;
        int m_mana;
        std::string m_nom;
};
 
#endif // PERSONNAGE_H_INCLUDED
fichier Mage.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
 
#include "Mage.h"
 
using namespace std;
 
 
//Constructeur
Mage::Mage(string nom) : m_vie(100), m_mana(100), m_nom(nom)
{
 
}
 
//Destructeur
Mage::~Mage()
{
 
}
 
 
//Méthode "de base" pour tous les personnes
void Mage::recevoirDegats(int degats)
{
    m_vie -= degats;
}
 
void Mage::recevoirGuerison()
{
    m_vie += 20;
}
 
void Mage::coupDePoing(Mage &cible) const
{
    cible.recevoirDegats(10);
}
 
void Mage::sePresenter() const
{
    cout << "Bonjour, je m'appelle " << m_nom << "." << endl;
    cout << "J'ai encore " << m_vie << " points de vie et " << m_mana << " points de mana." << endl << endl;
}
 
 
void Mage::afficherEtat()
{
    cout << "Etat de " << m_nom << endl;
    cout << "Vie : " << m_vie << endl;
    cout << "Mana : " << m_mana << endl << endl;
}
J'ai donc ensuite créé une première classe fille héritant de Mage nommé MageFeu

fichier MageFeu.h
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
 
#ifndef MAGEFEU_H_INCLUDED
#define MAGEFEU_H_INCLUDED
 
#include <iostream>
#include <string>
#include "Mage.h"
 
class MageFeu : public Mage
{
    public:
        //Constructeurs
        MageFeu(std::string nom);
 
        //Destructeur
        virtual ~MageFeu();
 
        //Methodes
        virtual void sePresenter () const;
        virtual void bouleDeFeu(Mage &cible) const;
 
    protected:
        //Attributs spécifiques a la classe Magicien
 
};
 
#endif // MAGEFEU_H_INCLUDED
fichier MageFeu.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
 
#include "Mage.h"
#include "MageFeu.h"
 
using namespace std;
 
//Constructeurs
MageFeu::MageFeu(string nom) : Mage(nom)
{
 
}
 
//Destructeur
MageFeu::~MageFeu()
{
 
}
 
 
//Méthodes spécifiques à la classe Mage de feu
void MageFeu::sePresenter() const
{
    cout << "Bonjour, je m'appelle " << m_nom << ". Je suis un Mage de feu" << endl;
    cout << "J'ai encore " << m_vie << " points de vie et " << m_mana << " points de mana." << endl << endl;
}
 
 
void MageFeu::bouleDeFeu(Mage &cible) const
{
    cible.recevoirDegats(35);
}
Personnellement, je préfère créer un fichier par classe que tout mettre dans le même ficher, cela peut déranger et alourdir le code en include mais m'y retrouve plus facilement.


Maintenant, je vous donne mon fichier 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
 
#include <iostream>
#include "Mage.h"
#include "MageFeu.h"
 
 
using namespace std;
 
int main()
{
    string nomMage1;
    string nomMage2;
    int choixType1(0);
    int choixType2(0);
 
    //Creation du premier mage
    Mage* pMage1 = NULL;
	cout << "Rentrez le nom du premier mage svp:" << endl;
	getline(cin, nomMage1);
	cout << "Choisissez le type de mage:" << endl;
	cin >> choixType1;
	if(choixType1 == 1)
	{
		pMage1 = new Mage(nomMage1);
	}
	else if(choixType1 ==2)
	{
		pMage1 = new MageFeu(nomMage1);
	}
    pMage1->sePresenter();
 
 
    //Creation du deuxième mage
    Mage* pMage2 = NULL;
	cout << "Rentrez le nom du deuxieme mage svp:" << endl;
	getline(cin, nomMage2);
	cout << "Choisissez le type de mage:" << endl;
	cin >> choixType2;
	if(choixType2 == 1)
	{
		pMage2 = new Mage(nomMage2);
	}
	else if(choixType2 ==2)
	{
		pMage2 = new MageFeu(nomMage2);
	}
    pMage2->sePresenter();
 
    return 0;
}

Lorsque je ne crée qu'un mage (je met une des deux création de mage en commentaire, n'importe laquelle), je n'ai aucun problème, la création se fait normalement et mon programme s'arrête.

Le problème vient lorsque je veux créer les deux mages: le premier mage se créer bien (on renseigne correctement le nom et le type choisi) mais lorsque l'on passe à la création du deuxième mage, celle-ci ne nous permet pas de renseigner le nom du personnage et nous demande tout de suite de choisir le type de mange. On obtient donc un deuxième mage du type choisi mais sans nom.

Comment faire pour régler le problème ???

Dans l'attente de vos réponse,
Cordialement,
Clairetj