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
-
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. -
Wyświetlenie ciałka
to analogicznie do punktu 1 można zrobić tylko w którym miejscu funkcji głównej wstawić wyświetlanie? -
zderzenie się z ogonem
-
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