Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak stworzyć system poziomów?

Ostatnio zmodyfikowano 2011-08-06 10:28
Autor Wiadomość
marcin107
Temat założony przez niniejszego użytkownika
Jak stworzyć system poziomów?
» 2011-08-05 13:00:38
Witam, zacząłem pisać mini gierkę bez grafiki w konsoli, jednak do tego potrzebne mi są lvle, nie wiem jak się za nie zabrać. Może określić tablice na ileś lvli i dać do tego wymagany exp a jeżeli exp będzie się równał temu z tablicy to dodać 1 do odczytywanego wpisu z tablicy itd.
Jak byście to zrobili ?

C/C++
// By malan:
// Includowane pliki zostały "ucięte" ;p

void powitanie();
void instrukcja();
void gra();
void obrazenia1();
void obrazenia2();
void obrazenia3();
void obrazenia4();
void buf();
void buf1();
void ulti();
void ulti2();
void wygrana();
void przegrana();
void sklep();
void skills();
void viewmystats();
void viewhisstats();
void menuataku();
void atakwroga();

// Glowne
int martwyja = 0;
int martwyon = 0;
int runda = 1;
int fizataklvl = 1;
int mgataklvl = 1;
int buflvl = 1;
int ultilvl = 1;
int poziom = 1;
int skillpoints = 0;
int zloto = 0;
int kup;

// Dmg atakow
int fizdmgja = 35;
int fizdmgon = 65;
int mgdmgja = 53;
int mgdmgon = 20;

// Zycia i mana
int maxzyciaja = 1000;
int zyciaja = 1000;
int maxzyciaon = 1250;
int zyciaon = 1250;

int manaja = 200;
int maxmanaja = 200;
int manaon = 100;
int maxmanaon = 100;

// inne
int wybor;


int main()
{
    using namespace std;
    powitanie();
   
    cin.get();
    return 0;
}

void powitanie()
{
    using namespace std;
   
    char wybor;
    do
    {
        system( "cls" );
        cout << "Witamy!\n";
        cout << "1 - Zacznij gre\n";
        cout << "2 - instrukcja\n";
        cout << "0 - wyjdź\n";
        cin >> wybor;
    }
    while( wybor == 1 || wybor == 2 || wybor == 0 );
   
    switch( wybor )
    {
    case '1':
        {
            cout << "Gra zacznie sie za 3 sekundy";
            Sleep( 3000 );
            gra();
            break;
        }
    case '2':
        {
            instrukcja();
            break;
        }
    case '0':
        {
            cout << "Gra sie wylączy";
            Sleep( 2000 );
            break;
        }
        default: cout << "Nie ma takiej opcji";
    }
}

void instrukcja()
{
    using namespace std;
   
    system( "CLS" );
    cout << "W grze chodzi o jak najszybsze zabicie przeciwnika.";
    Sleep( 2000 );
    powitanie();
}

void gra()
{
    using namespace std;
   
    system( "CLS" );
    if( martwyon == 0 && martwyja == 0 )
    {
        viewmystats();
        viewhisstats();
        menuataku();
        atakwroga();
       
        Sleep( 2000 );
        manaja = manaja + 15;
        manaon = manaon + 10;
        if( manaja > maxmanaja )
             manaja = maxmanaja;
       
        if( manaon > maxmanaon )
             manaon = maxmanaon;
       
        if( martwyon == 1 )
        {
            skills();
            sklep();
        }
        else if( martwyja == 1 )
             przegrana();
        else
             gra();
       
    }
}
void viewmystats()
{
    using namespace std;
   
    Sleep( 100 ); cout << "Runda "; Sleep( 200 ); cout << runda << endl Sleep( 400 );
    cout << "Twoje zycia " << zyciaja << endl Sleep( 100 );
    cout << "Twoja ilosc many " << manaja << endl Sleep( 100 );
    cout << "Zadajesz " << fizdmgja << " obrazen fizycznych" << endl Sleep( 100 );
    cout << "Zadajesz " << mgdmgja << " obrazen magicznych\n\n" << endl Sleep( 100 );
}

void viewhisstats()
{
    using namespace std;
   
    cout << "Zycia przeciwnika " << zyciaon << endl Sleep( 100 );
    cout << "Ilosc many przeciwnika " << manaon << endl Sleep( 100 );
    cout << "Obrazenia fizyczne przeciwnika to " << fizdmgon << endl Sleep( 100 );
    cout << "Obrazenia magiczne przeciwnika to " << mgdmgon << "\n\n\n" Sleep( 100 );
}

void menuataku()
{
    using namespace std;
   
    cout << "1 - Atak fizyczny\n" Sleep( 100 );
    cout << "2 - Atak magiczny (koszt 30 many)\n" Sleep( 100 );
    cout << "3 - Buf (+200 hp (koszt 60 many))\n" Sleep( 100 );
    cout << "4 - Ultimate (koszt 100 many)(200dmg + obrazenia magiczne)\n\n" Sleep( 100 );
    cin >> wybor;
   
    switch( wybor )
    {
    case 1:
        {
            if( martwyon == 0 )
                 obrazenia1();
           
            break;
        }
    case 2:
        {
            if( martwyon == 0 && manaja >= 30 )
                 obrazenia2();
            else
            {
                cout << "Za malo many";
                Sleep( 2000 );
                gra();
            }
            break;
        }
    case 3:
        {
            if( martwyon == 0 && manaja >= 60 )
                 buf();
            else
            {
                cout << "Za malo many";
                Sleep( 2000 );
                gra();
            }
            break;
        }
    case 4:
        {
            if( martwyon == 0 && manaja >= 100 )
                 ulti();
            else
            {
                cout << "Za malo many";
                Sleep( 2000 );
                gra();
            }
            break;
        }
        default:
        {
            cout << "Nie ma takiej opcji";
            gra();
        }
    }
    runda++;
}

void atakwroga()
{
    using namespace std;
   
   
    int atakwroga;
    if( martwyon == 0 )
    {
        srand( time( NULL ) );
       
        if( martwyon == 1 )
             wygrana();
        else if( manaon >= 80 )
             atakwroga = rand() % 4;
        else if( manaon >= 40 )
             atakwroga = rand() % 3;
        else if( manaon >= 30 )
             atakwroga = rand() % 2;
        else atakwroga = rand() % 1;
       
        switch( atakwroga )
        {
        case 0:
            {
                obrazenia3();
                break;
            }
        case 1:
            {
                obrazenia4();
                break;
            }
        case 2:
            {
                buf1();
                break;
            }
        case 3:
            {
                ulti2();
                break;
            }
            default: cout << "ERROR\n";
        }
    }
    else wygrana();
   
}

void obrazenia1()
{
    using namespace std;
   
    zyciaon = zyciaon - fizdmgja;
    if( zyciaon {
        martwyon = 1;
        cout << "Pokonales przeciwnika!!!\n";
    }
    else
    cout << "Zadales " << fizdmgja << " obrazen przeciwnikowi!\n";
   
    Sleep( 2000 );
   
}

void obrazenia2()
{
    using namespace std;
   
    zyciaon = zyciaon - mgdmgja;
    manaja = manaja - 30;
   
    if( zyciaon {
        martwyon = 1;
        cout << "Pokonales przeciwnika!!!\n";
    }
    else
    cout << "Zadales " << mgdmgja << " obrazen przeciwnikowi!\n";
   
    Sleep( 2000 );
}

void obrazenia3()
{
    using namespace std;
    zyciaja = zyciaja - fizdmgon;
    if( zyciaja {
        martwyja = 1;
        cout << "Przeciwnik cie pokonal!!!\n";
    }
    else
    cout << "Przeciwnik zadal ci " << fizdmgon << " obrazen!\n";
    Sleep( 2000 );
}

void obrazenia4()
{
    using namespace std;
   
    zyciaja = zyciaja - mgdmgon;
    manaon = manaon - 30;
   
    if( zyciaja {
        martwyja = 1;
        cout << "Przeciwnik cie pokonal!!!\n";
    }
    else
    cout << "Przeciwnik zadal ci " << mgdmgon << " obrazen!\n";
    Sleep( 2000 );
}

void buf()
{
    using namespace std;
   
    zyciaja = zyciaja + 200;
    manaja = manaja - 60;
    cout << "Uleczyles sie!\n";
    Sleep( 2000 );
}

void buf1()
{
    using namespace std;
   
    fizdmgon = fizdmgon + 15;
    mgdmgon = mgdmgon + 15;
    manaon = manaon - 40;
    cout << "Przeciwnik uzyl bufa +15 do obrazen atakow\n";
    Sleep( 2000 );
}

void ulti()
{
    using namespace std;
   
    zyciaon = zyciaon -( 200 + mgdmgja );
    manaja = manaja - 100;
   
    if( zyciaon {
        martwyon = 1;
        cout << "Pokonales przeciwnika!!!\n";
    }
    else
    cout << "Zadales " <<( 200 + mgdmgja ) << " obrazen przeciwnikowi!\n";
   
    Sleep( 2000 );
}

void ulti2()
{
    using namespace std;
   
    zyciaja = zyciaja -( 140 + mgdmgon );
    manaon = manaon - 80;
   
    if( zyciaja {
        martwyja = 1;
        cout << "Przeciwnik cie pokonal!!!\n";
    }
   
    else
    cout << "Przeciwnik zadal ci " <<( 140 + mgdmgon ) << " obrazen!\n";
    Sleep( 2000 );
}

void sklep()
{
    using namespace std;
   
    cout << "Witamy w sklepie!\n";
    cout << "Co chcesz nabyc ?\n\n";
    cout << "1 - item\n";
    cout << "2 - item\n";
    cout << "3 - item\n";
    cout << "4 - item\n";
    cout << "5 - item\n";
    cout << "Masz " << zloto << " zlota\n";
    cin >> kup;
    switch( kup )
    {
    case 1:
        {
            break;
        }
        default: { }
    }
}

void skills()
{
    using namespace std;
   
    system( "CLS" );
   
    cout << "Twoj poziom wynosi " << poziom << " .\n";
    cout << "Masz " << skillpoints << " punktow umiejetnosci do rozdania.\n\n";
   
    cout << "Skill upgrades!\n";
    cout << "1 - Atak fizyczny(poziom " << fizataklvl << ") - ";
    if( fizataklvl < 3 ) cout << "Ulepsz!\n";
    else cout << "Max poziom osiagniety!\n";
    cout << "2 - Atak magiczny(poziom " << mgataklvl << ") - ";
    if( mgataklvl < 3 ) cout << "Ulepsz!\n";
    else cout << "Max poziom osiagniety!\n";
    cout << "3 - Buf(poziom " << buflvl << ") - ";
    if( mgataklvl < 3 ) cout << "Ulepsz!\n";
    else cout << "Max poziom osiagniety!\n";
    cout << "4 - Ultimate(poziom " << ultilvl << ") - ";
    if( mgataklvl < 1 ) cout << "Ulepsz!\n";
    else cout << "Max poziom osiagniety!\n";
    cout << "0 - zeby pominac\n\n";
    int skille;
    cin >> skille;
    switch( skille )
    {
    case 0: break;
       
    case 1:
        {
            if( skillpoints >= 1 )
            {
                fizataklvl = fizataklvl + 1;
                skillpoints = skillpoints - 1;
            }
            else cout << "Nie masz wiecej punktow!";
            break;
        }
    case 2:
        {
            if( skillpoints >= 1 )
            {
                mgataklvl = mgataklvl + 1;
                skillpoints = skillpoints - 1;
            }
            else cout << "Nie masz wiecej punktow!";
            break;
        }
    case 3:
        {
            if( skillpoints >= 1 )
            {
                buflvl = buflvl + 1;
                skillpoints = skillpoints - 1;
            }
            else cout << "Nie masz wiecej punktow!";
            break;
        }
    case 4:
        {
            if( skillpoints >= 1 )
            {
                ultilvl = ultilvl + 1;
                skillpoints = skillpoints - 1;
            }
            else cout << "Nie masz wiecej punktow!";
            break;
        }
        default: cout << "Nie ma takiej opcji";
    }
   
    Sleep( 2000 );
}

void wygrana()
{
    using namespace std;
    system( "CLS" );
    cout << "Gratulacje!!! Pokonales przeciwnika w " << runda << " rund!";
    cin.get();
    int main();
}

void przegrana()
{
    using namespace std;
    system( "CLS" );
    cout << "Niestety nie udalo ci sie pokonac przeciwnika, przegrales w " << runda << " rundzie.";
    cin.get();
    int main();
}

P-38201
m4tx
» 2011-08-05 13:10:58
Napisałeś to tak, że nic z tego nie rozumiem. I nie wklejaj kodu (OMG, myślisz, że coś tak długiego i bez kolorowania składni będzie się chciało komuś czytać i analizować?) na zewnętrznych hostingach. » KursyKurs STC kurs
P-38203
marcin107
Temat założony przez niniejszego użytkownika
» 2011-08-05 13:19:39
Chyba wiecie jak działają lvle w grach(poziomy bohatera) i coś podobnego chce stworzyć, i nie wiem jak i pytam Was o to.
Pomyślałem że może tak:
stworzyć tablicę
new exp[20] = {5,125,250,500,1000,2500,5000...}  // Czy można w klamerki [] dać zmienną ?
A potem po skończonej walce z przeciwnikiem jakoś sprawdzić exp.
if(player_exp >= exp[jakaśzmienna+1]) to coś tam się będzie działo.
Czy to by było dobrze ? Czy może jakoś inaczej ?
 
P.S podstawy html'a znam... a kolorować mi się tego nie chce, nie ma na forum jakiejś opcji do tego ?
P-38204
m4tx
» 2011-08-05 13:41:46
Jeśli chodzi o kolorowanie - napisałem przecież w poprzednim poście. » KursyKurs STC kurs
P-38205
marcin107
Temat założony przez niniejszego użytkownika
» 2011-08-05 13:53:53
Przepraszam, nie doczytałem, a kod tej gierki w tym temacie mam wstawić ?
P-38206
SeaMonster131
» 2011-08-05 13:55:20
Możesz to zrobić tworząc tablicę tak jak chciałeś np:

C/C++
int tab[ 7 ] = { 5, 125, 250, 500, 1000, 2500, 5000 };

int exp = 0, lvl = 0;

void LvlUp()
{
    for( int i = 0; i < 7; i++ )
    if( exp == tab[ i ] )
         lvl++;
   
}

//....

if( zabilesKogos() )
{
    exp += 5;
    LvlUp();
}

Tylko że wartość exp musi być równa wartości jakiejś komórki w tablicy.

Ale ja bym zrobił tak:
C/C++
int exp = 0, lvl = 0;

//....

if( zabilesKogos() )
{
    exp += 5;
    lvl = exp / 10;
}

Czyli jeżeli
exp < 10
 to
level = 0
, jeżeli
exp >= 10
 i
exp < 20
 to
level = 2
, itd... :)
P-38207
akwes
» 2011-08-05 17:27:08
Zupełnie dziwnie się do tego zabierasz.

Wartość EXP na każdy LVL, warto wyrazić sobie wzorem matematycznym. NP.

y = 10 * x^2 + 100

Gdzie X to aktualny LVL, a Y to ilość potrzebnego EXP.

Jeżeli Aktualny EXP jest równy lub większy temu wyliczanymu z Y to zwiększamy X o 1. Przez funkcję LVLUP(), która poza zwiększeniem X o 1 zwiększa nam np. HP i MANA.

Bez tablic, bez zagmatwań, i tabelkę EXP łatwo generować czy przedstawić na wykresie.
P-38220
pekfos
» 2011-08-05 17:30:21
do tego się robi funkcję (w sensie matematycznym) kwadratową. Podstawy matmy, się kłaniają.
np taką:
f(x) = 100 * x * x

co daje na 1. level 100 expa, na drugi 400, na 3. 900 itd. jeśli nie ma być zerowego levela (dla 0 expa) to trzeba to trochę zmodyfikować:
f(x) = 100 * (x - 1) * (x - 1)


//up: ubiegłeś mnie..
P-38221
« 1 » 2
  Strona 1 z 2 Następna strona