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

Gra w statki - przekładanie pol do nastepnej lini

Ostatnio zmodyfikowano 2014-02-28 17:52
Autor Wiadomość
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):
C/C++
enum ShipsState { Empty, Full, Restrict, Miss, Hit };
ShipsState ships[ 10 ][ 10 ];
//....poźniej wypelniania stanem Empty
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
C/C++
if( ship.GetOrientation() == true )
{
    for( int k = 0; k <( ship.GetSize().x / 50 ); k++ )
    {
        if(( i + k ) > 9 || ships[ j ][ i + k ] == Restrict ) //...sprawdzanie czy dany kawałek statku nie jest we fragmencie zakazanym ......o tym zaraz
        {
            goto res; //....cofanie statku do pozycji wyjsciowej
        }
       
        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)
C/C++
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.png
Jak rozwiązac to,zeby te pola sie nie przenosily?
P-105357
leon_w
» 2014-02-27 21:26:48
Nie pomogło by dodanie warunku:
C/C++
if( i == 9 )
     continue;

czy coś w tym stylu?
Czyli gdy jest przy prawej krawędzi, przeskakuje dalej?.
P-105365
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"
P-105374
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
C/C++
if( 9 < i || i < 0 || j < 0 || 9 < j )
{
    continue;
}
 jednak to nie opmoglo. Czy ktos jeszcze moze spróbowac pomoc?
P-105413
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
C/C++
ShipsState ships[ 12 ][ 12 ];
I używać indeksów od 1 do 10 włącznie zamiast od 0 do 9.
P-105416
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....
P-105419
« 1 »
  Strona 1 z 1