unit Pacgame;
{$o+}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ExtCtrls;
type
TForm2 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
Timer1: TTimer;
Timer2: TTimer;
Timer3: TTimer;
procedure N2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
i,o:integer;
a:array [0..20,0..20]of char;
move,move1:byte;
points:integer;
pac,e1,e2,e3,e4:tpoint;
j:integer;
way:tpoint;
q:array[0..10000]of tpoint;
head,tail:integer;
z:array[0..20,0..20]of integer;
implementation
uses Main;
{$R *.dfm}
procedure draw;
begin
with form2.Canvas do
begin
brush.Color:=clblue;
pen.Color:=clblue;
rectangle(0,0,420,420);
for i := 0 to 20 do
for o := 0 to 20 do
if a[i,o]<>'1' then
begin
brush.Color:=clblack;
pen.Color:=clblack;
rectangle(i*20,o*20,i*20+20,o*20+20);
if a[i,o]='8' then
begin
brush.Color:=clyellow;
ellipse(i*20+6,o*20+6,i*20-6+20,o*20-6+20)end
else
if a[i,o]='9' then
begin
brush.Color:=clyellow;
ellipse(i*20+4,o*20+4,i*20-4+20,o*20-4+20)
end;
end;
end;
end;
procedure initmovement;
begin
reset(input,'pacmanmap.map');
for I := 0 to 20 do
begin
for o := 0 to 20 do
read(a[o,i]);
readln;
end;
end;
procedure check;
begin
for I := 0 to 20 do
for o := 0 to 20 do
if a[i,o]='8' then
inc(points)
else
if a[i,o]='9' then
inc(points);
form2.Caption:=inttostr(points);
end;
procedure nulling;
begin
pac.x:=10;
pac.y:=15;
e1.x:=10;
e1.Y:=7;
e2.X:=10;
e2.Y:=9;
e3.X:=9;
e3.Y:=9;
e4.X:=11;
e4.Y:=9;
initmovement;
draw;
form2.canvas.Brush.color:=clyellow;
form2.Canvas.Ellipse(pac.x*20,pac.Y*20,pac.X*20+20,pac.y*20+20);
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
nulling;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
form1.Show;
end;
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case key of
vk_up:
begin
move1:=1;
end;
vk_down:
begin
move1:=2;
end;
vk_left:
begin
move1:=3;
end;
vk_right:
begin
move1:=4;
end;
end;
draw;
form2.canvas.Brush.color:=clyellow;
form2.Canvas.Ellipse(pac.X*20,pac.y*20,pac.x*20+20,pac.y*20+20);
end;
procedure TForm2.FormShow(Sender: TObject);
begin
move:=0;
nulling;
initmovement;
draw;
end;
procedure TForm2.N1Click(Sender: TObject);
begin
form2.hide;
form1.show;
form1.Button1.Show;
form1.Label1.Show;
end;
procedure TForm2.N2Click(Sender: TObject);
begin
form2.close;
form1.close;
end;
procedure push(x:tpoint);
begin
inc(tail);
q[tail]:=x;
end;
function pop:tpoint;
begin
pop:=q[head];
inc(head);
end;
function top:Boolean;
begin
if tail<head then
top:=true
else
top:=false;
end;
procedure queue(x:integer);
begin
for I := head to tail do
begin
if x<z[q[i].X,q[i].y] then
z[q[i].X,q[i].y]:=x;
end;
end;
procedure pushneighbours;
var
d:integer;
temp,temp1:tpoint;
begin
if top then
begin
d:=tail;
for i:= head to tail do
begin
temp:=pop;
temp1.X:=temp.X-1;
temp1.y:=temp.Y;
if z[temp1.X,temp1.y]<>-1 then
push(temp1);
temp1.X:=temp.X+1;
temp1.y:=temp.Y;
if z[temp1.X,temp1.y]<>-1 then
push(temp1);
temp1.X:=temp.X;
temp1.y:=temp.Y-1;
if z[temp1.X,temp1.y]<>-1 then
push(temp1);
temp1.X:=temp.X;
temp1.y:=temp.Y+1;
if z[temp1.X,temp1.y]<>-1 then
push(temp1);
end;
end;
end;
function getway(x:tpoint):tpoint;
var
tmp:integer;
temp:tpoint;
begin
tmp:=z[x.X,x.y];
temp:=x;
repeat
dec(tmp);
if z[temp.X-1,temp.y]=tmp then
begin
tmp:=z[temp.X-1,temp.y];
getway.x:=temp.X-1;
getway.Y:=temp.Y;
temp.x:=temp.X-1;
temp.Y:=temp.Y;
end;
if z[temp.X+1,temp.y]=tmp then
begin
tmp:=z[temp.X+1,temp.y];
getway:=temp;
getway.x:=temp.X+1;
getway.Y:=temp.Y;
temp.x:=temp.X+1;
temp.Y:=temp.Y;
end;
if z[temp.X,temp.y-1]=tmp then
begin
tmp:=z[temp.X,temp.y-1];
getway:=temp;
getway.x:=temp.X;
getway.Y:=temp.Y-1;
temp.x:=temp.X;
temp.Y:=temp.Y-1;
end;
if z[temp.X,temp.y+1]=tmp then
begin
tmp:=z[temp.X,temp.y+1];
getway:=temp;
getway.x:=temp.X;
getway.Y:=temp.Y+1;
temp.x:=temp.X;
temp.Y:=temp.Y+1;
end;
until z[temp.X,temp.y]=1;
end;
function path(x:tpoint; y:tpoint):tpoint;
var
current:integer;
begin
head:=1;
tail:=0;
current:=0;
for I := 0 to 20 do
for j := 0 to 20 do
begin
if a[i,j]='1' then
z[i,j]:=-1
else
z[i,j]:=500;
end;
z[y.X,y.Y]:=0;
repeat
inc(current);
pushneighbours;
queue(current);
until z[x.X,x.y]<>65000;
path:=getway(x);
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
form2.canvas.Brush.color:=clblack;
form2.Canvas.Ellipse(x*20,y*20,x*20+20,y*20+20);
case move1 of
1:
begin
if a[pac.x,pac.y-1]<>'1' then
move:=move1;
end;
2:
begin
if a[pac.x,pac.y+1]<>'1' then
begin
move:=move1;
end;
end;
3:
begin
if a[pac.x-1,pac.y]<>'1' then
move:=move1;
end;
4:
begin
if a[pac.x+1,pac.y]<>'1' then
move:=move1;
end;
end;
case move of
1:
begin
if a[pac.x,pac.y-1]<>'1' then
dec(pac.y);
a[pac.x,pac.y]:='0';
end;
2:
begin
if a[pac.x,pac.y+1]<>'1' then
begin
inc(pac.y);
a[pac.x,pac.y]:='0';
end;
end;
3:
begin
if a[pac.x-1,pac.y]<>'1' then
dec(pac.x);
if pac.x=-1 then
pac.x:=20;
a[pac.x,pac.y]:='0';
end;
4:
begin
if a[pac.x+1,pac.y]<>'1' then
inc(pac.x);
if pac.x=21 then
pac.x:=0;
a[pac.x,pac.y]:='0';
end;
end;
points:=0;
check;
// e1.x:=path(pac,e1).x;
// e1.Y:=path(pac,e1).Y;
if points=0 then
begin
form2.hide;
initmovement;
showmessage('You win!!!');
end;
form2.canvas.Brush.color:=clyellow;
form2.Canvas.Ellipse(pac.x*20,pac.y*20,pac.x*20+20,pac.y*20+20);
form2.canvas.Brush.color:=clred;
form2.Canvas.Ellipse(e1.x*20,e1.y*20,e1.X*20+20,e1.Y*20+20);
form2.canvas.Brush.color:=clblue;
form2.Canvas.Ellipse(e2.X*20,e2.Y*20,e2.X*20+20,e2.Y*20+20);
form2.canvas.Brush.color:=clteal;
form2.Canvas.Ellipse(e3.x*20,e3.y*20,e3.X*20+20,e3.y*20+20);
form2.canvas.Brush.color:=clgreen;
form2.Canvas.Ellipse(e4.X*20,e4.Y*20,e4.X*20+20,e4.Y*20+20);
end;
procedure drawenemy;
begin
form2.canvas.Brush.color:=clyellow;
form2.Canvas.Ellipse(pac.x*20,pac.y*20,pac.x*20+20,pac.y*20+20);
form2.canvas.Brush.color:=clred;
form2.Canvas.Ellipse(e1.x*20,e1.y*20,e1.X*20+20,e1.Y*20+20);
form2.canvas.Brush.color:=clgreen;
form2.Canvas.Ellipse(e2.X*20,e2.Y*20,e2.X*20+20,e2.Y*20+20);
form2.canvas.Brush.color:=clteal;
form2.Canvas.Ellipse(e3.x*20,e3.y*20,e3.X*20+20,e3.y*20+20);
form2.canvas.Brush.color:=clpurple;
form2.Canvas.Ellipse(e4.X*20,e4.Y*20,e4.X*20+20,e4.Y*20+20);
end;
procedure TForm2.Timer2Timer(Sender: TObject);
begin
draw;
drawenemy;
end;
end.