Skocz do zawartości

wskaźniki w snake'u


Maya214

Polecane posty

Witam,

Bardzo proszę o pomoc, napisałam grę snake, przy użyciu biblioteki graph, samego węża zaimplementowałam w postaci listy dwukierunkowej. Program się kompiluje, jednak po uruchomieniu wąż się nie rusza, debugując wyskoczył mi błąd exitcode 216, przeglądam któryś raz wszystkie wskaźniki, jednak nie moge znależć błędu.

Będę wdzięczna za odpowiedź.

 

program snake;
uses
  Graph,Crt,WinCrt;
const
  LplanszaX=35;
  LplanszaY=35;
  PplanszaX=500;
  PplanszaY=400;
  {PRZESZKODY}
  LewyX1 = 10;	{lewy gorny rog planszy}
  LewyY1 = 10;
  PrawyX1 = 15;
  PrawyY1 = 11;
  PrawyX2 = 11;
  PrawyY2 = 15;
  LewyX3 = 42;	{prawy dolny rog planszy}
  LewyY3 = 28;
  PrawyX3 = 43;
  PrawyY3 = 33;
  LewyX4 = 38;
  LewyY4 = 32;
type
  owoc = record 	{punkty, ktore beda sie pojawiac na planszy}
wspolX:Integer;
wspolY:Integer;
kolor:Shortint;
  end;
  listPtr=^list;
  list = record   	{waz zaimplementowany w postaci listy, jeden element-jeden rekord}
next: listPtr;
prev: listPtr;
snakeX:Integer;
snakeY:Integer;
  end;
var
  ster,tryb:	Smallint;
  GameEnd:  	Boolean;
  WhereisHead:  listPtr;
  WhereisTail:  listPtr;
  Zjedzone: 	Integer;
  Zjedzonetxt:  String;
  sliwka :  	owoc;
  direction:	Char;
  key:            	Char;
  poprawny: 	Boolean;
  kolizjaOwoc:  Boolean;
  biten:     	Boolean;
  crashed:     	Boolean;
  JeszczeRaz:   Char;
  LABEL     	POCZATEK;
{ **************************************************}
PROCEDURE Plum_Snake(X:Integer;Y:Integer);
var
 glowa: listPtr;
begin
 glowa:=WhereisHead;
 while(glowa<>NIL) do
 begin
if ( (X=glowa^.snakeX) AND (Y=glowa^.snakeY) ) then
begin
 	kolizjaOwoc:=true;
 	break;
end
else
 	glowa:=glowa^.next;
 end;
end;
PROCEDURE checkFood(Zjedz:owoc);
begin
 kolizjaOwoc:=false;
 if (Zjedz.wspolY<=35) OR (Zjedz.wspolX<=35) then kolizjaowoc:=true; {poza plansza}
 if (Zjedz.wspolX>=100) AND (Zjedz.wspolX<=150) AND (Zjedz.wspolY>=100) AND (Zjedz.wspolY<=110) then
kolizjaOwoc:=true; {pierwsza czesc gornej przeszkody}
 if (Zjedz.wspolX>=100) AND (Zjedz.wspolX<=110) AND (Zjedz.wspolY>=100) AND (Zjedz.wspolY<=150) then
kolizjaOwoc:=true;  {druga czesc gornej przeszkody}
 if (Zjedz.wspolX>=425) AND (Zjedz.wspolX<=435) AND (Zjedz.wspolY>=285) AND (Zjedz.wspolY<=335) then
kolizjaOwoc:=true;   {pierwsza czesc dolnej przeszkody}
 if (Zjedz.wspolX>=385) AND (Zjedz.wspolX<=435) AND (Zjedz.wspolY>=325) AND (Zjedz.wspolY<=335) then
kolizjaOwoc:=true;  {druga czesc dolnej przeszkody}
end;
PROCEDURE wherePlum;
begin
 Repeat
sliwka.wspolY:=random(398);
sliwka.wspolX:=random(498);
checkFood(sliwka);
Plum_Snake(sliwka.wspolX,sliwka.wspolY);
 Until (kolizjaOwoc=false);
end;
PROCEDURE correctKey;
begin
 if ((key='w') OR (key='a') OR (key='s') OR (key='s') ) then poprawny:=true
 else
poprawny:=false;
 {kierunek przeciwny do ruchu}
 if ( (direction = 'w') AND (key='s') ) then poprawny:=false;
 if ( (direction = 's') AND (key='w') ) then poprawny:=false;
 if ( (direction = 'a') AND (key='d') ) then poprawny:=false;
 if ( (direction = 'd') AND (key='a') ) then poprawny:=false;
end;
PROCEDURE ReadInput;
begin
 key:=ReadKey;
{ if Keypressed do
 	key:=ReadKey;   }
correctKey;
if poprawny=true then
 	direction:=key;
end;
{ PROCEDURE move;
begin
 Read(key);
 if (poprawny=true) then
direction:=key;
end;  }
PROCEDURE where(var glowa:listPtr);
begin
{ glowa:=WhereisHead; }
 CASE ORD(direction) of
  	ord('w') :  begin
                	glowa^.snakeX:=glowa^.next^.snakeX;
                	glowa^.snakeY:=glowa^.next^.snakeY+12;
              	end;
  	ord('a') :  begin
                	glowa^.snakeX:=glowa^.next^.snakeX-12;
                	glowa^.snakeY:=glowa^.next^.snakeY;
              	end;
  	ord('s') :  begin
                	glowa^.snakeX:=glowa^.next^.snakeX;
                	glowa^.snakeY:=glowa^.next^.snakeY-12;
              	end;
  	ord('d') :  begin
                	glowa^.snakeX:=glowa^.next^.snakeX+12;
                	glowa^.snakeY:=glowa^.next^.snakeY;
              	end;
  	end;
end;
{PROCEDURE where(var glowa:listPtr);
begin
 glowa:=WhereisHead;
 if (direction='w') then
 begin
glowa^.snakeX:=glowa^.prev^.snakeX;
glowa^.snakeY:=glowa^.prev^.snakeY+12;
 end;
 if (direction='a') then
 begin
glowa^.snakeX:=glowa^.prev^.snakeX-12;
glowa^.snakeY:=glowa^.prev^.snakeY;
 end;
 if (direction='s') then
 begin
glowa^.snakeX:=glowa^.prev^.snakeX;
glowa^.snakeY:=glowa^.prev^.snakeY-12;
 end;
 if (direction='d') then
 begin
glowa^.snakeX:=glowa^.prev^.snakeX+12;
glowa^.snakeY:=glowa^.prev^.snakeY;
 end;
end;  }
PROCEDURE first;
var
  pierwszy: listPtr;
begin
 NEW(pierwszy);
 pierwszy^.next:=NIL;
 pierwszy^.prev:=NIL;
 pierwszy^.snakeX:=230;
 pierwszy^.snakeY:=180;
 WhereisHead:=pierwszy;
 WhereisTail:=pierwszy;
end;
PROCEDURE push;
var
  nowyElement: listPtr;
begin
 NEW(nowyElement);
 nowyElement^.prev:=NIL;
 nowyElement^.next:=WhereisHead;
 WhereisHead:=nowyElement;
 nowyElement^.snakeX:=nowyElement^.next^.snakeX-12;
 nowyElement^.snakeY:=nowyElement^.next^.snakeY;
end;
PROCEDURE pushHead;
var
 nowyElement: listPtr;
begin
 NEW(nowyElement);
 where(nowyElement);
 nowyElement^.prev:=NIL;
 nowyElement^.next:=WhereisHead;
 WhereisHead:=nowyElement;
end;
PROCEDURE show;
var
  aktualnyElement: listPtr;
begin
 aktualnyElement:=WhereisHead;
 While (aktualnyElement<>NIL) do
 begin
SetFillStyle(10,12);
SetColor(14);
FillEllipse(aktualnyElement^.snakeX,aktualnyElement^.snakeY,6,6);
aktualnyElement:=aktualnyElement^.next;
 end;
end;
{ PROCEDURE addHead;
var
  glowa,nowaGlowa:listPtr;
begin
 NEW(nowaGlowa);
 glowa:=WhereisHead;
 nowaGlowa:=glowa^.next;
 where(nowaGlowa);
 WhereisHead:=nowaGlowa;
 nowaGlowa^.next:=NIL;
 nowaGlowa^.prev:=glowa;
end;  }
PROCEDURE delTail;  {przesun weza, jesli nie zjadl owocu}
var
  ogon: listPtr;
begin
 ogon:=WhereisTail;

 WhereisTail:=ogon^.prev;
 ogon^.prev^.next:=NIL;
 DISPOSE(ogon);
end;
PROCEDURE biteSnake;
var
 glowa,drugiElement:listPtr;
begin
 biten:=false;
 glowa:=WhereisHead;
 drugiElement:=glowa^.next;
 while(drugiElement^.next<>NIL) do
 begin
if ((drugiElement^.snakeX=glowa^.snakeX) AND (drugiElement^.snakeY=glowa^.snakeY)) then
 	begin
   	biten:=true;
   	break;
 	end
else
drugiElement:=drugiElement^.next;
 end;
end;
PROCEDURE obstruction;
var
  glowa: listPtr;
begin
 glowa:=WhereisHead; 
 if (glowa^.snakeX>=100) AND (glowa^.snakeX<=150) AND (glowa^.snakeY>=100) AND (glowa^.snakeY<=110) then
crashed:=true; {pierwsza czesc gornej przeszkody}
 if (glowa^.snakeX>=100) AND (glowa^.snakeX<=110) AND (glowa^.snakeY>=100) AND (glowa^.snakeY<=150) then
crashed:=true;  {druga czesc gornej przeszkody}
 if (glowa^.snakeX>=425) AND (glowa^.snakeX<=435) AND (glowa^.snakeY>=285) AND (glowa^.snakeY<=335) then
crashed:=true;   {pierwsza czesc dolnej przeszkody}
 if (glowa^.snakeX>=385) AND (glowa^.snakeX<=435) AND (glowa^.snakeY>=325) AND (glowa^.snakeY<=335) then
crashed:=true;  {druga czesc dolnej przeszkody}
end;
PROCEDURE ifWalls;   {teleport}
var
 glowa:listPtr;
begin
 glowa:=WhereisHead;
 if (glowa^.snakeX=35) then glowa^.snakeX:=500;
 if (glowa^.snakeX=500) then glowa^.snakeX:=35;
 if (glowa^.snakeY=35) then glowa^.snakeY:=400;
 if (glowa^.snakeY=400) then glowa^.snakeY:=35;
end;
PROCEDURE SnakeCollision;
begin
 crashed:=false;
{trafil w siebie}
 biteSnake;
 if biten=true then GameEnd:=true;
{trafil w przeszkode} 
 obstruction;
 if (crashed=true) then GameEnd:=true;
{trafil w sciane}
 ifWalls;
end;
PROCEDURE Initialize;
var
 pierwszy: listPtr;
begin
 Zjedzone :=0;
 Str(Zjedzone,Zjedzonetxt);
 SetBkColor(3);	{plansza}
 SetColor(14);
 OutTextXY(35,420,'Zjedzone: ');
 OutTextXY(110,420,Zjedzonetxt);
 Rectangle(LplanszaX,LplanszaY,PplanszaX,PplanszaY); 
 SetColor(12);
 OutTextXY(205,25,'**** SNAKE ****');
 Zjedzone:=0;
 GameEnd:=false;
 SetFillStyle(4,12);
 Bar(10*LewyX1,10*LewyY1,10*PrawyX1,10*PrawyY1);  {rysuj przeszkody}
 Bar(10*LewyX1,10*LewyY1,10*PrawyX2,10*PrawyY2);
 Bar(10*LewyX3,10*LewyY3,10*PrawyX3,10*PrawyY3);
 Bar(10*LewyX4,10*LewyY4,10*PrawyX3,10*PrawyY3);
 Randomize;
 wherePlum;
 sliwka.kolor:=random(16);
 SetFillStyle(1,sliwka.kolor);
 SetColor(2);
 FillEllipse(sliwka.wspolX,sliwka.wspolY,5,3);
 first;
 pierwszy:=WhereisHead;
 SetFillStyle(10,12);
 SetColor(14);
 FillEllipse(pierwszy^.snakeX,pierwszy^.snakeY,6,6);
 push;
 push;
 push;
 push;
 show;
end;
PROCEDURE update;
var
 nowaGlowa: listPtr;
begin

 pushHead;
{czy owoc}
 nowaGlowa:=WhereisHead;
 if ( ( nowaGlowa^.snakeX=sliwka.wspolX ) AND (nowaGlowa^.snakeY=sliwka.wspolY) ) then
{zmien wspolrzedne sliwki, dodaj punkt}
 begin
wherePlum;
Zjedzone:=Zjedzone+10;
Str(Zjedzone,Zjedzonetxt);
 end
 else
delTail;
{czy kolizja}
 SnakeCollision;
end;
PROCEDURE draw;
begin          	{NARYSUJ WSZYSTKIE ELEMENTY I NAPISY(PUNKTY) }
 SetBkColor(3);	{plansza}
 SetColor(14);
 OutTextXY(35,420,'Zjedzone: ');
 OutTextXY(110,420,Zjedzonetxt);
 Rectangle(LplanszaX,LplanszaY,PplanszaX,PplanszaY); 
 SetColor(12);
 OutTextXY(205,25,'**** SNAKE ****');
 {rysuj sliwke}
 sliwka.kolor:=random(16);
 SetFillStyle(1,sliwka.kolor);
 SetColor(2);
 FillEllipse(sliwka.wspolX,sliwka.wspolY,5,5);
 {rysuj weza}
 show;
end;
{ glowny segment gry ******************** }
BEGIN
 POCZATEK:
 ster:=VGA;
 tryb:=VGAHi;
 InitGraph(ster,tryb,'C:\Users\maya\Desktop\snake');
 GameEnd:=false;
 Initialize;
 direction:='a';
 while (GameEnd=false) do
 begin
delay(2000);
ReadInput;
{ move;  }
update;
draw;
ClearDevice;
 end;
 SetColor(9);
 OutTextXY(200,200,'PRZEGRALES! KONIEC GRY!');
 Readln();
 CloseGraph;
 Writeln('Jesli chcesz zagrac ponownie, wcisniej Y!');
 Readln(JeszczeRaz);
 if JeszczeRaz='Y' then Goto POCZATEK;
 Readln();
END.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...