wyświetlenie danej nazwy obiektu zamiast adresu

0
#include <iostream>
#include <conio.h>
#include <cstring>
 
using namespace std;
 
bool en = false;
 
class live
{
    int hp;
    int damage;
 
    public:
    live(int hps ,int damages) : hp(hps) , damage(damages)
    {}
 
    void Atakuj(live * przeciwnik)
    {
        przeciwnik->Defense(this,damage);
    }
   private:
    void Defense(live * Odkogo, int damage)
    {
        cout << this << " Dostaje od " << Odkogo << " " << damage << "obrazen!" << endl;
        if(hp>damage)
            hp -= damage;
            else
            {
                en = true;
                cout << this << " umiera!";
                hp = 0;
            }
    }
};
 
class Gracz : public live
{
 
    public:
    string Name;
    Gracz(int hps ,int damages,string xName): live(hps,damages)
    {
        Name=xName;
    }
 
};
 
class Bot : public live
{
public:
    string Name;
    Bot(int hps ,int damages,string xName): live(hps,damages)
    {
        Name=xName;
    }
};
 
 
int main() {
 
    Gracz player(100,10,"Gerwazy");
    Bot bot(100,10,"myrlok");
 
    while(!en)
    {
        player.Atakuj(&bot);
        if(en) break;
        bot.Atakuj(&player);
    }
 
 
    return 0;
}

Jak wyświetlić nazwę obiektu zamiast jego adresu?

2

Tworzysz obiekt Gracz albo Bot i on posiada Name ale potem w Defense i Atakuj przekazujesz obiekt live i go po prostu wypisujesz. Nawet jakby obiekt ten (live) miał imię to byś go nie wyświetlił bo tego nie robisz w żaden sposób.
Przenieś sobie imię do klasy nadrzędnej i po przekazaniu obiektu live wyświetlaj je: Odkogo->Name.
Po co Ci dwie klasy - Bot i Gracz skoro są takie same? Wybierz sobie jeden język i w nim nazywaj zmienne - najlepiej angielski.

1

Jeśli dobrze zrozumiałem, to zrób sobie metodę getName() która zwraca Ci imię gracza. I później będziesz mógł wywołać cout << this -> getName() << " umiera!";
Na upartego mógłbyś się odnieść bezpośrednio do pola, ale nie powinno się tak robić i jest to nieeleganckie, bo oczywiście pola powinny być prywatne :)

0

W sumie problem rozwiązany ale już pojawił się kolejny :/

#include <iostream>
#include <conio.h>
#include <cstring>
#include <stdlib.h>


using namespace std;

bool en = false;

class live
{
    protected:
    int hp;
    int damage;
    int Armor;
    string Name;

    public:
    live(int hps ,int damages,int Armores,string xName) : hp(hps) , damage(damages) , Armor(Armores),Name(xName)
    {}

    void Atakuj(live * przeciwnik)
    {
        damage=damage-Armor+(rand()%damage*0.5)-(rand()%damage*0.5);
        cout<<damage<<endl;
        if (damage <0)
            damage=0;
        cout<<damage<<endl;
        przeciwnik->Defense(this,damage);
    }
   private:
    void Defense(live * Odkogo, int damage)
    {

        cout << Name << " Dostaje od " << Odkogo->Name << " " << damage << "obrazen!" << endl;
        if(hp>damage)
            hp -= damage;
            else
            {
                en = true;
                cout << Name << " umiera!";
                hp = 0;
            }
    }
};

class Wojownik : public live
{

    public:

    Wojownik(int hps ,int damages,int Armores,string xName): live(hps,damages,Armores,xName)
    {}

};

class Mag : public live
{
public:

    Mag(int hps ,int damages,int Armores,string xName): live(hps,damages,Armores,xName)
    {}
};


int main() {

    Wojownik player(1000,50,1,"Gerwazy");
    Mag Mag(300,30,10,"myrlok");

    while(!en)
    {
        player.Atakuj(&Mag);
        if(en) break;
        Mag.Atakuj(&player);
    }


    return 0;
}

Po dodaniu Armora program zaczął się sypać (zawiesza się konsola).Na początku obstawiałem że to może przez ujemne wartości wypadkowych obrażeń ,ale nawet po postawieniu warunku if (damage <0) damage=0; jest to samo.

1

Dlaczego pancerz atakującego zmniejsza siłę jego ciosu? Powninieneś brać pod uwagę pancerz atakowanego, a nie atakującego. Co wg ciebie robi rand()%damage*0.5 ?
To jest ((rand() % damage) / 2), o to ci chodzi? Czy chciałeś (rand() % (damage / 2)). Nie potrzeba przechodzić przez floating point żeby podzielić przez 2. Dlaczego najpierw losowo zwiększasz damage, a potem zmniejszasz? Bo nie wiesz, czy zwiększyć, czy zmniejszyć? Za każdym razem zmieniasz wartość damage na podstawie losowych wartości. Tymczasem wydaje mi się, że wartosć damage w obiekcie, to siła "bazowa", która nie powinna się zmieniać losowo. Tylko siła poszczególnych ciosów (parametr damage w metodzie Defanse) powinien się być losowo modyfikowany. W ogóle nie wiem, czy ogarniasz, że te 2 rzeczy ci się przesłaniają i damage z metody Atakuj to inne damage niż w metodzie Defense. Przerywasz pętlę, gdy wojownik zabije maga, ale nie przerywasz, gdy stanie się odwrotnie. No i dobrze byłoby się zdecydować czy piszemy po angielsku czy po polsku, bo tak to mamy "lóknij przez łindoł czy kar stoi na stricie" :)

0

Dziękuję za uwagi chyba poprawiłem.Napisałeś że nie przerywam pętli w obu przypadkach ale u mnie działa jak powinno ,program wykonuję się i zakańcza zarówno gdy przegrywa mag jak i wojownik.

#include <iostream>
#include <conio.h>
#include <cstring>
#include <stdlib.h>


using namespace std;

bool en = false;

class live
{
    protected:
    int hp;
    int damage;
    int Armor;
    string Name;

    public:
    live(int hps ,int damages,int Armores,string xName) : hp(hps) , damage(damages) , Armor(Armores),Name(xName)
    {}

    virtual void Attack(live * enemy)
    {
        enemy->Defense(this,damage,Armor);
    }
   protected:

    void Defense(live * Odkogo, int damage ,int Armor)
    {
        cout<<Armor<<endl;
        damage=damage-Armor+(rand()%(damage/2))-(rand()%(damage/2));
        cout << Name << " Dostaje od " << Odkogo->Name << " " << damage << "obrazen!" << endl;
        if(hp>damage)
            hp -= damage;
            else
            {
                en = true;
                cout << Name << " umiera!";
                hp = 0;
            }
    }
};

class Warrior : public live
{
    public:
    Warrior(int hps ,int damages,int Armores,string xName): live(hps,damages,Armores,xName)
    {}

};

class Wizzard : public live
{
public:
    //int zaklecie=damage*3;
    //int mana=100;

    Wizzard(int hps ,int damages,int Armores,string xName): live(hps,damages,Armores,xName)
    {}

};


int main() {

    Warrior player1(100,100,10,"Gerwazy");
    Wizzard player2(3000,500,20,"Saruman");

    while(!en)
    {
        player1.Attack(&player2);
        if(en) break;
        player2.Attack(&player1);
    }


    return 0;
}
0

Moje klasy Warrior i Wizzard są takie same więc postanowiłem im dodać jakąś cechę. Pomysł mam taki żeby wizzardowi dorzucić jakieś zaklęcie które by zwiększało damage kosztem many która się regeneruje po każdym ciosie,a wojownikowi np. lifesteal. Czy należało by tutaj skorzystać z funkcji wirtualnej i włożyc do klas Wizzard i Warrior funkcje

virtual void Attack(live * enemy)
virtual void Defense(live * Odkogo, int damage ,int Armor)

?

1 użytkowników online, w tym zalogowanych: 0, gości: 1