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

Problem z programem w allegro

Ostatnio zmodyfikowano 2009-11-11 15:07
Autor Wiadomość
McAffey
Temat założony przez niniejszego użytkownika
Problem z programem w allegro
» 2009-11-10 20:20:08
Witam! Próbuję zrobić program na kształt Excela, tylko mam pewien problem. Kod wygląda tak:

[CODE src="C++" zwin]
#include <allegro.h>
#include <math.h>

int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);
clear_to_color(screen, makecol(255,255,255));

//arc(screen, SCREEN_W/2, SCREEN_H/2,itofix(0), itofix(128), 100, makecol(0, 0, 0));
//// Linie
int nrlit;

int lit[25], litp[25], litk[25];  


litp[1]=25;
litk[1]=89;
//lit[1]=litk[1]-litp[1];
//A-1  B-2
litp[2]=89;
litk[2]=153;
lit[2]=litk[2]-litp[2];                   

litp[3]=153;
litk[3]=217;
//lit[3]=litk[3]-litp[3]; 

int nrlitstary;

   //A-1  B-2

int licz[25], liczp[25], liczk[25];

int nrlicz;
int nrliczstary;

liczp[1]=81;
liczk[1]=98;
//licz[1]=liczk[1]-liczp[1];

liczp[2]=98;
liczk[2]=115;
//licz[2]=liczk[2]-liczp[2];
 






line(screen,0,64,0,600, makecol(0,0,0));  
line(screen,0,64,800,64, makecol(0,0,255));

line(screen,25,64,25,600, makecol(0,0,0));   //A
textout_ex(screen,font,"A",54,70 ,makecol(0,0,0),-1);  //A
line(screen,89,64,89,600, makecol(0,0,0));   //A
textout_ex(screen,font,"B",118,70 ,makecol(0,0,0),-1);  //B
line(screen,153,64,153,600, makecol(0,0,0));   //B

line(screen,0,81,800,81,makecol(0,0,0)); // 1
textout_ex(screen,font,"1",10,87 ,makecol(0,0,0),-1); //1
line(screen,0,98,800,98,makecol(0,0,0)); //1
textout_ex(screen,font,"2",10,104 ,makecol(0,0,0),-1); //2
line(screen,0,115,800,115,makecol(0,0,0)); //2


nrlit=1;
nrlicz=1;

while(!key[KEY_ESC])
{

                 
nrlitstary=nrlit;
nrliczstary=nrlicz;

if(nrlit>1)
{
(
key[KEY_LEFT]);
line(screen,litp[nrlitstary],liczp[nrliczstary],litk[nrlitstary],liczp[nrliczstary],makecol(0,0,0)); // poziom gorny
line(screen,litp[nrlitstary],liczk[nrliczstary],litk[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // poziom doly
line(screen,litp[nrlitstary],liczp[nrliczstary],litp[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // pion lewy
line(screen,litk[nrlitstary],liczp[nrliczstary],litk[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // pion prawy
nrlit--;
}     

if(key[KEY_RIGHT])

line(screen,litp[nrlitstary],liczp[nrliczstary],litk[nrlitstary],liczp[nrliczstary],makecol(0,0,0)); // poziom gorny
line(screen,litp[nrlitstary],liczk[nrliczstary],litk[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // poziom doly
line(screen,litp[nrlitstary],liczp[nrliczstary],litp[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // pion lewy
line(screen,litk[nrlitstary],liczp[nrliczstary],litk[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // pion prawy
nrlit++;
}

if(nrlicz>1)
{
(key[KEY_UP]);
line(screen,litp[nrlitstary],liczp[nrliczstary],litk[nrlitstary],liczp[nrliczstary],makecol(0,0,0)); // poziom gorny
line(screen,litp[nrlitstary],liczk[nrliczstary],litk[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // poziom doly
line(screen,litp[nrlitstary],liczp[nrliczstary],litp[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // pion lewy
line(screen,litk[nrlitstary],liczp[nrliczstary],litk[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // pion prawy 
nrlicz--;
}

if(key[KEY_DOWN])
{
line(screen,litp[nrlitstary],liczp[nrliczstary],litk[nrlitstary],liczp[nrliczstary],makecol(0,0,0)); // poziom gorny
line(screen,litp[nrlitstary],liczk[nrliczstary],litk[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // poziom doly
line(screen,litp[nrlitstary],liczp[nrliczstary],litp[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // pion lewy
line(screen,litk[nrlitstary],liczp[nrliczstary],litk[nrlitstary],liczk[nrliczstary],makecol(0,0,0)); // pion prawy  
nrlicz++;
}

//polozenie czerwoneo prostokata po zwolnieniu klawisza


line(screen,litp[nrlit],liczp[nrlicz],litk[nrlit],liczp[nrlicz],makecol(255,0,0)); // poziom gorny
line(screen,litp[nrlit],liczk[nrlicz],litk[nrlit],liczk[nrlicz],makecol(255,0,0)); // poziom doly
line(screen,litp[nrlit],liczp[nrlicz],litp[nrlit],liczk[nrlicz],makecol(255,0,0)); // pion lewy
line(screen,litk[nrlit],liczp[nrlicz],litk[nrlit],liczk[nrlicz],makecol(255,0,0)); // pion prawy      



}

readkey();
allegro_exit();
return 0;
}
END_OF_MAIN();

[/code]

Program na razie ma tylko czerwoną ramką zaznaczać wybraną kratkę. Wie gdzie zaznaczać na podstawie zmiennych "x" branych z "liter" na górze i zmienną "y" z cyfr po lewej. Gdy klikam strzałkę w górę zmniejsza się liczba gdy w dół liczba się zwiększa, gdy w prawo litera się zwiększa (1-A,2-B) a w lewo zmniejsza. Chwilowo zrobiłem tylko opcję, że stare miejsce czerwonej ramki "zamalowuje" taką samą tylko czarną ramką. I on dobrze dobiera ramkę, tylko problem polega na tym, że on gdzieś sobie cały czas przypisuje, że litera jest 1 (A) i liczba jest jeden, tzn gdy kliknę strzałkę w prawo, to on cały czas przesuwa się w prawo, i wraca i przez to miga zamiast być na stałe i po puszczeniu klawisza on znowu wraca na jeden, jeden. Ta ramka jest dobrze dopasowywana, bo gdy  w miejscu :

//polozenie czerwoneo prostokata po zwolnieniu klawisza
line(screen,litp[nrlit],liczp[nrlicz],litk[nrlit],liczp[nrlicz],makecol(255,0,0)); // poziom gorny
line(screen,litp[nrlit],liczk[nrlicz],litk[nrlit],liczk[nrlicz],makecol(255,0,0)); // poziom doly
line(screen,litp[nrlit],liczp[nrlicz],litp[nrlit],liczk[nrlicz],makecol(255,0,0)); // pion lewy
line(screen,litk[nrlit],liczp[nrlicz],litk[nrlit],liczk[nrlicz],makecol(255,0,0)); // pion prawy   

gdy dałem w tablicy zamiast "nrlit" po prostu "2" i zamiast "nrlicz" też po prostu 2 to ramka była dobrze na B2 tylko wtedy do niej ciągle wraca. I jeszcze co dziwne, gdy ustalam nrlit i nrlicz na 2 (tuż przed pętlą while) to on mimo wszystko ma ciągle zaznaczony A1. Nie mam pojęcia dla czego tak się dzieje. To jest dziwne, no bo gdy ręcznie wpisałem 2 (jak powiedziałem przed chwilą) to zaznaczało dobrze a gdy wpisałem 2 do nrlit i nrlicz to już nie działa dobrze czyli zaznacza A1 i ciągle wraca. Jeśli wiecie co robić, wspomóżcie. Pozdrawiam

 
P-11474
DejaVu
» 2009-11-10 20:27:17
Źle masz napisane warunki...
C/C++
if( nrlicz > 1 )
{
    ( key[ KEY_UP ] );
    //...
Powinno być:
C/C++
if( nrlicz > 1 && key[ KEY_UP ] )
{
    //...
P-11475
McAffey
Temat założony przez niniejszego użytkownika
» 2009-11-11 12:28:50
Po pierwsze, takie postawienie sprawy, jak ja postawiłem (czyli : [CODE] if(nrlicz>1)
    {
      (key[KEY_UP]);  [/code]
jest poprawne, gdyż już wielokrotnie je stosowałem. Po drugie po wprowadzenie tego co mówisz się cały program rozchrzania, ale nie chcę teraz wgłębiać dlaczego tak się dzieje, gdyż to co podałeś nie ma żadnego związku z problemem który przedstawiłem w pierwszym poście. Wrzuć sobie ten kod i skompiluj to zobaczysz o co mi chodzi, i zobaczysz, że nawet jeśli miałeś w tym, że trzeba użyć logicznego "&&"rację, to by znaczyło, tylko, że program nie dowiaduje się, że teraz nrlit lub nrlicz się zwiększa, a problem jest nawet, gdy ja w kodzie zmienię nrlit i nrlicz na 2
( tuż nad pętlą while są dwie linijki - nrlit=1; nrlicz=1; i tam zmieniam) a on ciągle zaznacza okienko A1 jakby było nrlit i nrlicz 1. Jeśli nadal nie rozumiesz mojego problemu, to powiedz, a postaram się jeszcze jaśniej go przedstawić. Jeśli ktoś inny ma jeszcze jakieś pomysły to proszę o pomoc. Za fatygę dzięki. Pozdrawiam
P-11490
malan
» 2009-11-11 12:50:20
gdyż to co podałeś nie ma żadnego związku z problemem który przedstawiłem w pierwszym poście
 ... skoro nie ma to czemu to działa:

C/C++
if( nrlit > 1 && key[ KEY_LEFT ] )
{
    line( screen, litp[ nrlitstary ], liczp[ nrliczstary ], litk[ nrlitstary ], liczp[ nrliczstary ], makecol( 0, 0, 0 ) ); // poziom gorny
    line( screen, litp[ nrlitstary ], liczk[ nrliczstary ], litk[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // poziom doly
    line( screen, litp[ nrlitstary ], liczp[ nrliczstary ], litp[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // pion lewy
    line( screen, litk[ nrlitstary ], liczp[ nrliczstary ], litk[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // pion prawy     
    nrlit--;
}

if( nrlit < 2 && key[ KEY_RIGHT ] )
{
    line( screen, litp[ nrlitstary ], liczp[ nrliczstary ], litk[ nrlitstary ], liczp[ nrliczstary ], makecol( 0, 0, 0 ) ); // poziom gorny
    line( screen, litp[ nrlitstary ], liczk[ nrliczstary ], litk[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // poziom doly
    line( screen, litp[ nrlitstary ], liczp[ nrliczstary ], litp[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // pion lewy
    line( screen, litk[ nrlitstary ], liczp[ nrliczstary ], litk[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // pion prawy
    nrlit++;
}

if( nrlicz > 1 && key[ KEY_UP ] )
{
    line( screen, litp[ nrlitstary ], liczp[ nrliczstary ], litk[ nrlitstary ], liczp[ nrliczstary ], makecol( 0, 0, 0 ) ); // poziom gorny
    line( screen, litp[ nrlitstary ], liczk[ nrliczstary ], litk[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // poziom doly
    line( screen, litp[ nrlitstary ], liczp[ nrliczstary ], litp[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // pion lewy
    line( screen, litk[ nrlitstary ], liczp[ nrliczstary ], litk[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // pion prawy 
    nrlicz--;
}

if( nrlicz < 2 && key[ KEY_DOWN ] )
{
    line( screen, litp[ nrlitstary ], liczp[ nrliczstary ], litk[ nrlitstary ], liczp[ nrliczstary ], makecol( 0, 0, 0 ) ); // poziom gorny
    line( screen, litp[ nrlitstary ], liczk[ nrliczstary ], litk[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // poziom doly
    line( screen, litp[ nrlitstary ], liczp[ nrliczstary ], litp[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // pion lewy
    line( screen, litk[ nrlitstary ], liczp[ nrliczstary ], litk[ nrlitstary ], liczk[ nrliczstary ], makecol( 0, 0, 0 ) ); // pion prawy 
    nrlicz++;
}
P-11491
McAffey
Temat założony przez niniejszego użytkownika
» 2009-11-11 13:53:04
Dobra, program jako program działa, ale wciąż czerwona ramka mi się wraca na pozycję A1 a nie powinna. I męczyłem się już nad tym dość długo, pokazałem to osobie, która uczy programowania, i ona też nie umiała po dłuższym czasie temu zaradzić, dlatego, postanowiłem to pokazać tutaj, bo uznałem, że to chyba ostatnia deska ratunku. Proszę o pomoc. Pozdrawiam
P-11498
malan
» 2009-11-11 14:34:54
Nie rozumiem, gdzie Ty nadal masz błąd ? ;>.

Zamiast Twoich 'if-ów' wkleiłem te powyżej, skompilowałem to w Dev-C++ i działa poprawnie:
Po uruchomieniu programu czerwona ramka jest na A1.
1. Wciskam KEY_RIGHT czerwona ramka jest w B1.
2. Wciskam KEY_DOWN czerwona ramka jest w B2.
3. Wciskam KEY_LEFT czerwona ramka jest w A2.
4. Wciskam KEY_UP czerwona ramka jest w A1.

Ramka w żadnym przypadku się nie 'cofa'.

Chyba że nie tak to ma działać ?
P-11500
McAffey
Temat założony przez niniejszego użytkownika
» 2009-11-11 15:07:47
Dzięki już działa ;) Nie wiem czemu, ale gdy pierwszy raz tak zrobiłem, to się zrobiło coś takiego, że gdy naciskałem jakikolwiek klawisz to na ekranie się pojawiała masa linii niepotrzebnych, tak, że po kilku wciśnięciach już prawie nic nie było widać. Jeszcze raz wielkie dzięki ;)
P-11503
« 1 »
  Strona 1 z 1