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

Funkacj lvl up

Object Storage Arubacloud
0 głosów
347 wizyt
pytanie zadane 13 kwietnia 2016 w C i C++ przez Weboo Nowicjusz (160 p.)
tworzę bardzo prostego i ubogiego RPG'a w C++ i potrzebuję pomocy z funkcją lvl up która nie chce mi wyjść.
Ogólnym założeniem jest że funkcja sprawdza czy nasze punkty doświadczenia spełniają wymóg jaki jest potrzebny do otrzymania poziomu, jako wzór ustawiłem że nasza postać ma startowo pierwszy poziom i ilość punktów jaką potrzebuje do osiągnięcia poziomu drugiego wyraziłem wzorem punkty_wymagane=1000*aktualny_poziom, innymi słowy funkcja ma sprawdzać czy nasza postać ma określoną ilość punktów doświadczenia i jeśli tak to wraz z poziomem otrzymujemy zwiększenie statystyk naszej postaci, natomiast jeśli nie mamy tylu punktów funkcja wyświetla nam napis "Nie osiągnięto nowego poziomu, potrzeba jeszcze" i w tym miejscu pojawia się ile punktów nam brakuje aby uzyskać kolejny poziom, w programie stosuję programowanie obiektowe.
Z góry dziękuję za pomoc.

3 odpowiedzi

+1 głos
odpowiedź 13 kwietnia 2016 przez Porcupine Nałogowiec (31,560 p.)
A z czym dokładnie masz problem? Ja bym stworzył dwie funkcje:

Pierwsza sprawdzałaby czy gracz osiągnął wymagane doświadczenie jeśli tak wywołujesz drugą funkcje jeśli nie wypisujesz ten komunikat, który podałeś. Za każdym razem kiedy gracz zdobędzie jakiekolwiek doświadczenie wywołujesz tą funkcję.

Druga po prostu aktualizuje statystyki postaci, inkrementuje poziom i zmienia wartość wymaganego doświadczenia na kolejny poziom.

Pozdrawiam,
komentarz 13 kwietnia 2016 przez Weboo Nowicjusz (160 p.)
b1.punkty_doswiadczenia=b1.punkty_doswiadczenia+2000;
if (b1.punkty_doswiadczenia>=b1.poziom*1000)

tak zrobiłem otrzymywanie doświadczenia, w przypadku gdy jest prawdziwe chcę abu odpalała się funkcja tego typu

cout<<"Lvl up"<<endl;
            cout<<"aktualne statystyki"<<endl;
            b1.poziom=b1.poziom+1;
            b1.sila=b1.sila+2;
            b1.inte=b1.inte+2;
            b1.agil=b1.agil+1;
            b1.mana=b1.mana+40;
            b1.hp=b1.hp+100;

natomiast jeśli warunek nie jest prawdziwy to ma wywołać się ta funkcja

b1.punkty_doswiadczenia_left=(b1.poziom*1000)-b1.punkty_doswiadczenia;
        cout<<"Nie zdobyles nowego poziomu"<<endl<<"Potrzebujesz jeszcze "<<b1.punkty_doswiadczenia_left<<" punktow doswiadczenia"<<endl;

taki jest miej więcej zarys zdobywania poziomów, oczywiście można to wklejać po każdej walce bez funkcji ale nie o to mi chodzi dlatego liczę na pomoc.

komentarz 13 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
Tylko, że z logicznego punktu widzenia, przy każdym dodaniu do zmiennej przechowujacej ilość doświadczenia, musisz sprawdzić, czy ilość doświadczenia nie pozwala na awans/lvl up.
komentarz 13 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
Ew w funkcji dodajacej doświadczenie, bo zakładam że doświadczenie jest prywatne, mógłbyś dodać tą funkcję która by sprawdzała czy nastąpił lvl up
0 głosów
odpowiedź 13 kwietnia 2016 przez Grzyboo Nałogowiec (28,860 p.)
Bierzesz sie za "RPG", gdy nie potafisz sprawdzić czy jedna liczba jest większa od drugiej? Proponuję zacząć od przerobienia podstaw.
komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
Właśnie pisząc tego RPG nauczy się podstaw i robi to poprzez to forum
komentarz 13 kwietnia 2016 przez Grzyboo Nałogowiec (28,860 p.)
No ale litości. Wystarczy przerobić kurs / przeczytać książkę i już się te podstawy ma. Uczenie się just-in-time działa, ale nie gdy masz zerową wiedzę.
komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
Wydaje mi się że wystarczy znać instrukcje przypisania, cin i cout i można brać się za programowanie ale to moje zdanie
komentarz 13 kwietnia 2016 przez Grzyboo Nałogowiec (28,860 p.)

Jasne, poleć początkującemu, który zna

instrukcje przypisania, cin i cout

napisanie gry 3D pokroju Minecrafta. Myślę, że to dobry pomysł, bo się dużo nauczy.

 

Wszystko trzeba małymi krokami. Rzucanie się na duży projekt bez podstawowej wiedzy nie jest wcale dobre. A przynajmniej jest nieefektywne, bo zamiast przerobić wszystko po kolei to nasuwają się tylko kolejne pytania, na które nie potrafimy znaleźć odpowiedzi.

0 głosów
odpowiedź 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
edycja 13 kwietnia 2016 przez Szahid
if (b1.punkty_doswiadczenia>=b1.poziom*1000) { Tutaj wywołań funkcje która ma podnieść staty } else { tu funkcja co mówi że nie ma wystarczająco pd} O to Ci chodziło? Zaraz wrócę do domu to Ci to ładnie rozpisze
komentarz 13 kwietnia 2016 przez Weboo Nowicjusz (160 p.)
dokładnie o coś takiego mi chodziło, problem w tym że nie wiem jak zrobić funkcję aby zadziałała i nie wiem jak ją wywołać aby obliczenia były poprawne i prawidłowo wzrastały statystyki.
Będę bardzo wdzięczny za rozpisanie tego.
komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
Za godzinkę wszystko rozpisze bo na telefonie nie dam rady
komentarz 13 kwietnia 2016 przez Weboo Nowicjusz (160 p.)
spoko, w razie potrzeby mogę podesłać cały kod, mam napisany jedynie schemat jednej walki który później powielę z uwzględnieniem wyższych statystyk przeciwnika i naszej postaci, jedyne co muszę zrobić to sprawną funkcję walki i zdobywania poziomów.
komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)

Jeśli chcesz sprawić żeby program wykonał jakąś instrukcje w zależności od warunku musisz użyć instrukcji warunkowej if /else 

 

Ty masz tam tylko ifa [if (b1.punkty_doswiadczenia>=b1.poziom*1000) i chcesz żeby w zależności od niego wykonały się dwie funkcje. A więc musisz dodać jeszcze esla i będzie wyglądało to tak. 

 

if (b1.punkty_doswiadczenia>=b1.poziom*1000)
{

  nazwafunkcji1(parametry);  // tutaj wywołujesz funkcje która podnosi statystyki

}

else

{

nazwafunkcji2(); // tutaj wywołujesz funkcje odpowiedzialną za wyświetlenie komunikatu że prakuje pd
}

 

I to wszystko o co pytałeś. Jakbyś  miał jeszcze jakiś problem to napisz pod moim postem.

 

( I pamiętaj żeby do funkcj podnoszącej staty przekazać parametry przez referencje bo innaczej funkcja się wykona a parametry się nie zmienią) 

komentarz 13 kwietnia 2016 przez Weboo Nowicjusz (160 p.)
else też mam, jedyny problem w tym że nie wiem jaką funkcję napisać void, float czy coś innego ?
I co ma być parametrami w nawiasie ?
komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
to zależy co ma funkcja robić. Według mnie powinny być voidy ale napisz dokładnie co się ma zadziać w niej a najlepiej daj kod to Ci powiem

 

Rozumiem że b1 to struktura. Tak ?
komentarz 13 kwietnia 2016 przez Weboo Nowicjusz (160 p.)
class bohater
{
public:
    int poziom;
    int punkty_doswiadczenia;
    int punkty_doswiadczenia_left;
    int mana;
    int hp;
    string nazwa;
    int sila;
    int inte;
    int agil;
    int obrazenia;
    int non_crit;
    int crit;

    void lvl_up()
    {
bohater b1;

            cout<<"Lvl up"<<endl;
            cout<<"aktualne statystyki"<<endl;
            b1.poziom=b1.poziom+1;
            b1.sila=b1.sila+2;
            b1.inte=b1.inte+2;
            b1.agil=b1.agil+1;
            b1.mana=b1.mana+40;
            b1.hp=b1.hp+100;
            cout<<"HP: "<<b1.hp<<endl<<"Mana: "<<b1.mana<<endl<<"sila: "<<b1.sila<<endl<<"Inteligencja: "<<b1.inte<<endl<<"Zrecznosc: "<<b1.agil<<endl;
    }
     void non_lvl_up()
     {



        bohater b1;
        b1.punkty_doswiadczenia_left=(poziom*1000)-b1.punkty_doswiadczenia;
        cout<<"Nie zdobyles nowego poziomu"<<endl<<"Potrzebujesz jeszcze "<<b1.punkty_doswiadczenia_left<<" punktow doswiadczenia"<<endl;

    }
};

to jest cała deklaracja klasy bohater i w niej zawarłem też funkcje zdobywania poziomu lub nie zdobywania poziomu

 

komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
edycja 13 kwietnia 2016 przez Szahid

A więc tak. Zaczynasz od warunku if / else jak wyżej pisaliśmy. I teraz funkcje.  We funkcjach w klasie widze błąd a mianowicie niepotrzebnie tworzysz w nich nowy obiekt ( chodzi o linijke 19 i 36 w tym co wkleiłeś. Jeśli stworzysz obiekt wewnątrz funkcji to po wykonaiu się jej ten obiekt zniknie dlatego należy przekazać go jako paratemtr tej funkcji ( oczywiście poprzez referencje) ( jeśli nie wiesz co to jest przekazywanie przez referencje to sobie o tym poczytaj, ogarniesz to w 5 min) ( UWAGA  referencje i przekazywanie przez refrencje to dwie różne rzeczy więc zwróć uwage co czytasz). 

Obiekt b1 musi być utworzony w funkcji main ( i przypuszczam że tak zrobiłeś) i przekazany jako parametr funkcji.  Teraz wkelje Ci przykładowy kod .

 

Twoja klasa ma wyglądać tak.


class bohater // wywaliłem z niej tylko deklaracje nowych obiektów i dodałem parametry funkcji
{
public:
    int poziom;
    int punkty_doswiadczenia;
    int punkty_doswiadczenia_left;
    int mana;
    int hp;
    string nazwa;
    int sila;
    int inte;
    int agil;
    int obrazenia;
    int non_crit;
    int crit;
 
    void lvl_up(bohater& b1 )
    {

 
            cout<<"Lvl up"<<endl;
            cout<<"aktualne statystyki"<<endl;
            b1.poziom=b1.poziom+1;
            b1.sila=b1.sila+2;
            b1.inte=b1.inte+2;
            b1.agil=b1.agil+1;
            b1.mana=b1.mana+40;
            b1.hp=b1.hp+100;
            cout<<"HP: "<<b1.hp<<endl<<"Mana: "<<b1.mana<<endl<<"sila: "<<b1.sila<<endl<<"Inteligencja: "<<b1.inte<<endl<<"Zrecznosc: "<<b1.agil<<endl;
    }
     void non_lvl_up(bohater& b1)
     {
 
 
 
        
        b1.punkty_doswiadczenia_left=(poziom*1000)-b1.punkty_doswiadczenia;
        cout<<"Nie zdobyles nowego poziomu"<<endl<<"Potrzebujesz jeszcze "<<b1.punkty_doswiadczenia_left<<" punktow doswiadczenia"<<endl;
 
    }
};

 

 

a kod w funkcji main może być taki 

 

 

if (b1.punkty_doswiadczenia>=b1.poziom*1000)
{
 
   b1.lvl_up(bohater& b1);// porzekazałem b1 przez referencje [Tu poprawiłem]
 
}
 
else
 
{
 
  b1.non_lvl_up(bohater& b1); // [Tu poprawiłem]
}

 

 

 

komentarz 13 kwietnia 2016 przez Weboo Nowicjusz (160 p.)
po wpisaniu tego do pliku przy kompilacji wyskoczyły mi 4 błędy
w wierszy 4 przy if pojawiły się 2 błędy:

-'class bohater' has no member named 'level_up'

-expected primary-expresion before'&' token

następnie w 12 linijce mam kolejne 2 błędy:

-expected primary-expresion before'&' token

- 'non_lvl_up' was not declard in this scope

to są jedyne błędy jakie wskazuje kompilator
komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
No tak.  Przepraszam. Przez rozpęd. Dam edycje poprzeniego posta i  po // napisze co zmieniłem ( napisałem nie takie nazwy funkcji)
komentarz 13 kwietnia 2016 przez Weboo Nowicjusz (160 p.)
Być może jestem typowym bobem programowania ale nie potrafię teraz rozwiązać problemu z tym błędem,

expected primary-expresion before'&' token <--- pojawia się nadal w tych samych miejscach co poprzednio i nie mam pojęcia jak to naprawić.
komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
Na pw napisze Ci maila. Wyślij mi tam proszę plik z kodem
komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)

To ja jestem bobem :) 

if (b1.punkty_doswiadczenia>=b1.poziom*1000)
{
  
   b1.lvl_up();
}
  
else
  
{
  
  b1.non_lvl_up( ); 
}

Przepraszam Cie ale robie kika rzeczy na raz  a sam pewnie wiesz jak to wtedy jest. Dlatego się tak motam 

komentarz 13 kwietnia 2016 przez Szahid Pasjonat (20,930 p.)
funkcja jest wewnątrz klasy bohater więc bez parametrów się wywołuje
komentarz 13 kwietnia 2016 przez Weboo Nowicjusz (160 p.)
#include <cstdio>
#include <cstdarg>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
int Rand( const int amount,...)
{
    if( amount <= 0 ) return - 1;

    int * percent = new int[ amount ];
    int val = 0;
    va_list vl;
    va_start( vl, amount );
    for( int i = 0; i < amount; ++i ) {
        percent[ i ] = va_arg( vl, int );
        val += percent[ i ];
    }
    va_end( vl );
    if( val != 100 ) {
        delete[] percent;
        return - 1;
    }
    int r = rand() % 100 + 1;
    int tmp = 0;
    for( int i = 0; i < amount; ++i ) {
        if( r <= tmp + percent[ i ] ) {
            delete[] percent;
            return i;
        }
        tmp += percent[ i ];
    }
    delete[] percent;
    return - 1;
}

class wrog
{
    public:
 string nazwa;
 int hp;
 int sila;
 int obrazenia;
 int agil;
 int non_crit;
 int crit;
};
class bohater
{
public:
    int poziom;
    int punkty_doswiadczenia;
    int punkty_doswiadczenia_left;
    int mana;
    int hp;
    string nazwa;
    int sila;
    int inte;
    int agil;
    int obrazenia;
    int non_crit;
    int crit;

    void lvl_up(bohater& b1 )
    {


            cout<<"Lvl up"<<endl;
            cout<<"aktualne statystyki"<<endl;
            b1.poziom=b1.poziom+1;
            b1.sila=b1.sila+2;
            b1.inte=b1.inte+2;
            b1.agil=b1.agil+1;
            b1.mana=b1.mana+40;
            b1.hp=b1.hp+100;
            cout<<"HP: "<<b1.hp<<endl<<"Mana: "<<b1.mana<<endl<<"sila: "<<b1.sila<<endl<<"Inteligencja: "<<b1.inte<<endl<<"Zrecznosc: "<<b1.agil<<endl;
    }
     void non_lvl_up(bohater& b1)
     {




        b1.punkty_doswiadczenia_left=(poziom*1000)-b1.punkty_doswiadczenia;
        cout<<"Nie zdobyles nowego poziomu"<<endl<<"Potrzebujesz jeszcze "<<b1.punkty_doswiadczenia_left<<" punktow doswiadczenia"<<endl;

    }
};
void walka()
{
cout<<"[1] Atak podstawowy"<<endl;
cout<<"[2] Atak specialny"<<endl;
cout<<"[3] Run Bitch run!!!!"<<endl;
}

int main()
{
int liczba, obrazenia, wynik,leczenie=0, pick;
bohater b1;
cout<<"Kim jestes ?"<<endl<<"1. Wojownik"<<endl<<"2. Mag"<<endl<<"3. Lucznik"<<endl;
cin>>pick;
system("cls");
switch (pick)
{
    case 1:
b1.hp=500, b1.mana=50, b1.sila=6, b1.inte=3, b1.agil=4, b1.crit, b1.non_crit, b1.punkty_doswiadczenia=0, b1.poziom=1;
cout<<"Jestes Wojownikiem"<<endl<<"Statystyki: "<<endl<<"HP: "<<b1.hp<<endl<<"Mana: "<<b1.mana<<endl<<"sila: "<<b1.sila<<endl<<"Inteligencja: "<<b1.inte<<endl<<"Zrecznosc: "<<b1.agil<<endl;
break;
    case 2:
     b1.hp=450, b1.mana=160, b1.sila=4, b1.inte=6, b1.agil=3, b1.crit, b1.non_crit, b1.punkty_doswiadczenia=0, b1.poziom=1;
cout<<"Jestes Magiem"<<endl<<"Statystyki: "<<endl<<"HP: "<<b1.hp<<endl<<"Mana: "<<b1.mana<<endl<<"sila: "<<b1.sila<<endl<<"Inteligencja: "<<b1.inte<<endl<<"Zrecznosc: "<<b1.agil<<endl;
break;
    case 3:
        b1.hp=450, b1.mana=80, b1.sila=5, b1.inte=4, b1.agil=6, b1.crit, b1.non_crit, b1.punkty_doswiadczenia=0, b1.poziom=1;
cout<<"Jestes Lucznikiem"<<endl<<"Statystyki: "<<endl<<"HP: "<<b1.hp<<endl<<"Mana: "<<b1.mana<<endl<<"sila: "<<b1.sila<<endl<<"Inteligencja: "<<b1.inte<<endl<<"Zrecznosc: "<<b1.agil<<endl;
break;
}
system("pause");
system("cls");
wrog w1;
w1.hp=500;
w1.agil=2;
w1.sila=5;
w1.crit;
w1.non_crit;
cout<<"Wild bloody queen appeared"<<endl;
system("pause");
system("cls");
cout<<"Bloody Queen stats :"<<endl;
cout<<"HP: "<<w1.hp<<endl<<"Strengh: "<<w1.sila<<endl<<"agility: "<<w1.agil<<endl;
do
{
cout<<"HP Wroga "<<w1.hp<<endl;
cout<<"Twoje HP "<<b1.hp<<endl;
walka();
cin>>liczba;
system("cls");
switch (liczba)
{
case 1:
obrazenia=b1.sila*10;
        b1.crit=b1.agil*10;
    b1.non_crit=100-b1.crit;
     wynik = Rand( 2, b1.crit, b1.non_crit );
        printf( "%d\n", wynik );
if(wynik==0){obrazenia=obrazenia*2;}
w1.hp=w1.hp-obrazenia;
obrazenia=w1.sila*10;

        w1.crit=w1.agil*10;
    w1.non_crit=100-w1.crit;
     wynik = Rand( 2, w1.crit, w1.non_crit );
        printf( "%d\n", wynik );
if(wynik==0){obrazenia=obrazenia*2;}
b1.hp=b1.hp-obrazenia;
leczenie=obrazenia+leczenie;
system("cls");
break;
case 2:
if(b1.mana<=19){cout<<"nie masz many";}
else{
b1.mana=b1.mana-20;
obrazenia=b1.inte*10;
b1.crit=b1.agil*10;
b1.non_crit=100-b1.crit;
 wynik = Rand( 2, b1.crit, b1.non_crit );
printf( "%d\n", wynik );
if(wynik==0){obrazenia=obrazenia*2;}
w1.hp=w1.hp-obrazenia;
system("cls");
   }
obrazenia=w1.sila*10;
        w1.crit=w1.agil*10;
    w1.non_crit=100-w1.crit;
     wynik = Rand( 2, w1.crit, w1.non_crit );
        printf( "%d\n", wynik );
if(wynik==0){obrazenia=obrazenia*2;}
b1.hp=b1.hp-obrazenia;
leczenie=obrazenia+leczenie;
break;
case 3:
    cout<<"Uciekasz"<<endl;
    return 0;
    break;
}
}
while(w1.hp>0&&b1.hp>0);
if(w1.hp<=0){cout<<"bloody queen has been slained "<<endl;
b1.hp=b1.hp+leczenie;
cout<<"uleczyles swoje rany"<<endl;
cout<<"otrzymales 2000 exp'a"<<endl;
system("pause");
system("cls");
b1.punkty_doswiadczenia=b1.punkty_doswiadczenia+2000;
if (b1.punkty_doswiadczenia>=b1.poziom*1000)
{

   b1.lvl_up();
}

else

{

  b1.non_lvl_up();
}
}
if(b1.hp<=0){cout<<"You have been slained "<<endl;}
return 0;
}

tak wygląda cały program w dużym skrócie bo to będzie rozwinięte, w momencie wprowadzenia ostatniej poprawki pojawiło się kilka nowych, obcych mi błędów część jest w funkcji a część w main()

 

Podobne pytania

0 głosów
1 odpowiedź 157 wizyt
pytanie zadane 5 marca 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 71 wizyt
pytanie zadane 14 czerwca 2020 w JavaScript przez inazuma-code33 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 94 wizyt

92,631 zapytań

141,495 odpowiedzi

319,863 komentarzy

62,011 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!

...