allegro, kołko i krzyzyk , problem z wyborem naprzemiennym

0

Witam wszystkich:)
Mam problem z wyborem kolka i krzyżyka na przemian ponieważ instrukcja if i zapętlanie sprawiają że znaki zmieniają się w zawrotnym tempie.

  • Próbowałem zastosować instrukcje switch ale sterowanie dalej było przez if co powodowało ten sam
    problem [glowa] .
  • google przeszukałem jednak nie wiedziałem jak nazwać konkretnie ten problem.
    Proszę o rady jak sobie radzicie z tym problemem.
    Z góry dzięki ;-)

Plik obiekty.h:

#include<allegro.h>



extern int mx, my, mb;

int mprzycisk(int xmin, int xmax, int ymin, int ymax, int p,int z)
{

	if(mx>=xmin && mx<=xmax && my>=ymin && my<=ymax && mb == p)
       {
		        return z;	
       }	   
}

Plik main.cpp:

#include <allegro.h>
#include "obiekty.h"
int mx=0,my=0,mb=0;
void myszka()
{
     if( mx != mouse_x || my != mouse_y || mb != mouse_b)
{
mx = mouse_x;
my = mouse_y;
mb = mouse_b;
}
};

void main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);
install_mouse();
show_mouse(screen) ;
unscare_mouse();
BITMAP *bufor = NULL;
bufor = create_bitmap(800,600);
//kolko i krzyzyk deklaracja bitmapy
BITMAP *kolko = NULL;
BITMAP *krzyzyk = NULL;

kolko = create_bitmap(50,50);
if (!kolko)
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
allegro_message("nie mogę załadować kolka !");
allegro_exit();

} 

krzyzyk = create_bitmap(50,50);
if (!krzyzyk)
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
allegro_message("nie mogę załadować krzyzyka !");
allegro_exit();

} 

clear_to_color(kolko, makecol(255,0,0));
clear_to_color(krzyzyk, makecol(0,255,0));
textout_ex(kolko,font, "Ob 1", 2,2, makecol(0,0,255), -1);
textout_ex(krzyzyk,font, "Ob 2", 2,2, makecol(0,0,255), -1); 

int z[3][3]={0};//czemu nie moze byc z[2][2] przeciez komputer liczy od zera??

while (!key[KEY_ESC])
{
clear_to_color(bufor, makecol(100,100,100));
myszka();

//kratka 
line( bufor,200,140,200,320, makecol(255,128,64));
line( bufor,260,140,260,320, makecol(255,128,64));
line( bufor,140,200,320,200, makecol(255,128,64));
line( bufor,140,260,320,260, makecol(255,128,64));

int m = 0;

//tryb serwisowy
textprintf_ex(bufor,font,20,20,makecol(200,200,200),-1,"Myszka x = %d, y = %d, klawisz = %d !", mx,my,mb);


//Przyciski

m = mprzycisk(140,200,140,200,1,11);
m = mprzycisk(200,260,140,200,1,12);
m = mprzycisk(260,320,140,200,1,13);

m = mprzycisk(140,200,200,260,1,21);
m = mprzycisk(200,260,200,260,1,22);
m = mprzycisk(260,320,200,260,1,23);

m = mprzycisk(140,200,260,320,1,31);
m = mprzycisk(200,260,260,320,1,32);
m = mprzycisk(260,320,260,320,1,33);

textprintf_ex(bufor,font,40,40,makecol(200,200,200),-1,"zwrocono %d", m); 
////////////////////////////////////////////////////////////////////////////////
///wyświetlanie///
if (z[0][0] == 1)
   blit( kolko, bufor, 0,0, 145,140,kolko->w, kolko->h);
if (z[0][1] == 1)
   blit( kolko, bufor, 0,0, 205,140,kolko->w, kolko->h);
if (z[0][2] == 1)
   blit( kolko, bufor, 0,0, 265,140,kolko->w, kolko->h);   
////
if (z[1][0] == 1)
   blit( kolko, bufor, 0,0, 145,205,kolko->w, kolko->h);                                   
if (z[1][1] == 1)
   blit( kolko, bufor, 0,0, 205,205,kolko->w, kolko->h);
if (z[1][2] == 1)
   blit( kolko, bufor, 0,0, 265,205,kolko->w, kolko->h);
////
if (z[2][0] == 1)
   blit( kolko, bufor, 0,0, 145,265,kolko->w, kolko->h);
if (z[2][1] == 1)
   blit( kolko, bufor, 0,0, 205,265,kolko->w, kolko->h);
if (z[2][2] == 1)
   blit( kolko, bufor, 0,0, 265,265,kolko->w, kolko->h); 
////////////
if (z[0][0] == 2)
   blit( krzyzyk, bufor, 0,0, 145,140,kolko->w, kolko->h);
if (z[0][1] == 2)
   blit( krzyzyk, bufor, 0,0, 205,140,kolko->w, kolko->h);
if (z[0][2] == 2)
   blit( krzyzyk, bufor, 0,0, 265,140,kolko->w, kolko->h); 
////   
if (z[1][0] == 2)
   blit( krzyzyk, bufor, 0,0, 145,205,kolko->w, kolko->h);
if (z[1][1] == 2)
   blit( krzyzyk, bufor, 0,0, 205,205,kolko->w, kolko->h);   
if (z[1][2] == 2)
   blit( krzyzyk, bufor, 0,0, 265,205,kolko->w, kolko->h);
////   
if (z[2][0] == 2)
   blit( krzyzyk, bufor, 0,0, 145,265,kolko->w, kolko->h);
if (z[2][1] == 2)
   blit( krzyzyk, bufor, 0,0, 205,265,kolko->w, kolko->h);   
if (z[2][2] == 2)
   blit( krzyzyk, bufor, 0,0, 265,265,kolko->w, kolko->h);                  
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
///system wstawiania kolka i krzyzyka///(wymaga dopracowania)///  

if(z[0][0]==2||z[0][1]==2||z[0][2]==2||z[1][0]==2||z[1][1]==2||z[1][2]==2||z[2][0]==2||z[2][1]==2||z[2][2]==2)
{
        if (m == 11)
           z[0][0] = 1;
        if (m == 12)
           z[0][1] = 1;
        if (m == 13)
           z[0][2] = 1;
////////////////
        if (m == 21)
           z[1][0] = 1;                  
        if (m == 22)
           z[1][1] = 1;
        if (m == 23)
           z[1][2] = 1;
////////////////
        if (m == 31)
           z[2][0] = 1;
        if (m == 32)
           z[2][1] = 1;
        if (m == 33)
           z[2][2] = 1;
}
//////////////////////////////////////////////////////////
else
{
        if (m == 11)
           z[0][0] = 2;
        if (m == 12)
           z[0][1] = 2;
        if (m == 13)
           z[0][2] = 2;
////////////////
        if (m == 21)
           z[1][0] = 2;
        if (m == 22)
           z[1][1] = 2;
        if (m == 23)
           z[1][2] = 2;
////////////////
        if (m == 31)
           z[2][0] = 2;
        if (m == 32)
           z[2][1] = 2;
        if (m == 33)
           z[2][2] = 2;
}
////////////////////////////////////////////////////////////////////////////////
 

/*blit( kolko, bufor, 0,0, 100,100,kolko->w, kolko->h);
blit( krzyzyk, bufor, 0,0, 100,200,krzyzyk->w, krzyzyk->h); */

 
blit(bufor,screen,0,0,0,0,800,600);
clear_keybuf();
}
destroy_bitmap(kolko);
destroy_bitmap(krzyzyk);
destroy_bitmap(bufor);
allegro_exit();

}
END_OF_MAIN(); 


</cpp>
0

Przypomniałeś mi czasy programowania liniowego w BASICu, aż się wzruszyłem :/
Słyszałeś kiedyś o tablicach i pętlach iterujących po nich?
A dokładnie z czym masz problem? Z postu to jasno nie wynika.

0

och.. kodzik az pachnie na kilometr kopiuj-klajstrem..

Mam problem z wyborem kolka i krzyżyka na przemian ponieważ instrukcja if i zapętlanie sprawiają że znaki zmieniają się w zawrotnym tempie.

odnosze wrazenie, ze:

  • program za szybko dziala, tak ze nie widac ruchow
  • znaki sie zmieniaja.. hm.. a to nie powinno byc tak ze raz postawiony znak tkwi na miejscu do konca gry>
0

Chce zrobić w ten sposób że jak nacisnę myszką gdzieś na kratce to mi się pojawi raz kółko a raz krzyżyk
a pÓÓÓÓki co po naciśnięciu zmienia mi się to z dużą prędkością.
Powodem tego jest ten fragment

////////////////////////////////////////////////////////////////////////////////
///system wstawiania kolka i krzyzyka///(wymaga dopracowania)///  
if(z[0][0]==2||z[0][1]==2||z[0][2]==2||z[1][0]==2||z[1][1]==2||z[1][2]==2||z[2][0]==2||z[2][1]==2||z[2][2]==2)
{

i nie wiem jak to zapisać inaczej.

a z dużą ilością lini będę musiał powalczyć [wstyd]

quetzalcoatl napisał(a)
  • znaki sie zmieniaja.. hm.. a to nie powinno byc tak ze raz postawiony znak tkwi na miejscu do konca gry>

tak powinno być ale do tego jeszcze nie doszedłem

0

mala podpowiedz.. linijke

if(z[0][0]==2||z[0][1]==2||z[0][2]==2||z[1][0]==2||z[1][1]==2||z[1][2]==2||z[2][0]==2||z[2][1]==2||z[2][2]==2)
{ ... }

mozna zapisac tak:

bool jestjakasdwojka = false;
for(int wiersz=0; !jestjakasdwojka && wiersz<3; ++wiersz)
  for(int kolumna=0; !jestjakasdwojka && kolumna<3; ++kolumna)
    if(z[wiersz][kolumna] == 2)
      jestjakasdwojka = true;
if(jestjakasdwojka)
{ ... }

1 użytkowników online, w tym zalogowanych: 0, gości: 1