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.