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

Kółko i krzyżyk

Ostatnio zmodyfikowano 2009-12-23 10:13
Autor Wiadomość
golasek1992
Temat założony przez niniejszego użytkownika
Kółko i krzyżyk
» 2009-12-18 18:06:23
C/C++
do
{
    if( mouse_b & 1 && mouse_x < 150 && mouse_y < 150 )
    {
        blit( krzyzyk, bufor, 0, 30, 0, 35, 150, 180 ); plansza[ 0 ][ 0 ] = 1;
        blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
    }
    if( mouse_b & 1 && mouse_x > 150 && mouse_x < 300 && mouse_y < 150 )
    {
        blit( krzyzyk, bufor, - 60, 30, 100, 35, 180, 180 ); plansza[ 0 ][ 1 ] = 1;
        blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
    }
    if( mouse_b & 1 && mouse_x > 300 && mouse_y < 150 )
    {
        blit( krzyzyk, bufor, - 60, 30, 250, 35, 180, 180 ); plansza[ 0 ][ 2 ] = 1;
        blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
    }
} while( !( mouse_b & 1 ) );


To jest kawalek kodu ktory odpowiada za narysowanie krzyzyka w jednej z trzech kratek poziomo umieszczonych na ekranie i za przypisanie wartosci "1" w polu tablicy [3][3]. I problem w tym ze raz ten krzyzyk sie narysuje a raz sie nie chce narysowac i trzeba kliknac pare razy zeby powstal. Prosze o pomoc. Z gory dziekuje.
P-12274
DejaVu
» 2009-12-18 18:10:38
Przeraża mnie ten warunek (i nie tylko ten):
}while (!(mouse_b & 1));
Czemu chcesz robić jakąś pętlę w tym miejscu?
P-12275
golasek1992
Temat założony przez niniejszego użytkownika
K i K
» 2009-12-18 18:17:02
Chce uzywac tego warunku, ponieważ chce by najpierw narysowal krzyzyk i zeby nie dalo sie kliknac nic innego oprocz rysujacego klawisza myszki bo nastpeny kod odpowiada za narysowanie kolka i jezeli klikne prawym to narysuje sie kolko zamiast krzyzyka ktory powinien sie narysowac jako pierwszy.
P-12276
DejaVu
» 2009-12-18 18:36:08
To spróbuj przytrzymać klawisz dłużej. Zapewne masz w programie timer'a i klikasz tak nieszczęśliwie, że ekran jest akurat wstrzymany... choć z drugiej strony masz tu pętlę while, więc to jest błędne założenie... hm...
C/C++
for(;; )
{
    if( mouse_b != 1 )
         continue;
   
    if( mouse_x >= 0 && mouse_x <= 150 )
    {
        //ustaw cośtam na planszy
        //rysuj
        break;
    } //if
} //for
De'facto to samo co u Ciebie na pierwszy rzut oka... ale może masz jakiś błąd, którego teraz nie dostrzegam :) a być może nie chodzi wcale o ten fragment kodu.

/edit:
A sprawdzałeś co pierwsze się wykona?
C/C++
if( a & b && c )...;

if( a &( b && c ) )...;

if(( a & b ) && c )...;

P-12277
Elaine
» 2009-12-18 18:51:57
Operatory bitowe mają wyższy priorytet niż logiczne.
P-12278
golasek1992
Temat założony przez niniejszego użytkownika
K iK
» 2009-12-19 09:28:10
To moze ja wklepie caly kod i sami sie przekonacie co jest grane..
C/C++
#include <allegro.h>



int main()
{
   
    int plansza[ 3 ][ 3 ] = { { 0, 0, 0 },
        { 0, 0, 0 },
        { 0, 0, 0 } };
    allegro_init();
    install_mouse();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 452, 450, 0, 0 );
    BITMAP * lal = NULL;
    BITMAP * gal = NULL;
    BITMAP * bufor = NULL;
    bufor = create_bitmap( 450, 450 );
    show_mouse( screen );
    set_window_title( "KOLKO I KRZYZYK !!" );
    lal = load_bmp( "cross.bmp", default_palette );
    gal = load_bmp( "circle.bmp", default_palette );
   
   
    while( !key[ KEY_ESC ] )
    {
        line( bufor, 0, 150, 450, 150, makecol( 255, 0, 0 ) );
        line( bufor, 0, 300, 450, 300, makecol( 255, 0, 0 ) );
        line( bufor, 150, 0, 150, 450, makecol( 255, 0, 0 ) );
        line( bufor, 300, 0, 300, 450, makecol( 255, 0, 0 ) );
        blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
       
       
        do
        {
            if( mouse_b & 1 && mouse_x < 150 && mouse_y < 150 )
            {
                blit( lal, bufor, 0, 30, 0, 35, 150, 180 ); plansza[ 0 ][ 0 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 1 && mouse_x > 150 && mouse_x < 300 && mouse_y < 150 )
            {
                blit( lal, bufor, - 60, 30, 100, 35, 180, 180 ); plansza[ 0 ][ 1 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 1 && mouse_x > 300 && mouse_y < 150 )
            {
                blit( lal, bufor, - 60, 30, 250, 35, 180, 180 ); plansza[ 0 ][ 2 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            ////////////////////////////////////////
           
            if( mouse_b & 1 && mouse_x < 150 && mouse_y < 300 && mouse_y > 150 )
            {
                blit( lal, bufor, 0, 30, 0, 190, 150, 180 ); plansza[ 1 ][ 0 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 1 && mouse_x > 150 && mouse_x < 300 && mouse_y < 300 && mouse_y > 150 )
            {
                blit( lal, bufor, - 60, 30, 100, 190, 180, 180 ); plansza[ 1 ][ 1 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 1 && mouse_x > 300 && mouse_y < 300 && mouse_y > 150 )
            {
                blit( lal, bufor, - 60, 30, 250, 190, 180, 180 ); plansza[ 1 ][ 2 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            /////////////////////////////////////////
           
            if( mouse_b & 1 && mouse_x < 150 && mouse_y > 300 )
            {
                blit( lal, bufor, 0, 30, 0, 340, 150, 180 ); plansza[ 2 ][ 0 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 1 && mouse_x > 150 && mouse_x < 300 && mouse_y > 300 )
            {
                blit( lal, bufor, - 60, 30, 100, 340, 180, 180 ); plansza[ 2 ][ 1 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 1 && mouse_x > 300 && mouse_y > 300 )
            {
                blit( lal, bufor, - 60, 30, 250, 340, 180, 180 ); plansza[ 2 ][ 2 ] = 1;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
           
        } while( !( mouse_b & 1 ) );
       
       
       
        /////////////////////////////////
        /////////////////////////////////
       
       
        do
        {
            if( mouse_b & 2 && mouse_x < 150 && mouse_y < 150 )
            {
                blit( gal, bufor, 0, 30, 0, 35, 150, 180 ); plansza[ 0 ][ 0 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 2 && mouse_x > 150 && mouse_x < 300 && mouse_y < 150 )
            {
                blit( gal, bufor, - 60, 30, 100, 35, 180, 180 ); plansza[ 0 ][ 1 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 2 && mouse_x > 300 && mouse_y < 150 )
            {
                blit( gal, bufor, - 60, 30, 250, 35, 180, 180 ); plansza[ 0 ][ 2 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            ////////////////////////////////////////
           
            if( mouse_b & 2 && mouse_x < 150 && mouse_y < 300 && mouse_y > 150 )
            {
                blit( gal, bufor, 0, 30, 0, 190, 150, 180 ); plansza[ 1 ][ 0 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 2 && mouse_x > 150 && mouse_x < 300 && mouse_y < 300 && mouse_y > 150 )
            {
                blit( gal, bufor, - 60, 30, 100, 190, 180, 180 ); plansza[ 1 ][ 1 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 2 && mouse_x > 300 && mouse_y < 300 && mouse_y > 150 )
            {
                blit( gal, bufor, - 60, 30, 250, 190, 180, 180 ); plansza[ 1 ][ 2 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            /////////////////////////////////////////
           
            if( mouse_b & 2 && mouse_x < 150 && mouse_y > 300 )
            {
                blit( gal, bufor, 0, 30, 0, 340, 150, 180 ); plansza[ 2 ][ 0 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 2 && mouse_x > 150 && mouse_x < 300 && mouse_y > 300 )
            {
                blit( gal, bufor, - 60, 30, 100, 340, 180, 180 ); plansza[ 2 ][ 1 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
            if( mouse_b & 2 && mouse_x > 300 && mouse_y > 300 )
            {
                blit( gal, bufor, - 60, 30, 250, 340, 180, 180 ); plansza[ 2 ][ 3 ] = 2;
                blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
            }
        } while( !( mouse_b & 2 ) );
       
       
       
       
       
       
       
       
        blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
       
    }
    destroy_bitmap( lal );
    destroy_bitmap( gal );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

+ oczywiscie jakies 2 rysunki przedstawiajace kolko i krzyzyk ale to juz mysle zaden problem.
P-12282
DejaVu
» 2009-12-19 15:33:42
No to tak: masz źle zaprojektowaną grę (to oczywiście tylko moje zdanie). Gra powinna mieć jedną pętlę główną, w której:
1) wszystko jest rysowane
2) jest wspólna obsługa klawiatury i myszy dla wszystkiego
Dodaj zmienną np. int terazGracz = 0; i zmieniaj ją w zależności od tego czyj jest ruch. Sprawdzaj też czy dane pole jest puste czy też nie. Ponadto aplikacja zalicza zgona - tj. udało mi się ją wysypać kilka razy - nie patrząc w kod zapewne chodzi o wyjście poza zakres jakiejś tablicy. Na temat tego jak powinna wyglądać pętla gry pisałem swego czasu już posta na forum, więc możesz sobie poszukać tych informacji.

Uzasadnienie dlaczego jest źle:
1) pętla główna 'czeka' na ESC
2) pętla pierwsza zagnieżdżona czeka na kliknięcie 1
3) pętla druga zagnieżdżona czeka na kliknięcie 2
4) warunek pierwszej pętli będzie spełniony tylko wtedy, gdy będziesz trzymał ESC i będziesz w stanie nr 3 i zostanie kliknięty przycisk nr 2.

Spróbuj zaprojektować grę tak, aby poniższy wiersz występował w programie tylko raz:
C/C++
blit( bufor, screen, 0, 0, 0, 0, 450, 450 );
P-12284
golasek1992
Temat założony przez niniejszego użytkownika
K iK
» 2009-12-23 10:13:07
Zrobilem wszystko jak mowiles i dziala juz pieknie ;] same ify wystepuja w moim projekcie i jeden blit. dzieki
P-12403
« 1 »
  Strona 1 z 1