pawels305 Temat założony przez niniejszego użytkownika |
Generowanie mapy » 2017-01-16 19:22:53 Witam, mam za zadanie jako projekt zrobić grę saper w C++. Zrobiłem już działającą grę jednak wcześniej miałem z góry określone rozmiary mapy i zmieniłem by gracz mógł ustalać, jednakże teraz po podaniu szerokości i wysokości mapy pojawia się komunikat że program przestał działać. Z góry dziękuję za pomoc, jest to mój pierwszy projekt więc z pewnością nie jest profesjonalnie napisany więc proszę o wyrozumiałość. #include <iostream> #include<stdio.h> #include<conio.h> #include<cstdlib> #include<ctime> #include<windows.h> using namespace std;
struct Mapa { int Wartosc; bool Odkryta; bool Podejrzenie_miny; }; struct Gracz { int PozX; int PozY; };
void generuj_mape( Mapa ** mapa, int szer, int wys, Gracz & gracz ) { for( int i = 0; i < szer; i++ ) for( int j = 0; j < wys; j++ ) { mapa[ i ][ j ].Wartosc = 0; mapa[ i ][ j ].Odkryta = false; mapa[ i ][ j ].Podejrzenie_miny = false; } gracz.PozX = szer / 2; gracz.PozY = wys / 2; } void ustaw_mine( Mapa ** mapa, int PozX, int PozY, int szer, int wys ) { mapa[ PozX ][ PozY ].Wartosc = 9; for( int i = - 1; i < 2; i++ ) for( int j = - 1; j < 2; j++ ) { if( j + PozX < 0 || i + PozY < 0 ) continue; if( j + PozX > szer || i + PozY > wys ) continue; if( mapa[ PozX + j ][ PozY + i ].Wartosc == 9 ) continue; mapa[ PozX + j ][ PozY + i ].Wartosc++; } }
void losuj_miny( Mapa ** mapa, Gracz & gracz, int szer, int wys ) { time_t t; int PozX, PozY, ilosc_min = 10; srand(( unsigned ) time( & t ) ); while( ilosc_min > 0 ) { PozX = rand() % szer; PozY = rand() % wys; if( mapa[ PozX ][ PozY ].Wartosc != 9 ) { ustaw_mine( mapa, PozX, PozY, szer, wys ); ilosc_min--; } } } void Stan_planszy( Mapa ** mapa, Gracz & gracz, HANDLE uchwyt, int szer, int wys ) { system( "cls" ); for( int i = 0; i < wys; i++ ) { for( int j = 0; j < szer; j++ ) { if( j == gracz.PozX && i == gracz.PozY ) { SetConsoleTextAttribute( uchwyt, 2 ); cout << "&"; SetConsoleTextAttribute( uchwyt, 7 ); } else if( mapa[ j ][ i ].Odkryta == true ) cout << mapa[ j ][ i ].Wartosc; else if( mapa[ j ][ i ].Odkryta == false && mapa[ j ][ i ].Podejrzenie_miny == false ) cout << "#"; else if( mapa[ j ][ i ].Odkryta == false && mapa[ j ][ i ].Podejrzenie_miny == true ) { SetConsoleTextAttribute( uchwyt, 4 ); cout << "@"; SetConsoleTextAttribute( uchwyt, 7 ); } } cout << endl; } cout << "Pozycja gracza:" << endl; cout << "X:" << gracz.PozX + 1 << endl; cout << "Y:" << gracz.PozY + 1 << endl; }
void dzialania_gracza( Mapa ** mapa, char znak, Gracz & gracz, bool & zakoncz, int szer, int wys ) { if( znak == 'a' && gracz.PozX > 0 ) gracz.PozX--; if( znak == 'd' && gracz.PozX < szer - 1 ) gracz.PozX++; if( znak == 's' && gracz.PozY < wys - 1 ) gracz.PozY++; if( znak == 'w' && gracz.PozY > 0 ) gracz.PozY--; if( znak == 'q' ) { cout << "Na pewno chcesz wyjsc? [y/n]"; znak = getch(); if( znak == 'y' ) zakoncz = true; else if( znak == 'n' ) zakoncz = false; } if( znak == 'l' && mapa[ gracz.PozX ][ gracz.PozY ].Podejrzenie_miny == false ) mapa[ gracz.PozX ][ gracz.PozY ].Podejrzenie_miny = true; else if( znak == 'l' && mapa[ gracz.PozX ][ gracz.PozY ].Podejrzenie_miny == true ) mapa[ gracz.PozX ][ gracz.PozY ].Podejrzenie_miny = false; if( znak == 'k' && mapa[ gracz.PozX ][ gracz.PozY ].Wartosc == 9 ) { cout << "Przykro mi, przegrales, kliknij aby kontynuowac"; zakoncz = true; getch(); } else if( znak == 'k' && mapa[ gracz.PozX ][ gracz.PozY ].Wartosc != 9 ) mapa[ gracz.PozX ][ gracz.PozY ].Odkryta = true; }
bool czy_wygral( Mapa ** mapa, bool & zakoncz, clock_t start, clock_t & stop, int szer, int wys ) { int miny = 0; for( int i = 0; i < wys; i++ ) { for( int j = 0; j < szer; j++ ) if( mapa[ j ][ i ].Odkryta == false ) miny++; } if( miny == 10 ) { stop = clock(); double czas; czas =( double )( stop - start ) / CLOCKS_PER_SEC; cout << "Gratuluje wygranej! Zajelo ci to:" << czas << " sekund. Kliknij aby kontynuowac"; zakoncz = true; getch(); return true; } return false; }
int main( int argc, char ** argv ) { HANDLE uchwyt; int szer, wys, ilosc_min; clock_t start, stop; uchwyt = GetStdHandle( STD_OUTPUT_HANDLE ); char wybor; while( 1 < 2 ) { system( "cls" ); SetConsoleTextAttribute( uchwyt, 6 ); cout << " MENU GLOWNE" << endl; SetConsoleTextAttribute( uchwyt, 7 ); cout << "1.Nowa gra" << endl; cout << "2.Jak grac" << endl; cout << "3.Wyjscie z programu" << endl; wybor = getch(); switch( wybor ) { case '1': { system( "cls" ); cout << "Podaj x:"; cin >> szer; cout << "Podaj y:"; cin >> wys; Mapa ** mapka = new Mapa *[ szer ]; for( int i = 0; i < szer; i++ ) mapka[ i ] = new Mapa[ wys ]; start = clock(); Gracz gracz; generuj_mape( mapka, szer, wys, gracz ); losuj_miny( mapka, gracz, szer, wys ); bool zakoncz = false; Stan_planszy( mapka, gracz, uchwyt, szer, wys ); while( !zakoncz ) { if( kbhit() ) { char znak = getch(); dzialania_gracza( mapka, znak, gracz, zakoncz, szer, wys ); Stan_planszy( mapka, gracz, uchwyt, szer, wys ); czy_wygral( mapka, zakoncz, start, stop, szer, wys ); } } } break; case '2': cout << "Tu bedzie opis"; getch(); break; case '3': exit( 0 ); } } return 0; } |
|
michal11 |
» 2017-01-16 20:19:32 U mnie działa, jakie wartości podajesz?
Wstaw kod na forum w odpowiednie znaczniki. |
|
pawels305 Temat założony przez niniejszego użytkownika |
» 2017-01-16 23:13:49 Już poprawione, w sumie różne próbowałem i za każdym razem pokazywało, że przestał działać. Znaczy na samym początku dla wartości 12 i 8 było dobrze a potem dla nich tez przestało działać. Teraz wpisuję np 10 10 i przestaje działać :/ |
|
czaffik |
» 2017-01-17 02:46:27 Użyj potęgi mocy, znaczy się debuggera. On wskaże ci 45 linię twojego kodu: if( mapa[ PozX + j ][ PozY + i ].Wartosc == 9 ) continue;
a rozwiązanie problemu polega na zmianie linii 43 z: if( j + PozX > szer || i + PozY > wys ) continue;
na if( j + PozX >= szer || i + PozY >= wys ) continue;
Po prostu wychodziłeś poza zakres tablicy, raz się uda, drugi raz nie, mi za pierwszym razem też zadziałało, ale potem zaczeło się krzaczyć. |
|
pawels305 Temat założony przez niniejszego użytkownika |
» 2017-01-17 14:43:03 Zrobiłem tak, ale wciąż jest ten problem, że czasem działa czasem nie i nie wiem co jest grane :/ A co do debuggera jest ten problem, że dopiero zaczynam programowanie i nie do końca jeszcze wiem jak się nim posługiwać. |
|
pawels305 Temat założony przez niniejszego użytkownika |
» 2017-01-17 14:53:48 Po kilku testach wydaje mi się, że wszystko działa dobrze gdy tworzy się mapę kwadratową, a gdy już o różnych wymiarach to często przestaje działać. |
|
czaffik |
» 2017-01-17 16:21:52 to dziwne, co bym teraz nie wpisywał to mi działa i nie chce się wyłożyć. Dowiedz się jak debugować, nie musisz od razu być w tym specjalistą, wystarczy że wskaże ci miejsce występowania błędu, nie zawsze ale zazwyczaj da co to jakiś trop. |
|
pawels305 Temat założony przez niniejszego użytkownika |
» 2017-01-17 16:29:34 No zmieniłem tą jedną linijkę ale działa umnie tylko dla kwadratowej, jeszcze się pobawię. A próbowałem i za pomocą deva i code blocksa i nic. Znaczy najwiekszy problem, że trzeba te zmienne ustalić które ma obserwować a nie wiem które.W każdym razie dzięki za pomoc :) |
|
« 1 » 2 |