• 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

Cloud VPS
0 głosów
1,370 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 591 wizyt
0 głosów
1 odpowiedź 768 wizyt
pytanie zadane 25 stycznia 2017 w C i C++ przez robertwe Gaduła (4,620 p.)
0 głosów
1 odpowiedź 1,188 wizyt

93,486 zapytań

142,420 odpowiedzi

322,771 komentarzy

62,900 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

Kursy INF.02 i INF.03
...