KIM_PEEK Temat założony przez niniejszego użytkownika |
[C++] Warunek IF » 2015-11-25 18:42:28 Witam pisze prosta gre ktora dziala w oknie konsolowym. Jednak od kilku dni zatrzymalem sie w miejscu i po nieudanych probach znalezienia odpowiedzi prosze o pomoc was. Wrzucam caly kod zrodlowy gry jednak problem tkwi w funkcji void Mechanika() oddzielony komentarzem // Moj Problem. Mianowicie prosze o wytłumaczenie czemu spełnia sie tylko jeden pierwszy IF pomimo ze pozostale to klony pierwszego. #include <iostream> #include <windows.h> #include <conio.h> #include <cstdlib> #include <time.h>
using namespace std;
COORD coord = { 0, 0 }; bool GameOver;
const int wysokosc = 20; const int szerokosc = 60;
int GraczX, GraczY; int HP, Ammo, Score; int BoxY, BoxX; int FireX, FireY;
int MobX0, MobY0; int MobX1, MobY1; int MobX2, MobY2; int MobX3, MobY3; int MobX4, MobY4;
enum ekierunek { FIRE, LEFT, RIGHT }; ekierunek dir;
void gotoxy( int x, int y ) { coord.X = x; coord.Y = y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); }
void Setup() { GameOver = false; GraczX = szerokosc / 2; GraczY = 18; HP = 100; Ammo = 20; Score = 0; }
void Klawiatura() { if( _kbhit() ) { switch( _getch() ) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'k': if( Ammo != 0 ) { FireX = GraczX; FireY = GraczY - 1; Ammo--; } break; } } } void Rysuj() { gotoxy( 0, 0 ); for( int i = 0; i < szerokosc + 2; i++ ) { cout << "#"; } cout << endl; for( int i = 0; i < wysokosc; i++ ) { for( int j = 0; j < szerokosc; j++ ) { if( j == 0 ) cout << "#"; if( i == MobY0 && j == MobX0 ) { cout << "V"; j++; } if( i == MobY1 && j == MobX1 ) { cout << "V"; j++; } if( i == MobY2 && j == MobX2 ) { cout << "V"; j++; } if( i == MobY3 && j == MobX3 ) { cout << "V"; j++; } if( i == MobY4 && j == MobX4 ) { cout << "V"; j++; } if( i == FireY && j == FireX ) { cout << "."; j++; } if( i == GraczY && j == GraczX ) cout << "^"; else cout << " "; if( j == szerokosc - 1 ) cout << "#"; } cout << endl; } for( int i = 0; i < szerokosc + 2; i++ ) { cout << "#"; } cout << MobX0; cout << MobY0; cout << endl; cout << " Amunicja: " << Ammo << " " << "Punkty: " << Score << " " << "HP" << HP << "%" << endl; }
void Mechanika() { switch( dir ) { case LEFT: GraczX--; if( GraczX == 0 ) GraczX++; break; case RIGHT: GraczX++; if( GraczX == szerokosc - 1 ) GraczX--; break; } FireY--; Score++; MobY0++; MobY1++; MobY2++; MobY3++; MobY4++; if( MobY0 == 20 ) { MobY0 = rand() % 10 - 10; MobX0 = rand() % 59 + 1; } if( MobY1 == 20 ) { MobY1 = rand() % 10 - 10; MobX1 = rand() % 59 + 1; } if( MobY2 == 20 ) { MobY2 = rand() % 10 - 10; MobX2 = rand() % 59 + 1; } if( MobY3 == 20 ) { MobY3 = rand() % 10 - 10; MobX3 = rand() % 59 + 1; } if( MobY4 == 20 ) { MobY4 = rand() % 10 - 10; MobX4 = rand() % 59 + 1; } if(( MobX0 == FireX ) &&( MobY0 == FireY ) ) { Score = Score + 10; MobX0 = rand() % 59 + 1; MobY0 = rand() % 10 - 10; Ammo = Ammo + 2; } if(( MobX1 == FireX ) &&( MobY1 == FireY ) ) { Score = Score + 10; MobX1 = rand() % 59 + 1; MobY1 = rand() % 10 - 10; Ammo = Ammo + 2; } if(( MobX2 == FireX ) &&( MobY2 == FireY ) ) { Score = Score + 10; MobX2 = rand() % 58 + 1; MobY2 = rand() % 10 - 10; Ammo = Ammo + 2; } if(( MobX3 == FireX ) &&( MobY3 == FireY ) ) { Score = Score + 10; MobX3 = rand() % 58 + 1; MobY3 = rand() % 10 - 10; Ammo = Ammo + 2; } if( MobX4 == FireX && MobY4 == FireY ) { Score = Score + 10; MobX4 = rand() % 58 + 1; MobY4 = rand() % 10 - 10; Ammo = Ammo + 2; } if( MobX0 == GraczX && MobY0 == GraczY || MobX1 == GraczX && MobY1 == GraczY || MobX2 == GraczX && MobY2 == GraczY || MobX3 == GraczX && MobY3 == GraczY || MobX4 == GraczX && MobY4 == GraczY ) { HP = HP - 20; } if( HP == 0 ) GameOver = true; }
int main() { srand( time( NULL ) ); Setup(); for(;; ) { Rysuj(); Klawiatura(); Mechanika(); } return 0; } /[ cpp ]
|
|
michal11 |
» 2015-11-25 19:46:54 Musisz bardziej naświetlić problem bo kompilowałem i debugowałem ten twój program ale dalej nie wiem co jest z nim nie tak. Poza tym to nie są identyczne warunki w tych ifach. |
|
KIM_PEEK Temat założony przez niniejszego użytkownika |
» 2015-11-25 19:58:39 Okej, jezeli odpaliles moj program(mam nadzieje ze dzialal) to gdy strzelasz do przeciwnika pocisk przez niego przechodzi znaczy po za jednym czyli pierwszym Mob0.
A teraz tak bardziej precyzyjnie
Instrukcja warunkowa = Jezeli X i Y Moba sa rowne X i Y pocisku to:
Za pomoca funcki rand() wygeneruj nowa pozycje dla Moba. Dodaj 10 punktow. Dodaj 2 amunicji.
i tak 5 razy dla kazdego moba.
tylko ze warunek spelnia sie tylko dla 1 if tj. if(Mob0X == FireX && Mob0Y == FireY) reszta jest poprostu pomijana a ja nie rozumiem dlaczego.
kombinowalem juz else if. |
|
michal11 |
» 2015-11-25 20:23:32 U mnie działa chyba tak jak chcesz żeby działało, trochę spowolniłem tą grę (to był prawdopodobnie powód przez który nie widziałeś zmian), sprawdź czy jest ok: #include <iostream> #include <windows.h> #include <conio.h> #include <cstdlib> #include <time.h>
using namespace std;
COORD coord = { 0, 0 }; bool GameOver;
const int wysokosc = 20; const int szerokosc = 60;
int GraczX, GraczY; int HP, Ammo, Score; int BoxY, BoxX; int FireX, FireY;
int MobX0, MobY0; int MobX1, MobY1; int MobX2, MobY2; int MobX3, MobY3; int MobX4, MobY4;
int counter = 0;
enum ekierunek { FIRE, LEFT, RIGHT, NONE }; ekierunek dir;
void gotoxy( int x, int y ) { coord.X = x; coord.Y = y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); }
void Setup() { GameOver = false; GraczX = szerokosc / 2; GraczY = 18; HP = 100; Ammo = 20; Score = 0; MobX0 = 5; MobX1 = 10; MobX2 = 15; MobX3 = 20; MobX4 = 25; }
void Klawiatura() { if( _kbhit() ) { switch( _getch() ) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'k': if( Ammo != 0 ) { FireX = GraczX; FireY = GraczY - 1; Ammo--; } break; } } } void Rysuj() { gotoxy( 0, 0 ); for( int i = 0; i < szerokosc + 2; i++ ) { cout << "#"; } cout << endl; for( int i = 0; i < wysokosc; i++ ) { for( int j = 0; j < szerokosc; j++ ) { if( j == 0 ) cout << "#"; if( i == MobY0 && j == MobX0 ) { cout << "V"; j++; } if( i == MobY1 && j == MobX1 ) { cout << "V"; j++; } if( i == MobY2 && j == MobX2 ) { cout << "V"; j++; } if( i == MobY3 && j == MobX3 ) { cout << "V"; j++; } if( i == MobY4 && j == MobX4 ) { cout << "V"; j++; } if( i == FireY && j == FireX ) { cout << "."; j++; } if( i == GraczY && j == GraczX ) cout << "^"; else cout << " "; if( j == szerokosc - 1 ) cout << "#"; } cout << endl; } for( int i = 0; i < szerokosc + 2; i++ ) { cout << "#"; } cout << MobX0; cout << MobY0; cout << endl; cout << " Amunicja: " << Ammo << " " << "Punkty: " << Score << " " << "HP" << HP << "%" << endl; }
void Mechanika() { switch( dir ) { case LEFT: GraczX--; if( GraczX == 0 ) GraczX++; break; case RIGHT: GraczX++; if( GraczX == szerokosc - 1 ) GraczX--; break; } dir = NONE; FireY--; Score++; if( counter == 50 ) { MobY0++; MobY1++; MobY2++; MobY3++; MobY4++; counter = 0; } ++counter; if( MobY0 == 20 ) { MobY0 = 2; } if( MobY1 == 20 ) { MobY1 = 2; } if( MobY2 == 20 ) { MobY2 = 2; } if( MobY3 == 20 ) { MobY3 = 2; } if( MobY4 == 20 ) { MobY4 = 2; } if(( MobX0 == FireX ) &&( MobY0 == FireY ) ) { Score = Score + 10; MobX0 = rand() % 59 + 1; MobY0 = rand() % 10 - 10; Ammo = Ammo + 2; } if(( MobX1 == FireX ) &&( MobY1 == FireY ) ) { Score = Score + 10; MobX1 = rand() % 59 + 1; MobY1 = rand() % 10 - 10; Ammo = Ammo + 2; } if(( MobX2 == FireX ) &&( MobY2 == FireY ) ) { Score = Score + 10; MobX2 = rand() % 58 + 1; MobY2 = rand() % 10 - 10; Ammo = Ammo + 2; } if(( MobX3 == FireX ) &&( MobY3 == FireY ) ) { Score = Score + 10; MobX3 = rand() % 58 + 1; MobY3 = rand() % 10 - 10; Ammo = Ammo + 2; } if( MobX4 == FireX && MobY4 == FireY ) { Score = Score + 10; MobX4 = rand() % 58 + 1; MobY4 = rand() % 10 - 10; Ammo = Ammo + 2; } if( MobX0 == GraczX && MobY0 == GraczY || MobX1 == GraczX && MobY1 == GraczY || MobX2 == GraczX && MobY2 == GraczY || MobX3 == GraczX && MobY3 == GraczY || MobX4 == GraczX && MobY4 == GraczY ) { HP = HP - 20; } if( HP == 0 ) GameOver = true; }
int main() { srand( time( NULL ) ); Setup(); for(;; ) { Rysuj(); Klawiatura(); Mechanika(); } return 0; } |
|
KIM_PEEK Temat założony przez niniejszego użytkownika |
» 2015-11-25 20:32:36 Dziekuje ci bardzo przeanalizuje kod pozniej i napisze jezeli mialbym jakies watpliwosci , tak dokladnie o to mi chodzilo. |
|
michal11 |
» 2015-11-25 20:40:18 To może napisze tylko, że dodałem zmienną counter która zlicza ilość klatek i co 50 przesuwa potwory(spowolnienie), dodałem enuma na kierunek żeby przesuwał się powoli a nie blokował się na jednym kierunku, za komentowałem losowe pozycje potworów żeby poruszały się bardziej przewidywalnie.
W ogóle to powinieneś stworzyć sobie jakąś tablicę tych potworów, dopisać więcej funkcji (np. losowanie pozycji żeby nie trzeba było w 5 miejscach zmieniać wartości) i przede wszystkim przepisać kod na klasy to by sporo ułatwiło i sprawiło, że kod byłby łatwiejszy do czytania. |
|
KIM_PEEK Temat założony przez niniejszego użytkownika |
» 2015-11-25 23:33:11 Przeanalizowałem kod i moge powiedziec tyle:
1. dzieki za mozliwosc regulacji predkosci mobkow (
2. co do poruszania sie zastanawialem sie nad tym moze wprowadze opcje wyboru trybu poruszania sie
3.co do losowych pozycji mobkow przy zejsciu do 20 osi Y boje sie tylko ze ktos moze oszukiwac i poprostu stanac w jedenj pozycji i odejsc od komputera
(ale to tylko moje dalekie wyobrazenia)
4.Gra powstala 3 dni temu spontanicznie w ramach przypomnienia i od razu miala powstac obietkowo, ale napewno zostanie skonczona z uzyciem klas.
5.Dzieki wielkie za pomoc, problem byl trywialny a jednak zablokowal mnie na kilka dobrych godzin Ten projekt jest dla mnie swietnym przykladem jak wielka prace i wiedze wkladaja programisci w tworzeniu swoich gier/aplikacji/programow
Kiedy dokoncze gre w ktorej miales bardzo znaczacy udzial pochwale sie tym na forum.
Jezeli masz pomysl co moglbym tam dorzucic zmienic lub poprawic wszystkie propozycje mile widziane .
Dzieki, powodzenia !
|
|
« 1 » |