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

[SFML] Jak sprawdzić czy pola są obok siebie ?

Ostatnio zmodyfikowano 2013-08-10 17:37
Autor Wiadomość
MrPoxipol
» 2013-08-09 20:26:43
Monice chodzi o to, że masz np. taką tablicę z liczbami (używając enum, tylko liczbami od 0 do 2, z nazwami). Jeśli zostanie wykonany jakiś ruch, zaktualizowane dane zostaną zapisane do tej tablicy.
P-89847
domin568
Temat założony przez niniejszego użytkownika
» 2013-08-09 23:42:25
Tylko nie wiem jak można by zapisać te wartości w tablicy tak aby potem można było je porównać . Narazie zrobiłem tak ze mam 3x3 tablice i wszystkie pola wypełnione są 1 - krzyżyk , 2 - kółko . Tylko cóż mi. Z tego jak nie wiadomo gdzie one są , jestem jeszcze laikiem , i co prawda podstawy znam ale nie znam rozwiązań na niektóre przypadki . Jak mógłbym zapisywać do tej tablicy liczby aby potem można było je porównać ?? Miałem pomysł żeby sprawdzać pole (miejsce na krzyżyk lub kółko) od 0 do 8 elementu , i jeżeli JAKAŚ figura została przypisana na to pole to zapisz do tablicy dwuwymiarowej rownowaznie . Czyli np : sprawdzam czy aby na polu [0] jakiejś figury , sprawdzam czy to kółko czy krzyżyk , zapisuje do tablicy [0][0] czyli ze byłoby to na swoim miejscu , lecz nie wiem czy to wypali , bardzo liczę na waszą pomoc :)
P-89865
abdi
» 2013-08-10 00:26:27
C/C++
int main()
{
    enum Field { Empty, X, O };
    Field board[ 3 ][ 3 ] = { };
   
    board[ 0 ][ 0 ] = X;
    board[ 1 ][ 0 ] = X;
    board[ 2 ][ 0 ] = X;
   
    if( board[ 0 ][ 0 ] == board[ 1 ][ 0 ] == board[ 2 ][ 0 ] )
    {
        ...
    }
   
}

Tak się przypisuje i sprawdza. Oczywiście to tylko głupi przykład ale może Cię naprowadzi.
P-89866
Monika90
» 2013-08-10 00:30:38
Moim zdaniem to można zrobić tak:
Masz tablicę reprezentującą planszę:
C/C++
enum Symbol { Nic, X, O };
Symbol plansza[ 3 ][ 3 ] = { };
początkowo wszystkie jej elementy są równe Nic.
Masz też zmienną, która pamięta kto wykonuje ruch, i zmienną która zlicza ilość ruchów.
C/C++
Symbol kto_teraz_gra = X; //zaczyna X
int ile_ruchow = 0;
No i jak bieżący gracz kliknie w planszę to na podstawie współrzędnych kliknięcia obliczasz indeksy, wstawiasz jego symbol do tablicy i sprawdzasz czy przypadkiem nie wgrał badź zremisował
C/C++
int i =( mysz_y - plansza_y ) / wysokosc_pola;
int j =( mysz_x - plansza_x ) / szerokosc_pola;
if( i >= 0 && i < 3 && j >= 0 && j < 3 ) //czy gracz trafil w plansze?
{
    ++ile_ruchow;
    plansza[ i ][ j ] = kto_teraz_gra;
    if( wygrana( i, j, kto_teraz_gra ) )
         cout << "wygral " << kto_teraz_gra << endl;
    else if( ile_ruchow == 9 )
         cout << "remis" << endl;
    else //gramy dalej, zmien gracza
         kto_teraz_gra =( kto_teraz_gra == X ? O: X );
   
}
plansza_x i plansza_y to współrzędne lewego górnego rogu planszy.

Pozostaje do napisania funkcja wgrana, może być tak:
C/C++
bool wygrana( int i, int j, Symbol gracz )
{
    return plansza[ i ][ 0 ] == gracz && plansza[ i ][ 1 ] == gracz && plansza[ i ][ 2 ] == gracz
    || plansza[ 0 ][ j ] == gracz && plansza[ 1 ][ j ] == gracz && plansza[ 2 ][ j ] == gracz
    || plansza[ 0 ][ 0 ] == gracz && plansza[ 1 ][ 1 ] == gracz && plansza[ 2 ][ 2 ] == gracz
    || plansza[ 0 ][ 2 ] == gracz && plansza[ 1 ][ 1 ] == gracz && plansza[ 2 ][ 0 ] == gracz;
}
To nie uwzględnia wyświetlania sprite'ów, ale chyba możesz to dodać sam.
To tak w skrócie i nie wiem nawet czy to zadziała - mogłam coś przeoczyć, itp.
P-89868
domin568
Temat założony przez niniejszego użytkownika
» 2013-08-10 09:55:05
Najpierw spróbuje mojego pomysłu , jeżeli nie będzie to dobrze to spróbuje zrobić podobnie jak Ty , wielkie dzięki za odp.
P-89875
MrPoxipol
» 2013-08-10 10:00:00
Na przyszłość, żeby popracować nad logicznym myśleniem, radziłbym robić zadanka ze SPOJ'a.
P-89877
domin568
Temat założony przez niniejszego użytkownika
» 2013-08-10 14:09:11
Znalazłem dobre rozwiązanie (to co pisałem wyżej okazało się w 100 % dobre :P ) , w private klasy pole napisałem
C/C++
enum Field { Empty, X, O };
Field board[ 3 ][ 3 ];
Potem gdy ustawiałem pozycje na figure to tak jakby "przechwyciłem ją "
C/C++
sprite[ i ].setTexture( krzyzyk ); // ustawiam  odpowiednią texture
sprite[ i ].setPosition( pozycjaNaFigure ); // ustawiam pozycje figury na to pole gdzie kliknąłem

if( sprite[ i ].getPosition() == pole[ 0 ].getPosition() ) // tutaj sprawdzam czy sprite [i] nie jest równy figurze [0] , a jeżeli tak to przypisuje do tablicy board że w [0][0] jest krzyżyk
{
    board[ 0 ][ 0 ] = X;
   
}
// i tak aż do pole[8] , tak samo w kółku
Potem w metodzie sprawdzającej sprawdzam czy są w odpowiednim położeniu i wszystko ładnie działa

C/C++
if( board[ 0 ][ 0 ] == X && board[ 0 ][ 1 ] == X && board[ 0 ][ 2 ] == X )
{
    cout << "Udalo sie " << endl;
    return true;
}
 Myśle że dużo osób jako pierwszą gre 2d robi kółko i krzyżyk więc tutaj jest dla was poomoc :) . Niedługo wstawie moją grę w temacie "Wasze Prace " . Dzięki za pomoc !
P-89895
Monika90
» 2013-08-10 15:49:54
To fajnie, że działa. Dodam jeszcze, że moje obliczanie indeksów
C/C++
int i =( mysz_y - plansza_y ) / wysokosc_pola;
int j =( mysz_x - plansza_x ) / szerokosc_pola;
jest nie do końca poprawne i lepiej będzie tak:
C/C++
int i = std::floor(( mysz_y - plansza_y ) / float( wysokosc_pola ) );
int j = std::floor(( mysz_x - plansza_x ) / float( szerokosc_pola ) );
Albo jak ktoś nie lubi liczb zmiennoprzecinkowych to:
C/C++
int i =( mysz_y - plansza_y + wysokosc_pola ) / wysokosc_pola - 1;
int j =( mysz_x - plansza_x + szerokosc_pola ) / szerokosc_pola - 1;
P-89908
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona