• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C++ obiektowy działanie na zmiennych z jednej klasy w metodzie innej

Object Storage Arubacloud
0 głosów
1,079 wizyt
pytanie zadane 20 czerwca 2016 w C i C++ przez Defetysta Nowicjusz (160 p.)
zamknięte 21 czerwca 2016 przez Defetysta
[Na wstępie mówię, tłumaczyć jak debilowi, jestem mocno nieogarnięty]

Chciałem napisać prostego RPGa, wiadomo, gracz zabija potworki, dostaje expa, golda, może kupić przedmiot lub awansować statystyki. Stworzyłem klasę, z której dziedziczą i potwory, i gracz (z podstawowymi statystykami, hp, atak, zręczność). Chciałem w klasie monster stworzyć metodę fight, która pobierałaby hp, atak, bronie itp. gracza, statystyki potwora, następnie obniżałaby HP jednej i drugiej strony, w razie wygranej zmniejsza obecne HP gracza o tyle ile stracił, zwiększa się poziom doświadczenia i ilość złota. O ile odwoływanie się do statystyk potwora nie sprawia problemów, to gdy próbuję działać na statystykach gracza to po walce nie zmienia się żadna ze statystyk, a cout w metodzie fight mający zwracać wartość HP wyświetla wartości typu 0x38109c.

Nie mam pojęcia ani co zrobiłem źle, ani jak rozwiązanie powinno wyglądać. Jeśli znajdzie się jakaś życzliwa duszyczka to udostępnię kod, ale ostrzegam, nie rekompensuję uszczerbku na psychice po zobaczeniu kodu.
komentarz zamknięcia: Rozwiązano problem.
6
komentarz 20 czerwca 2016 przez Corazzo Obywatel (1,040 p.)
Pokaż kod
komentarz 20 czerwca 2016 przez Avernis Nałogowiec (27,400 p.)
Może po prostu nie wyzerowałeś zmiennej na start. Chyba że przypisujesz zmiennej jakąś wartość gdzie indziej.

2 odpowiedzi

+1 głos
odpowiedź 21 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)

Poczytaj sobie o czymś takim jak przesyłanie argumentów przez referencję (przesyłanie oryginału). Jeżeli w funkcji przesyłasz kopię danych z gracza to modyfikowanie wartości kopii (które znikną po zakończeniu się funkcji) nie zmieni oryginalnych wartości (np. HP gracza).
Prosty przykład:

void fBezReferencji(int a, int b) {a-=5; b-=5;}
...
int a=10, b=20;
fBezReferencji(a,b);
//Na wyjściu dostaniesz a=10 i b=20
​----------------
void fReferencja(int &a, int &b) {a-=5; b-=5;}
...
int a=10, b=20;
fReferencja(a,b);
//Na wyjściu dostaniesz a=5 i b=15
0 głosów
odpowiedź 21 czerwca 2016 przez Defetysta Nowicjusz (160 p.)
Kod:

main.cpp

monster rabbit("rabbit", 5, 1, 3, 2, 2, 1)

rabbit.stats();
              

 rabbit.fight(gracz.yourDmg, gracz.strength, weaponDmg, gracz.agility, &gracz.hp, &gracz.gold, &gracz.exp, &gracz.allTimeExp, gracz.maxHP, questNr, &questProgress, questObjective, &gracz.lvl, &rabbit.hp, &rabbit.strength, &rabbit.agility, &rabbit.exp, &rabbit.gold);
 

deklaracja metody:

void monster::fight(int yourDmg, int yourStrength, int weaponDamage, int yourAgility, int* yourHP, int* yourGold, int*yourExp, int* yourAllTimeExp, int yourMaxHP, int questNo, int* qProgress, int qObjective, int* yourLvl, int* monsterHP, int* monsterStrength, int*monsterAgility, int* monsterExp, int* monsterGold)
{
    system("cls");
        do
            {

                yourDmg=(yourStrength)-(rand() % 2-1)+weaponDamage;
                cout<<"Enemy hp: "<<hp<<endl;
                cout<<"Your hp: "<<yourHP<<endl;
                if(yourAgility>=agility)
                    {
                        Sleep(500);
                        hp-=yourDmg;
                        cout<<"You dealt "<<yourDmg<<" damage"<<endl;
                        Sleep(500);
                        yourHP-=monsterDmg;
                        cout<<"You recieved "<<monsterDmg<<" damage"<<endl;
                    }
                else
                {
                    Sleep(500);
                    yourHP-=monsterDmg;
                    cout<<"You recieved "<<monsterDmg<<" damage"<<endl;
                    Sleep(500);
                    hp-=yourDmg;
                    cout<<"You dealt "<<yourDmg<<" damage"<<endl;
                }
            }while((hp>0)&&(yourHP>0));
            if(hp<=0)
            {
                cin.get();
                cout<<"Congratulations! You defeated a rabbit!"<<endl;
                cout<<"You found "<<gold<<" GC"<<endl;
                yourGold+=gold;
                yourExp+=2;
                yourAllTimeExp+=2;
                if(questNo==1)
                {
                    qProgress++;
                    cout<<"Your progress in quest: "<<qProgress<<" of "<<qObjective<<endl;
                }
            }
            else if(yourHP<=0)
            {
                cin.get();
                cout<<"Random villager found you senseless bleeding in grass... All you remember is that you messed with wrong rabbit"<<endl;
                cin.get();
                yourHP=yourLvl+5;
            }

}
komentarz 21 czerwca 2016 przez Defetysta Nowicjusz (160 p.)
Dodatkowo, czemu przy wyświetleniu HP dostaję wartości typu 0x38109c?
komentarz 21 czerwca 2016 przez niezalogowany
Przekazujesz argumenty przez wskaźniki, pomimo że ich nie rozumiesz.
komentarz 21 czerwca 2016 przez Defetysta Nowicjusz (160 p.)
Tyle to ja sam wiem że tego nie rozumiem. Dlatego zadałem pytanie, i proszę o wytłumaczenie.
komentarz 21 czerwca 2016 przez niezalogowany
Wyświetlasz adresy zmiennych. Masz 2 wyjścia: zrozumieć wskaźniki(podpowiedź: operator dereferencji), albo użyć referencji(i olać wskaźniki).
komentarz 21 czerwca 2016 przez Defetysta Nowicjusz (160 p.)
badbullpl dzięki bardzo, teraz rozumiem o co chodziło :)

Mam jakoś zamknąć wątek czy zrobi to admin?
komentarz 21 czerwca 2016 przez niezalogowany
Poszukaj ikonki kłódki.

Podobne pytania

0 głosów
3 odpowiedzi 431 wizyt
0 głosów
1 odpowiedź 459 wizyt
pytanie zadane 25 stycznia 2017 w C i C++ przez robertwe Gaduła (4,620 p.)
0 głosów
1 odpowiedź 1,055 wizyt

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...