Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > Probleme pour l'amélioration du RPG > Lecture du sujet

Probleme pour l'amélioration du RPG

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne M41d3n-dc # Posté le 15/05/2008 à 23:09:43
Mode sudo activé !!
Avatar
Groupe : Membres
bonjour a tous les zéros !!

je viens de découvrir le monde merveilleux du C++, c'est vraiment plus simple a coder maintenant je trouve !!

bon voila, j'ai terminer le RPG de mateo21 et je voudrais l'ameliorer, j'ai d'abord créé un 2eme round et je voulais ensuite créé un attribut m_nom comme il le demande mais je n'ai pas reussi voici main.cpp, personnage.h et .cpp

main.cpp :
Code : C++
 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
#include <iostream>
#include <string>
#include "Personnage.h" // Ne pas oublier

using namespace std;


int main()
{
    // Création des personnages
<code type="cpp">    Personnage david, goliath("Epée aiguisée", 20);

    // Au combat !
    goliath.attaquer(david);
    david.boirePotionDeVie(20);
    goliath.attaquer(david);
    david.attaquer(goliath);
    goliath.changerArme("Double hache tranchant</code>e vénéneuse de la mort", 40);
    goliath.attaquer(david);

    // Temps mort ! Voyons voir la vie de chacun...
    cout << "David" << endl;
    david.afficherEtat();
    cout << endl << "Goliath" << endl;
    goliath.afficherEtat();
    cout << endl << endl;

    // Deuxieme round !
    david.boirePotionDeVie(40);
    david.changerArme("Fronde ultra-puissante", 50);
    david.attaquer(goliath);
    goliath.attaquer(david);
    david.attaquer(goliath);

    cout << "David" << endl;
    david.afficherEtat();
    cout << endl << "Goliath" << endl;
    goliath.afficherEtat();



    return 0;
}


Personnage.h :
Code : C++
 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
#ifndef DEF_PERSONNAGE
#define DEF_PERSONNAGE

#include "Arme.h" // Ne PAS oublier d'inclure Arme.h pour en avoir la définition

class Personnage
{
    public:

    Personnage();
    Personnage(std::string nomArme, int degatsArme);
    ~Personnage();
    void recevoirDegats(int nbDegats);
    void attaquer(Personnage &cible);
    void boirePotionDeVie(int quantitePotion);
    void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
    void afficherEtat();
    bool estVivant();


    private:

    int m_vie;
    int m_mana;
    Arme m_arme; // Notre arme est "contenue" dans le Personnage
};

#endif


et Personnage.cpp

Code : C++
 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
#include <iostream>
#include <string>
#include "Personnage.h"


using namespace std;

Personnage::Personnage() : m_vie(100), m_mana(100)
{

}

Personnage::Personnage(string nomArme, int degatsArme) : m_vie(100), m_mana(100), m_arme(nomArme, degatsArme)
{

}

void Personnage::recevoirDegats(int nbDegats)
{
    m_vie -= nbDegats; // On enlève le nombre de dégâts reçus à la vie du personnage

    if (m_vie < 0) // Pour éviter d'avoir une vie négative
    {
        m_vie = 0; // On met la vie à 0 (ça veut dire mort)
    }
}

void Personnage::attaquer(Personnage &cible)
{
    cible.recevoirDegats(m_arme.getDegats());
}


void Personnage::boirePotionDeVie(int quantitePotion)
{
    m_vie += quantitePotion;

    if (m_vie > 100) // Interdiction de dépasser 100 de vie
    {
        m_vie = 100;
    }
}

void Personnage::changerArme(string nomNouvelleArme, int degatsNouvelleArme)
{
    m_arme.changer(nomNouvelleArme, degatsNouvelleArme);
}


bool Personnage::estVivant()
{
    if (m_vie > 0) // Plus de 0 de vie ?
    {
        return true; // VRAI, il est vivant !
    }
    else
    {
        return false; // FAUX, il n'est plus vivant !
    }
}

void Personnage::afficherEtat()
{
    cout << "Vie : " << m_vie << endl;
    cout << "Mana : " << m_mana << endl;
    m_arme.afficher();
}

Personnage::~Personnage()
{

}


donc j'ai d'abord changé Personnage.h en ceci :
Code : C++
1
2
3
4
5
6
7
private:

    int m_vie;
    int m_mana;
    std::string m_nom;
    Arme m_arme; // Notre arme est "contenue" dans le Personnage
};


et Personnage.cpp :
Code : C++
1
2
3
4
5
6
7
8
9
Personnage::Personnage() : m_nom("A"), m_vie(100), m_mana(100)
{

}

Personnage::Personnage(string nomArme, int degatsArme) : m_nom("B"),m_vie(100), m_mana(100), m_arme(nomArme, degatsArme)
{

}


et enfin main je ne sais pas comment l'afficher ?? doit-je le mettre ainsi ?
Code : C++
1
2
3
4
5
cout << "David" << endl;
    david.afficherEtat();
    cout << endl << "Goliath" << endl;
    goliath.afficherEtat();
    cout << endl << endl;


que faire ??

merci
ps : au passage si vous pouviez aussi me donner des conseils pour que ce soit l'utilisateur qui entre les 2 noms, merci

Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne Scaerloc # Posté le 16/05/2008 à 20:59:44
Groupe : Membres
Bin, dans la méthode "afficherEtat", tu met le nom de ton bonhomme, et pis vala ^^:

Code : C++
1
2
3
4
5
6
7
void Personnage::afficherEtat()
{
    cout << m_nom << endl;
    cout << "Vie : " << m_vie << endl;
    cout << "Mana : " << m_mana << endl;
    m_arme.afficher();
}


Ou est le problème??


Ensuite, pour le changement de nom, tu peux créer une méthode "saisirNom", qui demande à l'utilisateur de rentrer le nom, comme ceci:

Code : C++
1
2
3
4
5
void Personnage::sairNom()
{
cout << "saisissez le nom de votre perso:" << endl;
cin << m_nom;
}


Et valà! (en esperant ne pas avoir fait de fautes d'innatention).
Hors ligne M41d3n-dc # Posté le 17/05/2008 à 00:18:53
Mode sudo activé !!
Avatar
Groupe : Membres
ok merci !! :D
donc voila pour le .h
Code : C++
 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
#ifndef DEF_PERSONNAGE
#define DEF_PERSONNAGE

#include "Arme.h" // Ne PAS oublier d'inclure Arme.h pour en avoir la définition

class Personnage
{
    public:

    Personnage();
    Personnage(std::string nomArme, int degatsArme);
    ~Personnage();
    void recevoirDegats(int nbDegats);
    void attaquer(Personnage &cible);
    void boirePotionDeVie(int quantitePotion);
    void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
    void afficherEtat();
    bool estVivant();


    private:

    int m_vie;
    int m_mana;
    std::string m_nomP;
    Arme m_arme; // Notre arme est "contenue" dans le Personnage
};

#endif


et personnage.cpp
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Personnage::Personnage() : m_nomP("A"),m_vie(100), m_mana(100)
{

}

Personnage::Personnage(string nomArme, int degatsArme) : m_nomP("B"), m_vie(100), m_mana(100), m_arme(nomArme, degatsArme)
{
// ........... Plus loin ...

void Personnage::afficherEtat()
{
    cout << "Personnage : " << m_nomP << endl << endl;
    cout << "Vie : " << m_vie << endl;
    cout << "Mana : " << m_mana << endl;
    m_arme.afficher();
}

et main.cpp
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// Création des personnages
    Personnage a, b("Epée aiguisée", 20);

    // Au combat !
    b.attaquer(a);
    a.boirePotionDeVie(20);
    b.attaquer(a);
    a.attaquer(b);
    b.changerArme("Double hache tranchante vénéneuse de la mort", 40);
    b.attaquer(a);

    // Temps mort ! Voyons voir la vie de chacun...
    a.afficherEtat();
    cout << endl << endl;
    b.afficherEtat();
    cout << endl << endl;

    // Deuxieme round !
    a.boirePotionDeVie(40);
    a.changerArme("Fronde ultra-puissante", 50);
        // ......


mais il m'affiche quand meme 6 warning !!
Code : Console
-------------- Build: Release in tuto 4 ---------------

Compiling: Personnage.cpp
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h: In 
   constructor `Personnage::Personnage()':
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h:25: warning: member
   initializers for `std::string Personnage::m_nomP'
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h:23: warning: 
    and `int Personnage::m_vie'
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.cpp:9: warning: 
    will be re-ordered to match declaration order
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h: In 
   constructor `Personnage::Personnage(std::basic_string<char, 
   std::char_traits<char>, std::allocator<char> >, int)':
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h:25: warning: member
   initializers for `std::string Personnage::m_nomP'
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h:23: warning: 
    and `int Personnage::m_vie'
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.cpp:14: warning: 
    will be re-ordered to match declaration order
Linking console executable: bin\Release\tuto 4.exe
Output size is 215.00 KB
Process terminated with status 0 (0 minutes, 2 seconds)
0 errors, 6 warnings

et pour l'instant david et goliath ne s'appelle que A et B, j'ai essayer de creer une autre methode "saisirNom" en faisant un cin mais le compi me dit que s'est "private" !!
que faire ?
merci

Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne yamashi # Posté le 17/05/2008 à 06:42:24
Protection anti-kikoolol
Avatar
Groupe : Membres
Utilise une methode setNom(string name)
Tout ce qui est private ne peux pas être modifier ou lu par toute fonction n'étant pas dans la classe.

Image utilisateur
 
Hors ligne Scaerloc # Posté le 17/05/2008 à 14:01:18
Groupe : Membres
Bah, la méthode saisirNom, c'est ça ^^ :
Citation : moi

void Personnage::saisirNom()
{
cout << "saisissez le nom de votre perso:" << endl;
cin << m_nom;
}


(après, vu que j'utilise plus la console depuis longtemps, je ne sais pas si il y a un quelconque problème avec le cin).


Hors ligne Althar93 # Posté le 17/05/2008 à 15:46:23
Avatar
Groupe : Membres
Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
Salut à tous :p !

Avec cin, c'est plutôt ">>" (suffit de suivre la flêche, de flux d'entrée vers la variable ).
Donc ça te donne quelque chose comme ça (code de Scaerloc corrigé):

Code : C++
1
2
3
4
5
void Personnage::saisirNom()
{
      cout << "saisissez le nom de votre perso:" << endl;
      cin >> m_nomP;
}


Après, tu peux le faire de n'importe quelle façon, cependant, moi je verrais plus comme yamashi, une méthode avec paramètre, qui au moins ne te limitera pas à l'utilisation du flux: tu pourras par exemple directement affecter un nom aléatoire à un perso, à partir d'un tableau de std::string ou tu aurait stocké au préalable des noms "prédéfinis" plutôt que devoir l'entrer à la main à chaque fois.

Donc quelque chose comme ça

Code : C++
1
2
3
4
void Personnage::saisirNom(std::string nom)
{
       m_nomP = nom;
}


Après bien sur, à toi de récupérer le flux du cin et l'envoyer vers ta méthode nouvellement créée.

Image utilisateur Image utilisateur
 
Hors ligne M41d3n-dc # Posté le 17/05/2008 à 17:09:28
Mode sudo activé !!
Avatar
Groupe : Membres
ok merci pour vos precieux conseils !!

voila,
perso.h
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
void afficherEtat();
    void saisirNom(); // la nouvelle fct
    bool estVivant();


    private:

    int m_vie;
    int m_mana;
    std::string m_nomP;
    Arme m_arme; // Notre arme est "contenue" dans le Personnage


et le perso.cpp
Code : C++
1
2
3
4
5
void Personnage::saisirNom()
{
cout << "Saisissez le nom de votre perso : ";
cin >> m_nomP;
}

et enfin main.cpp
Code : C++
1
2
3
4
5
6
7
// Temps mort ! Voyons voir la vie de chacun...
    a.saisirNom();
    a.afficherEtat();
    cout << endl << endl;
    b.saisirNom();
    b.afficherEtat();
    cout << endl << endl;


je pense qu'on devrait n'affecté la fct saisirNom qu'au a (l'utilisateur) et que le b s'appelle par un nom predefinis !
voila, maintenant je m'attaque au cout ou fonction pour dire "machin boit X potion de X vie.."
et enfin petite question, est-ce que pour les chapitres suivants il faut garder ce RPG ou utilisé le RPG qu'il a mis en ligne (sachant que mon rpg sera changer)
voila

Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne Althar93 # Posté le 18/05/2008 à 18:50:49
Avatar
Groupe : Membres
Je n'ai pas lu les chapitre à propos desquels tu parle, mais je penses que tu dois pouvoir adapter ce qui te sera demandé directement sur ce que tu as RPG ;) .
Donc à priori, devrais être en mesure de conserver ton RPG actuel et d'y ajouter des éléments au fur et à mesure sans que ça pose de problème.

Image utilisateur Image utilisateur
 
Hors ligne M41d3n-dc # Posté le 20/05/2008 à 22:05:09
Mode sudo activé !!
Avatar
Groupe : Membres
bon voila une derniere petite question !
La console m'affiche ceci, doit-je m'en préoccupé ??
Code : Console
-------------- Build: Release in tuto 4 ---------------

Compiling: Personnage.cpp
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h: In 
   constructor `Personnage::Personnage(std::basic_string<char, 
   std::char_traits<char>, std::allocator<char> >, std::basic_string<char, 
   std::char_traits<char>, std::allocator<char> >, int)':
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h:27: warning: member
   initializers for `std::string Personnage::m_nomP'
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.h:25: warning: 
    and `int Personnage::m_vie'
C:/Users/Vincent/Desktop/Programmation/Tuto et test/C++/tuto 4/Personnage.cpp:14: warning: 
    will be re-ordered to match declaration order
Linking console executable: bin\Release\tuto 4.exe
Output size is 215.50 KB
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 3 warnings


personnage.cpp
Code : C++
1
2
3
4
5
6
7
8
9
Personnage::Personnage(string nomP, string nomArme, int degatsArme) : m_nomP(nomP), m_vie(100), m_mana(100), m_arme(nomArme, degatsArme)
{

}

void Personnage::nomIA(string nomP)
{
    m_nomP = nomP;
}

et personnage.h
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public:

    Personnage();
    Personnage(std::string nomP,std::string nomArme, int degatsArme);
    ~Personnage();
    void nomIA(std::string nomP);
    void recevoirDegats(int nbDegats);
    void attaquer(Personnage &cible);
    void boirePotionDeVie(int quantitePotion);
    void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
    void afficherEtat();
    void saisirNom();
    bool estVivant();


    private:

    int m_vie;
    int m_mana;
    std::string m_nomP;
    Arme m_arme; // Notre arme est "contenue" dans le Personnage


merci

Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne Ya2N # Posté le 21/05/2008 à 13:36:25
Groupe : Membres
Salut,

Code : C++
1
Arme m_arme; // Notre arme est "contenue" dans le Personnage

m_arme est un pointeur normalement donc on met * devant.

Code : C++
1
Arme *m_arme; // Notre arme est "contenue" dans le Personnage


Ensuite dans ton constructeur on ne peu pas initialisé les pointeurs comme ça.

mais plutôt comme ça :

Code : C++
1
2
3
4
5
6
Personnage::Personnage(string nomP, string nomArme, int degatsArme) : m_nomP(nomP), m_vie(100), m_mana(100)
{

    m_arme = new Arme(nomArme, degatsArme);

}


Et du coup dans ton destructeur tu fait ça :

Code : C++
1
2
3
4
Personnage::~Personnage()
{
    delete m_arme;
}


Si j'ai fait des ereurs corriger moi et sinon tu devrait relire le chapitre sur les class et les pointeurs.
Hors ligne Kurlze # Posté le 21/05/2008 à 14:04:57
L.O.S.T
Avatar
Groupe : Membres
Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
-> Ya2N:

Son code est correct. Pourquoi: "m_arme est un pointeur normalement" ? m_arme n'est pas obligatoirement un pointeur.

-> kudo2:

Ton warning signifie qu'il faut changer l'ordre d'initialisation de m_nomP & m_vie. Par exemple dans la liste d'initialisation le compilo préfère:

Code : C++
1
2
3
Personnage::Personnage(const string& nomP, const string& nomArme, int degatsArme) : m_vie(100), m_mana(100), m_nomP(nomP), m_arme(nomArme, degatsArme)
{
}


Vu que tu as déclaré m_nomP "après" m_vie::

Code : C++
1
2
3
4
int m_vie;
int m_mana;
std::string m_nomP;
Arme m_arme; // Notre arme est "contenue" dans le Personnage


Il faut respecter l'ordre de déclaration & d'initialisation.

EDIT: J'ai préféré mettre des références constantes pour les deux string de ton constructeur.

Édité le 21/05/2008 à 14:07:52 par Kurlze

You cannot change your fate. No man can.
 
Hors ligne M41d3n-dc # Posté le 21/05/2008 à 14:42:27
Mode sudo activé !!
Avatar
Groupe : Membres
ok merci kurlze !!!
ça marche impec'

Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne Ya2N # Posté le 21/05/2008 à 22:29:16
Groupe : Membres
Dsl pour mon ereur et cool que ça marche :D

Dans le tuto de matéo il est dit qu'il faut mettre m_arme en pointeur car pour la suprimer ça créer des bug après dans la mémoire, dans ce cas là on ne fait pas comme ça non plus ?

Hors ligne Kurlze # Posté le 21/05/2008 à 22:46:26
L.O.S.T
Avatar
Groupe : Membres
De rien kudo2, mets ton sujet en résolu !

Ya2n-> "Des bugs dans la mémoire" ?

Si tu utilises m_arme en tant que pointeur, tu utiliseras new, donc il faudra libérer la mémoire avec delete, certes.
Mais ici m_arme n'est pas un pointeur (c'est un choix, tout simplement. En tout cas kudo2 ne l'a pas déclaré en tant que pointeur), donc pas besoin de libérer la mémoire manuellement avec delete.

Après tu peux très bien déclarer un pointeur de Arme (donc Arme* m_arme), ici il est vrai que ça me parait mieux, mais kudo2 ne doit pas encore en être , donc utilise son code actuel sans allouer dynamiquement la mémoire nécessaire.

You cannot change your fate. No man can.
 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 618 Zéros connectés | Requêtes SQL 9 requêtes | Temps de génération de la page : Total (SQL) 0.0551s (0.0276s)