Snake - lista dwukierunkowa

0

Witam
Problem pewnie znany już wielu i sam temat zniechęca. ;-)
Wiem jest dużo Snake-ów w sieci i na rożne sposoby zostało to rozwiązane
aczkolwiek nie zalazłem krzepiącej mnie odpowiedzi

  1. Mam problem z lista dwukierunkową, z dodawaniem ciała snake-owi
    a mianowicie kolejne elementy maja pobierać współrzędne głowy
    2 element głowy 3 element współrzędne 2 elementu itd.

  2. Wyświetlenie ciałka
    to analogicznie do punktu 1 można zrobić tylko w którym miejscu funkcji głównej wstawić wyświetlanie?

  3. zderzenie się z ogonem

  4. mój wąż się cofa tzn. idzie sobie w górę i po naciśnięciu klawisza w dół idzie w dół jak tego uniknąć ??

Program jest uruchamiany na dekoderze telewizyjnym i wyświetlany na telewizorze
oto główny kod:


void snejk_glowny (void)
{    
     int key, x_pocz, y_pocz, dx,dy, czas;
     int grzyb_x, grzyb_y, punkt, level;
     body *pocz, *koniec;
         
     punkt = 0;
     level = 0;
    
     poziomy(&level, &czas); //funkcja do wybierania poziomów trudności
     make_body(&pocz,&koniec);  //tworzy element listy
     
         x_pocz = 144;
         y_pocz = 90;
         dx = 0;
         dy = 12;
     
     pocz->list_x = x_pocz;
     pocz->list_y = y_pocz;
     
     gprim_put_bmp(0,0,tlo_sn);  //wyświetlenie tła planszy
     
     rys_grzyb(&grzyb_x,&grzyb_y);//wyświetlenie w losowym miejscu grzybka
     punkty(punkt, level); //zliczanie punktów
     gprim_refresh_screen(); //odświeżenie ekranu
     
     do
     {
        gprim_put_bmp(pocz->list_x, pocz->list_y,snejk); //wyświetlenie głowy węża
        ProcWait(czas);  //odpowiednik delay();
        gprim_put_bmp(koniec->list_x,koniec->list_y,zaslon);  //wyświetlenie bit mapki zasłaniającej głowę węża
        
        (pocz->list_x)+=dx;
        (pocz->list_y)+=dy;
        
        gprim_put_bmp(pocz->list_x,pocz->list_y,snejk); //wyświetlenie głowy przesuniętej
        gprim_refresh_screen();
        
        key = readkey(1); //czytanie przycisku z pilota
        if(key==MCU_KEY_EXIT)
         {
           konieczko(punkt, level); //funkcja wyświetlająca komunikat o końcu gry
         }
        else
             {
                /*-Sterowanie-*/
                  switch(key)
                   {
                     case MCU_KEY_UP: 
                                 dy = (-12);
                                 dx = 0;
                                 break;
                     case MCU_KEY_DOWN:
                                 dy = (+12);
                                 dx = 0;
                                 break;
                     case MCU_KEY_LEFT: 
                                 dx = (-16);
                                 dy = 0; 
                                 break;
                     case MCU_KEY_RIGHT: 
                                 dx = (+16);
                                 dy = 0;  
                                 break;
                   }
             }
               /*-Koniec sterowanie-*/ 
         
        /*-Punkty i grzybki-*/   
        if((grzyb_x == (pocz->list_x))&&(grzyb_y == (pocz->list_y)))
         {
           rys_grzyb (&grzyb_x, &grzyb_y);
           punkt = punkt+1;                            
           punkty(punkt, level);
           make_body(&pocz,&koniec); //tworzenie kolejnego elementu listy po zjedzeniu grzyba
           
         }
        /*-Koniec grzybków-*/
            
        /*-Warunek smierci na scianie-*/
        if((pocz->list_x>=592)||(pocz->list_x<=32)||(pocz->list_y<=18)||(pocz->list_y>=234))
         {
           konieczko(punkt, level);          
           break;
         }
        /*-Koniec części ściennej-*/
     }
     while (key != MCU_KEY_EXIT);
}


Funkcja tworząca listę

void make_body(pstr *pocz, pstr *koniec)
{
    body *nowy;
    *pocz = NULL;
    *koniec = NULL;

    nowy = (body*)malloc(sizeof(body));

    if (nowy==NULL)
        {
          Dbg(250,100,1,16,"Zabraklo pamieci!");
          Dbg(250,120,1,16,"Koniec!");
          exit(1);
        }

    if(*pocz == NULL) /*gdy nie ma listy*/
        {
            nowy->prev = NULL;
            nowy->next = NULL;
            *pocz = nowy;
            *koniec = nowy;
        }
    else
        {
            nowy->next = NULL;
            (*koniec)->next = nowy;
            nowy->prev = *koniec;
            *koniec = nowy;
        }
}

dodawanie kolejnych segmentów i wyświetlanie ich próbowałem zrobić w taki sposób
coś nie zadziałało
podpowiedzcie mi w którym miejscu w funkcji void snejk_glowny (void) to wywołać (jeśli jest poprawnie)

void wyswietl (lista *pocz)
{
        lista *pomoc;
        pomoc=pocz;
        while (pomoc != NULL)
        {
          gprim_put_bmp(pomoc->list_x,pomoc->list_y,zaslon);
          pomoc=pomoc->nast;
        }
        gprim_put_bmp(koniec->list_x,koniec->list_y,zaslon);
        //zasłanianie ostatniego elementu można dac w tym miejscu
}

void aktualizuj (lista *pocz)
{
        lista *pomoc;
        pomoc=pocz;
        while (pomoc != NULL)
        {
         (pomoc->nast->list_x) = (pomoc->list_x);
         (pomoc->nast->list_y) = (pomoc->list_y);
         pomoc=pomoc->nast;
         }
}

Niestety nie da się tego skompilować bez wszystkich bibliotek
Jakieś propozycje?? :-) ;-)

Jeśli ten temat narusza już waszą cierpliwość to proszę o skasowanie ;>
Pozdrawiam

0

Nie działa ;( przetestowałem na boxie ale nic z tego
i zachowuje sie jakoś dziwacznie
tak jakby zamiast na koniec dodawało na poczatek a zamiana biegunów nic nie daje :/

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