Maya214 Napisano Styczeń 23, 2014 Zgłoś Share Napisano Styczeń 23, 2014 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 More sharing options...
olesio Napisano Styczeń 23, 2014 Zgłoś Share Napisano Styczeń 23, 2014 Wstaw kod w odpowiednie znaczniki oraz go sformatuj, to ktoś spojrzy i coś doradzi. Pozdrawiam: olesio Link do komentarza Udostępnij na innych stronach More sharing options...
Maya214 Napisano Styczeń 23, 2014 Autor Zgłoś Share Napisano Styczeń 23, 2014 gotowe. Bardzo proszę o pomoc! Link do komentarza Udostępnij na innych stronach More sharing options...
Maya214 Napisano Styczeń 23, 2014 Autor Zgłoś Share Napisano Styczeń 23, 2014 Czy kompilator (dev-pascal) może być powodem, przez który wąż się rusza? Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.