Gra w statki - przekładanie pol do nastepnej lini
Ostatnio zmodyfikowano 2014-02-28 17:52
colorgreen19 Temat założony przez niniejszego użytkownika |
Gra w statki - przekładanie pol do nastepnej lini » 2014-02-27 20:40:15 Witam, pisze gre w statki. Mapa jest zapisana jako tablica 2-wymiarowa o własnym typie (trzyma info o stanie pola): enum ShipsState { Empty, Full, Restrict, Miss, Hit }; ShipsState ships[ 10 ][ 10 ];
for( int i = 0; i < 10; i++ ) { for( int j = 0; j < 10; j++ ) { ships[ i ][ j ] = Empty; } }
Pozniej, kładąc statek, brana jest jego orientacja(pion,poziom), jego rozmiar i na tej podstawie wypełniaja sie pola gdzie statek stoi if( ship.GetOrientation() == true ) { for( int k = 0; k <( ship.GetSize().x / 50 ); k++ ) { if(( i + k ) > 9 || ships[ j ][ i + k ] == Restrict ) { goto res; } ships[ j ][ i + k ] = Full; } } else { for( int k = 0; k <( ship.GetSize().y / 50 ); k++ ) { if(( j + k ) > 9 || ships[ j + k ][ i ] == Restrict ) { goto res; } ships[ j + k ][ i ] = Full; } } Potem zeby uniemozliwic nakładnie statkow na siebie (wychodzenie poza mape załatwione wczesniej) statek tworzy dookola siebie pola zakazane (Restrict) for( int i = 0; i < 10; i++ ) { for( int j = 0; j < 10; j++ ) { if( ships[ i ][ j ] == Empty &&( ships[ i - 1 ][ j - 1 ] == Full || ships[ i + 1 ][ j - 1 ] == Full || ships[ i - 1 ][ j + 1 ] == Full || ships[ i + 1 ][ j + 1 ] == Full || ships[ i ][ j + 1 ] == Full || ships[ i ][ j - 1 ] == Full || ships[ i + 1 ][ j ] == Full || ships[ i - 1 ][ j ] == Full ) ) { ships[ i ][ j ] = Restrict; } } } Wszystko działa pięknie poza momentem, gdy statek jest tuż przy prawej krawedzi. Zakazane pola tak jakby kopiują sie na nastepne miejsce w tablicy tj. (jako ze jest to tuz przy koncu) na nastepny rzad, pierwsze miejsce. Wszystko widac na logu konsolowym (tryb debug,nie ma sensu wrzucac graficznego) 0-Empty, 1-Statek(Full) 2-Pole zakazane (Restrict) http://vlep.pl/abw56q.pngJak rozwiązac to,zeby te pola sie nie przenosily? |
|
leon_w |
» 2014-02-27 21:26:48 Nie pomogło by dodanie warunku: czy coś w tym stylu? Czyli gdy jest przy prawej krawędzi, przeskakuje dalej?. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-02-27 22:17:04 niestety to nie dziala. przy prawej krawedzi przeskakuje dalej a przy lewej tez przeskakuje tyle ze "w tyl" |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-02-28 17:28:35 z tego co zauważylem to kiedy jest sprawdzany warunek to do j dodaje sie 1 - jesli j=9 to daje nam to tile[ i ][ 10 ] czyli przekraczam zakres, jadnek nie wyskakuje ni blad tylko zamiast tego zmienia sie to jakby na tile[ i + 1 ][ j = 0 ] . Probowalem to powstrzymac wczesniejszymi warunkami if( 9 < i || i < 0 || j < 0 || 9 < j ) { continue; } jednak to nie opmoglo. Czy ktos jeszcze moze spróbowac pomoc? |
|
Monika90 |
» 2014-02-28 17:40:42 Jeżeli wychodzi się poza zakres tablicy, to zachowanie jest niezdefiniowane. To znaczy że moze stać się cokolwiek. Niekoniecznie musi wyskoczyć błąd, równie dobrze może stać się coś dziwnego, np. moze zmienić się wartość jakiejś innej zmiennej. Możesz zmienić rozmiary tablicy ships na ShipsState ships[ 12 ][ 12 ];
I używać indeksów od 1 do 10 włącznie zamiast od 0 do 9. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-02-28 17:52:54 myślałem o tym, ale widze to cięzko na dalszej drodze - gra z komputerem, zeby komputer omijał zawnętrzne pola, potem w grze sieciowej to wlasnie ta tablica bedzie przesylana do 2 osoby jako mapa statkow przeciwnika i znowu trzeba bedzie robic jakies ignorowania....
|
|
« 1 » |