program pacmangame; uses wincrt, graph; type square = record x1:integer; x2:integer; y1:integer; y2:integer; centerX:integer; centerY:integer; isitwall:boolean; istherefruit:boolean; end; hero = record posX:integer; posY:integer; end; var driver, mode: smallint; pile:array[1..21,1..19] of square; pacman:hero; key,previouskey:char; pacX,pacY:integer; procedure initialize(); var i,j:integer; begin setcolor(black); for i:=1 to 21 do begin for j:=1 to 19 do begin pile[i][j].x1:=110+((j-1)*24); pile[i][j].x2:=132+((j-1)*24); pile[i][j].y1:=20+((i-1)*24); pile[i][j].y2:=42+((i-1)*24); pile[i][j].centerX:=(pile[i][j].x1+pile[i][j].x2) div 2; pile[i][j].centerY:=(pile[i][j].y1+pile[i][j].y2) div 2; if (i=1) then pile[i,j].isitwall:=true; {21 lines of marking walls} if (i=2) and ((j=1) or (j=10) or (j=19)) then pile[i,j].isitwall:=true; if (i=3) and ((j=1) or (j=3) or (j=4) or (j=6) or(j=7) or (j=8) or (j=10) or (j=12) or (j=13) or (j=14) or (j=16) or (j=17) or (j=19)) then pile[i,j].isitwall:=true; if (i=4) and ((j=1) or (j=19)) then pile[i,j].isitwall:=true; if (i=5) and ((j=1) or (j=3) or (j=4) or (j=6) or (j=8) or (j=9) or (j=10) or (j=11) or (j=12) or (j=14) or (j=16) or (j=17) or (j=19)) then pile[i,j].isitwall:=true; if (i=6) and ((j=1) or (j=6) or (j=10) or (j=14) or (j=19)) then pile[i,j].isitwall:=true; if (i=7) and((j=1) or (j=2) or(j=3) or (j=4) or (j=6) or(j=7) or (j=8) or (j=10) or (j=12) or (j=13) or (j=14) or (j=16) or (j=17) or (j=18) or (j=19)) then pile[i,j].isitwall:=true; if (i=8) and ((j=1) or(j=2) or (j=3) or (j=4) or (j=6) or (j=14) or (j=16) or (j=17) or (j=18) or (j=19)) then pile[i,j].isitwall:=true; if (i=9) and ((j=1) or (j=2) or (j=3) or (j=4) or (j=6) or (j=8) or (j=9) or (j=10) or (j=11) or (j=12) or (j=14) or (j=16) or (j=17) or (j=18) or (j=19)) then pile[i,j].isitwall:=true; if (i=10) and ((j=8) or (j=9) or (j=10) or (j=11) or (j=12)) then pile[i,j].isitwall:=true; if (i=11) and ((j=1) or (j=2) or (j=3) or (j=4) or (j=6) or (j=8) or (j=9) or (j=10) or (j=11) or (j=12) or (j=14) or (j=16) or (j=17) or (j=18) or (j=19)) then pile[i,j].isitwall:=true; if (i=12) and ((j=1) or (j=2) or (j=3) or (j=4) or (j=6) or (j=14) or (j=16) or (j=17) or (j=18) or (j=19)) then pile[i,j].isitwall:=true; if (i=13) and ((j=1) or (j=2) or (j=3) or (j=4) or (j=6) or (j=8) or (j=9) or (j=10) or (j=11) or (j=12) or (j=14) or (j=16) or (j=17) or (j=18) or (j=19)) then pile[i,j].isitwall:=true; if (i=14) and ((j=1) or (j=10) or (j=19)) then pile[i,j].isitwall:=true; if (i=15) and ((j=1) or (j=3) or (j=4) or (j=6) or (j=7) or (j=8) or (j=10) or (j=12) or (j=13) or (j=14) or (j=16) or (j=17) or (j=19)) then pile[i,j].isitwall:=true; if (i=16) and ((j=1) or (j=4) or (j=16) or (j=19)) then pile[i,j].isitwall:=true; if (i=17) and ((j=1) or (j=2) or (j=4) or (j=6) or (j=8) or (j=9) or (j=10) or (j=11) or (j=12) or (j=14) or (j=16) or (j=18) or (j=19)) then pile[i,j].isitwall:=true; if (i=18) and ((j=1) or (j=6) or (j=10) or (j=14) or (j=19)) then pile[i][j].isitwall:=true; if (i=19) and ((j=1) or (j=3) or (j=4) or (j=5) or (j=6) or (j=7) or (j=8) or (j=10) or (j=12) or (j=13) or (j=14) or (j=15) or (j=16) or (j=17) or (j=19)) then pile[i,j].isitwall:=true; if (i=20) and ((j=1) or (j=19)) then pile[i,j].isitwall:=true; if (i=21) then pile[i,j].isitwall:=true; end; end; begin for i:=1 to 21 do //rysuje plansze begin for j:=1 to 19 do begin setfillstyle(11,5); if pile[i][j].isitwall=true then bar(pile[i][j].x1,pile[i][j].y1,pile[i][j].x2,pile[i][j].y2); end; end; end; pacX:=10; pacY:=16; pacman.posX:=pile[pacY][pacX].centerX; // poczatkowe parametry pacmana pacman.posY:=pile[pacY][pacX].centerY; setfillstyle(solidfill,yellow); fillellipse(pacman.posX,pacman.posY,9,9); end; function readInput():char; begin previouskey:=key; if keypressed then key:=readkey; begin if key=#0 then key:=readkey; case key of chr(75): begin if pile[pacY][pacX-1].isitwall=false then begin readInput:='a'; pacX:=pacX-1; end; end; chr(77): begin if pile[pacY][pacX+1].isitwall=false then begin readInput:='d'; pacX:=pacX+1; end; end; chr(72): begin if pile[pacY-1][pacX].isitwall=false then begin readInput:='w'; pacY:=pacY-1; end; end; chr(80): begin if pile[pacY+1][pacX].isitwall=false then begin readInput:='s'; pacY:=pacY+1; end; end; end; writeln(pacX,' ',pacY); end; end; procedure draw(); begin setfillstyle(solidfill,yellow); fillellipse(pacman.posX,pacman.posY,11,11); end; procedure del(); begin setfillstyle(solidfill,black); fillellipse(pacman.posX,pacman.posY,11,11); end; procedure animation(); var licznik:integer; pac:char; begin licznik:=0; pac:=readInput(); repeat case pac of //ruchy pacmana 'a': pacman.posX:=pacman.posX-3; 'd': pacman.posX:=pacman.posX+3; 'w': pacman.posY:=pacman.posY-3; 's': pacman.posY:=pacman.posY+3; end; draw(); delay(20); del(); licznik:=licznik+1; until licznik=8; end; begin driver:=detect; mode:=detect; InitGraph(driver,mode,''); initialize(); repeat animation(); until pacman.posX=444 ; readkey; closegraph; end.