Dev - C++ - Problema de herencia en C++

 
Vista:
sin imagen de perfil

Problema de herencia en C++

Publicado por anonymous (6 intervenciones) el 17/06/2022 01:50:46
Este ejercicio consiste en el combate de dos personajes: Mago y Orco.
Cada uno debe comer alimentos ingresados por el usuario.
Los alimentos tienen efectos opuestos para el Mago y el Orco:

Mago:
1
2
Hongos: -10 puntos de ataque
HoneyCake: +5 puntos de ataque

Orco:
1
2
Hongos: +10 puntos de ataque
HoneyCake: -5 puntos de ataque

La definición de las clases es:

Screenshot-4

El programa debe iniciar recibiendo el nombre y puntos de ataque de los personajes. Despues debe recibir repetitivamente los alimentos "hongo" y "cake" hasta que se ingrese la palabra "fin".

Input

1
2
3
4
5
6
7
8
9
10
11
Gandalf
5
Azog
2
hongo
cake
cake
fin
hongo
cake
fin

Output

1
2
3
4
5
6
7
8
9
10
11
Los puntos de ataque del mago Gandalf es: 5
Los puntos de ataque del orco Azog es: 2
Gandalf esta comiendo Hongo y sus puntos de ataque son: -5
Gandalf esta comiendo HoneyCake y sus puntos de ataque son: 0
Gandalf esta comiendo HoneyCake y sus puntos de ataque son: 5
Azog esta comiendo Hongo y sus puntos de ataque son: 12
Azog esta comiendo HoneyCake y sus puntos de ataque son: 7
*** Empieza el combate ***
Los puntos de ataque del mago Gandalf es 5
El puntos de ataque del orco Azog es: 7
El orco Azog gano el combate!!

He desarrollado un avance pero aun no he terminado y no se como retornar el output esperado. Espero su respuesta.

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <string>
using namespace std;
 
class CAlimento {
private:
    string nombre;
    int puntosAtaque;
public:
    CAlimento(string _nombre);
    CAlimento(string _nombre, int _puntosAtaque);
    virtual ~CAlimento();
    string getNombre();
    int getPuntosAtaque();};
 
CAlimento::CAlimento(string _nombre){
    this->nombre = _nombre;
    this->puntosAtaque = -1;}
 
CAlimento::CAlimento(string _nombre, int _puntosAtaque){
    this->nombre = _nombre;
    this->puntosAtaque = _puntosAtaque;}
 
CAlimento::~CAlimento(){}
 
string CAlimento::getNombre(){
    return this->nombre;}
 
int CAlimento::getPuntosAtaque(){
    return this->puntosAtaque;}
 
// ---------------------------------------------
 
class CHoneyCake:public CAlimento {
private:
public:
    CHoneyCake(string nombre, int _cantidad);
    virtual ~CHoneyCake();
};
 
CHoneyCake::CHoneyCake(string nombre, int _cantidad) : CAlimento(nombre, 5){}
CHoneyCake::~CHoneyCake(){}
 
// ---------------------------------------------
 
class CHongo:public CAlimento {
private:
public:
    CHongo(string nombre, int _cantidad);
    virtual ~CHongo();
};
 
CHongo::CHongo(string nombre, int _cantidad) : CAlimento(nombre, -10){}
CHongo::~CHongo(){}
 
// ---------------------------------------------
 
class CPersonaje{
    string nombre;
    int puntosAtaque;
public:
    CPersonaje(){nombre="", puntosAtaque=0;};
    CPersonaje(string _nombre, int _puntosAtaque):nombre(_nombre), puntosAtaque(_puntosAtaque){}
 
    string getNombre(){return nombre;};
    int getPuntosAtaque(){return puntosAtaque;};
 
    virtual void come(CAlimento* pAlimento);
};
 
// ---------------------------------------------
 
class CMago {
private:
    string nombreMago;
    int puntosAtaque;
public:
    CMago(string _nombreMago, int _puntosAtaque);
    virtual ~CMago();
    virtual void come(CAlimento* pAlimento);
};
 
class COrco {
private:
    string nombreOrco;
    int puntosAtaque;
public:
    COrco(string _nombreOrco, int _puntosAtaque);
    virtual ~COrco();
    virtual void come(CAlimento* pAlimento);
};
 
int main(){
    int p1, p2;
    string mago, orco;
    string a1, a2;
 
    cout<<"";
    cin>>mago;
    cout<<"";
    cin>>p1;
    cout<<"";
    cin>>orco;
    cout<<"";
    cin>>p2;
    cout<<"";
    cin>>a1;
    while(a1!="fin"){
        cout<<"";
        cin>>a1;
    }
    cout<<"";
    cin>>a2;
    while(a2!="fin"){
        cout<<"";
        cin>>a2;
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema de herencia en C++

Publicado por Alfil (1444 intervenciones) el 17/06/2022 14:55:11
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
 
using namespace std;
 
class CPersonaje
{
    public:
        CPersonaje(string nombre, int puntosAtaque)
        : nombre(nombre)
        , puntosAtaque(puntosAtaque)
        {
 
        }
 
        string getNombre() { return nombre; }
        int getPuntosAtaque() { return puntosAtaque; }
        virtual void come(string alimento) = 0;
 
 
    protected:
        string nombre;
        int puntosAtaque;
};
 
class CMago : public CPersonaje
{
    public:
        CMago(string nombre, int puntosAtaque)
        : CPersonaje(nombre, puntosAtaque)
        {
 
        }
 
        virtual void come(string alimento)
        {
            if (alimento == "hongo") puntosAtaque -= 10;
            if (alimento == "cake") puntosAtaque += 5;
        }
};
 
class COrco : public CPersonaje
{
    public:
        COrco(string nombre, int puntosAtaque)
        : CPersonaje(nombre, puntosAtaque)
        {
 
        }
 
        virtual void come(string alimento)
        {
            if (alimento == "hongo") puntosAtaque += 10;
            if (alimento == "cake") puntosAtaque -= 5;
        }
};
 
int main()
{
    string nombre;
    int puntos;
 
    cout << "Nombre del Mago: "; getline(cin, nombre);
    cout << "Los puntos de ataque del Mago " << nombre << " es: "; cin >> puntos;
    cin.ignore(80, '\n');
 
    CPersonaje* p1 = new CMago(nombre, puntos);
 
    cout << "Nombre del Orco: "; getline(cin, nombre);
    cout << "Los puntos de ataque del Orco " << nombre << " es: "; cin >> puntos;
    cin.ignore(80, '\n');
 
    CPersonaje* p2 = new COrco(nombre, puntos);
 
    for (int i = 0; i < 2; i++)
    {
        string comida = "";
        while (comida != "fin")
        {
            cout << "Comida para ";
            cout << ((i == 0) ? p1->getNombre() : p2->getNombre()) << ": ";
            getline(cin, comida);
 
            if (comida != "fin")
            {
                (i == 0) ? p1->come(comida) : p2->come(comida);
 
                cout << ((i == 0) ? p1->getNombre() : p2->getNombre());
                cout << " esta comiendo " << comida;
                cout << " y sus puntos de ataque son: ";
                cout << ((i == 0) ? p1->getPuntosAtaque() : p2->getPuntosAtaque());
                cout << endl;
            }
        }
    }
 
    cout << "*** Empieza el combate ***" << endl;
    cout << "Los puntos de ataque del Mago " << p1->getNombre() << " es: " << p1->getPuntosAtaque() << endl;
    cout << "Los puntos de ataque del Orco " << p2->getNombre() << " es: " << p2->getPuntosAtaque() << endl;
 
    if (p1->getPuntosAtaque() > p2->getPuntosAtaque())
        cout << "El Mago " << p1->getNombre() << " gano el combate!!" << endl;
    else
        cout << "El Orco " << p2->getNombre() << " gano el combate!!" << endl;
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema de herencia en C++

Publicado por Alfil (1444 intervenciones) el 17/06/2022 15:50:25
Desde mi punto de vista sería más correcto que los atributos de la clase CPersonaje fueran private en vez de protected, y que el acceso a dichos datos fuese mediante métodos set:

1
void setPuntosAtaque(int puntos) { ... }

Pero el esquema UML da a entender que se debe usar como protected.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Problema de herencia en C++

Publicado por anonymous (6 intervenciones) el 17/06/2022 20:16:32
Hola amigo! Cambie algunas cositas del codigo y el output me sale así. Que podría cambiar para que el output sea como el segundo?

Screenshot-5
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema de herencia en C++

Publicado por Alfil (1444 intervenciones) el 17/06/2022 20:20:04
Empieza por deshacer lo que cambiaste. A partir de ahí analiza el código, cambiar el formato de salida es sencillo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Problema de herencia en C++

Publicado por anonymous (6 intervenciones) el 18/06/2022 00:38:59
Hola de nuevo! He modificado la parte del for que esta en el main
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
for(int i = 0; i < 2; i++){
        string comida = "";
 
        while(comida != "fin"){
            cout << ((i == 0) ? p1->getNombre() : p2->getNombre());
            getline(cin, comida);
 
            if(comida != "fin"){
 
                (i == 0) ? p1->come(comida) : p2->come(comida);
 
                if(comida=="hongo"){
                    comida="Hongo";
                }
 
                if(comida=="cake"){
                    comida="HoneyCake";
                }
 
                cout << " esta comiendo " << comida;
                cout << " y sus puntos de ataque son: ";
                cout << ((i == 0) ? p1->getPuntosAtaque() : p2->getPuntosAtaque());
                cout << endl;
            }
        }
    }

Pero cuando corro el codigo el output me sale así:

Screenshot-9

Como hago para sacar lo de amarillo?

Me podrías dar una mano en eso? Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema de herencia en C++

Publicado por anonymous (6 intervenciones) el 18/06/2022 01:17:30
Muchas gracias, amigo! Lo corregí. Muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar