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 ?
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();
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;
int fizdmgja = 35; int fizdmgon = 65; int mgdmgja = 53; int mgdmgon = 20;
int maxzyciaja = 1000; int zyciaja = 1000; int maxzyciaon = 1250; int zyciaon = 1250;
int manaja = 200; int maxmanaja = 200; int manaon = 100; int maxmanaon = 100;
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(); }
|
|
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. Kurs STC |
|
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 ? |
|
m4tx |
» 2011-08-05 13:41:46 Jeśli chodzi o kolorowanie - napisałem przecież w poprzednim poście. Kurs STC |
|
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ć ? |
|
SeaMonster131 |
» 2011-08-05 13:55:20 Możesz to zrobić tworząc tablicę tak jak chciałeś np: 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: 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... :) |
|
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. |
|
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.. |
|
« 1 » 2 |