procedure tick;//游戏运行一刻
var
c:char;
i:longint;
max,j:facing;
howfar:array[facing]of real;
begin
c:=readkey;
if c=#0 then
case readkey of
#72:c:='w';
#77:c:='d';
#80:c:='s';
#75:c:='a';
end;
case c of//蛇的移动
'w','W','i','I':
case map[snack[1].x-1,snack[1].y] of
nothing:begin
setbit(snackhead,snack[1].x-1,snack[1].y);
setbit(nothing,snack[snacklen].x,snack[snacklen].y);
for i:=snacklen downto 2 do snack[i]:=snack[i-1];
dec(snack[1].x);
snack[1].go:=up;
if snacklen>1 then begin
map[snack[2].x,snack[2].y]:=snackbody;
case snack[2].go of
up,stop:writexy('║',snack[2].x,snack[2].y);
left:writexy('╚',snack[2].x,snack[2].y);
right:writexy('╝',snack[2].x,snack[2].y);
end;
end;
end;
food:begin
setbit(snackhead,snack[1].x-1,snack[1].y);
inc(snacklen);
for i:=snacklen downto 2 do snack[i]:=snack[i-1];
dec(snack[1].x);
randomset(food,temp1,temp2);
setbit(food,temp1,temp2);
snack[1].go:=up;
if snacklen>1 then begin
map[snack[2].x,snack[2].y]:=snackbody;
case snack[2].go of
up,stop:writexy('║',snack[2].x,snack[2].y);
left:writexy('╚',snack[2].x,snack[2].y);
right:writexy('╝',snack[2].x,snack[2].y);
end;
end;
end;
else exit;
end;
'a','A','j','J':
case map[snack[1].x,snack[1].y-1] of
nothing:begin
setbit(snackhead,snack[1].x,snack[1].y-1);
setbit(nothing,snack[snacklen].x,snack[snacklen].y);
for i:=snacklen downto 2 do snack[i]:=snack[i-1];
dec(snack[1].y);
snack[1].go:=left;
if snacklen>1 then begin
map[snack[2].x,snack[2].y]:=snackbody;
case snack[2].go of
left,stop:writexy('═',snack[2].x,snack[2].y);
up:writexy('╗',snack[2].x,snack[2].y);
down:writexy('╝',snack[2].x,snack[2].y);
end;
end;
end;
food:begin
setbit(snackhead,snack[1].x,snack[1].y-1);
inc(snacklen);
for i:=snacklen downto 2 do snack[i]:=snack[i-1];
dec(snack[1].y);
randomset(food,temp1,temp2);
setbit(food,temp1,temp2);
snack[1].go:=left;
if snacklen>1 then begin
map[snack[2].x,snack[2].y]:=snackbody;
case snack[2].go of
left,stop:writexy('═',snack[2].x,snack[2].y);
up:writexy('╗',snack[2].x,snack[2].y);
down:writexy('╝',snack[2].x,snack[2].y);
end;
end;
end;
else exit;
end;
's','S','k','K':
case map[snack[1].x+1,snack[1].y] of
nothing:begin
setbit(snackhead,snack[1].x+1,snack[1].y);
setbit(nothing,snack[snacklen].x,snack[snacklen].y);
for i:=snacklen downto 2 do snack[i]:=snack[i-1];
inc(snack[1].x);
snack[1].go:=down;
if snacklen>1 then begin
map[snack[2].x,snack[2].y]:=snackbody;
case snack[2].go of
down,stop:writexy('║',snack[2].x,snack[2].y);
left:writexy('╔',snack[2].x,snack[2].y);
right:writexy('╗',snack[2].x,snack[2].y);
end;
end;
end;//┘┌┐└ ─ ┼│
food:begin
setbit(snackhead,snack[1].x+1,snack[1].y);
inc(snacklen);
for i:=snacklen downto 2 do snack[i]:=snack[i-1];
inc(snack[1].x);
randomset(food,temp1,temp2);
setbit(food,temp1,temp2);
snack[1].go:=down;
if snacklen>1 then begin
map[snack[2].x,snack[2].y]:=snackbody;
case snack[2].go of
down,stop:writexy('║',snack[2].x,snack[2].y);
left:writexy('╔',snack[2].x,snack[2].y);
right:writexy('╗',snack[2].x,snack[2].y);
end;
end;
end;
else exit;
end;
'd','D','l','L':
case map[snack[1].x,snack[1].y+1] of
nothing:begin
setbit(snackhead,snack[1].x,snack[1].y+1);
setbit(nothing,snack[snacklen].x,snack[snacklen].y);
for i:=snacklen downto 2 do snack[i]:=snack[i-1];
inc(snack[1].y);
snack[1].go:=right;
if snacklen>1 then begin
map[snack[2].x,snack[2].y]:=snackbody;
case snack[2].go of
right,stop:writexy('═',snack[2].x,snack[2].y);
up:writexy('╔',snack[2].x,snack[2].y);
down:writexy('╚',snack[2].x,snack[2].y);
end;
end;
end;
food:begin
setbit(snackhead,snack[1].x,snack[1].y+1);
inc(snacklen);
for i:=snacklen downto 2 do snack[i]:=snack[i-1];
inc(snack[1].y);
randomset(food,temp1,temp2);
setbit(food,temp1,temp2);
snack[1].go:=right;
if snacklen>1 then begin
map[snack[2].x,snack[2].y]:=snackbody;
case snack[2].go of
right,stop:writexy('═',snack[2].x,snack[2].y);
up:writexy('╔',snack[2].x,snack[2].y);
down:writexy('╚',snack[2].x,snack[2].y);
end;
end;
end;
else exit;
end;
'q','Q':died:=true;
#13:;
else exit;
end;
for i:=1 to killingmobs_ do begin//敌对生物的移动
howfar[stop]:=sqrt(sqr(killingmobs[i].x-snack[1].x)+sqr(killingmobs[i].y-snack[1].y));
if not((map[killingmobs[i].x-1,killingmobs[i].y]=nothing)or(map[killingmobs[i].x-1,killingmobs[i].y]=snackhead))
then howfar[up]:=mapsize*mapsize
else howfar[up]:=sqrt(sqr(killingmobs[i].x-1-snack[1].x)+sqr(killingmobs[i].y-snack[1].y));
if not((map[killingmobs[i].x,killingmobs[i].y-1]=nothing)or(map[killingmobs[i].x,killingmobs[i].y-1]=snackhead))
then howfar[left]:=mapsize*mapsize
else howfar[left]:=sqrt(sqr(killingmobs[i].x-snack[1].x)+sqr(killingmobs[i].y-1-snack[1].y));
if not((map[killingmobs[i].x+1,killingmobs[i].y]=nothing)or(map[killingmobs[i].x+1,killingmobs[i].y]=snackhead))
then howfar[down]:=mapsize*mapsize
else howfar[down]:=sqrt(sqr(killingmobs[i].x+1-snack[1].x)+sqr(killingmobs[i].y-snack[1].y));
if not((map[killingmobs[i].x,killingmobs[i].y+1]=nothing)or(map[killingmobs[i].x,killingmobs[i].y+1]=snackhead))
then howfar[right]:=mapsize*mapsize
else howfar[right]:=sqrt(sqr(killingmobs[i].x-snack[1].x)+sqr(killingmobs[i].y+1-snack[1].y));
max:=stop;
for j:=up to right do
if howfar[j]<howfar[max] then max:=j;
case max of
up:begin
setbit(nothing,killingmobs[i].x,killingmobs[i].y);
dec(killingmobs[i].x);
setbit(killingmob,killingmobs[i].x,killingmobs[i].y);
end;
left:begin
setbit(nothing,killingmobs[i].x,killingmobs[i].y);
dec(killingmobs[i].y);
setbit(killingmob,killingmobs[i].x,killingmobs[i].y);
end;
down:begin
setbit(nothing,killingmobs[i].x,killingmobs[i].y);
inc(killingmobs[i].x);
setbit(killingmob,killingmobs[i].x,killingmobs[i].y);
end;
right:begin
setbit(nothing,killingmobs[i].x,killingmobs[i].y);
inc(killingmobs[i].y);
setbit(killingmob,killingmobs[i].x,killingmobs[i].y);
end;
end;
if (killingmobs[i].x=snack[1].x)and(killingmobs[i].y=snack[1].y) then begin
died:=true;
exit;
end;
end;
//如果蛇头四周没有空余,则死
if (map[snack[1].x-1,snack[1].y]<>nothing)and(map[snack[1].x-1,snack[1].y]<>food)
and(map[snack[1].x+1,snack[1].y]<>nothing)and(map[snack[1].x+1,snack[1].y]<>food)
and(map[snack[1].x,snack[1].y-1]<>nothing)and(map[snack[1].x,snack[1].y-1]<>food)
and(map[snack[1].x,snack[1].y+1]<>nothing)and(map[snack[1].x,snack[1].y+1]<>food) then begin
died:=true;
exit;
end;
gotoxy(mapsize*2+3,mapsize+1);
end;
begin
cursoroff;
str(mapsize*2,s);
str(mapsize,s2);
exec('cmd','/c mode con:cols='+s+' lines='+s2);
window(1,1,mapsize*2,mapsize);
exec('cmd','/c title Pac-Snack');
randomize;
while true do begin
textbackground(blue);
textcolor(cyan);
clrscr;
gotoxy(1,mapsize div 2);
writeln('Pac-Snack':mapsize+4);
writeln('Enter来进行游戏':mapsize+7);
gotoxy(mapsize ,mapsize+2);
strng:=readkey;
while pos(strng,chr(13)+chr(27))=0 do strng:=readkey;
if strng=#27 then exit;
for i:=1 to mapsize do
for j:=1 to mapsize do map[i,j]:=nothing;
writeln('生成地形中');
for i:=1 to mapsize do begin
map[0,i]:=wall;
map[mapsize+1,i]:=wall;
map[1,i]:=wall;
map[mapsize,i]:=wall;
map[i,0]:=wall;
map[i,mapsize+1]:=wall;
map[i,1]:=wall;
map[i,mapsize]:=wall;
end;
if not mapnil
then for i:=1 to Walls_ do randomset(wall,temp1,temp2)
else
for i:=1 to mapsize do
for j:=1 to mapsize do map[i,j]:=nothing;
map[mapsize div 2+1,mapsize div 2+1]:=snackhead;
snacklen:=1;
snack[1].x:=mapsize div 2+1;
snack[1].y:=mapsize div 2+1;
writeln('生成生物中');
for i:=1 to killingmobs_ do randomset(killingmob,killingmobs[i].x,killingmobs[i].y);
writeln('生成食物中');
for i:=1 to trunc(sqrt(mapsize))*3 do randomset(food,temp1,temp2);
writeln('选择蛇的位置中');
//snacklen:=1;
//randomset(snackhead,snack[snacklen].x,snack[snacklen].y);
snack[snacklen].go:=stop;
writemapfirst;
cursoroff;
for i:=1 to 10 do begin
delay(50);
writexy(' ',snack[1].x,snack[1].y);
delay(50);
writexy('╬',snack[1].x,snack[1].y);
end;
died:=false;
while not died do begin
delay(1);
tick;
end;
clrscr;
gotoxy(1,mapsize div 2);
writeln('你死了,长度 ':mapsize+6,snacklen);
gotoxy(mapsize,mapsize div 2);
strng:=readkey;
clrscr;
end;
end.
2017年12月10日 13点12分
3