Pac-Snack
pascal吧
全部回复
仅看楼主
level 8
徐一凡_exe 楼主
潜水好久了。
本来这个小游戏想自己写好自己玩,现在还是觉得发出来好
2017年12月10日 13点12分 1
level 8
徐一凡_exe 楼主
uses
crt,dos;
const
Mapsize=63;
Killingmobs_=trunc(sqrt(mapsize));
Mapnil=false;
Walls_=trunc(sqrt(sqr(mapsize)*mapsize*2.75));
type
mapbit=(nothing,killingmob,wall,snackhead,snackbody,food);
snackbit=(head,body);
facing=(stop,up,left,down,right);
site=record
x,y:longint;
end;
var
map:array[0..mapsize+1,0..mapsize+1]of mapbit;//游戏的地形
snack:array[1..mapsize*mapsize]of record//游戏的蛇的各个部位,snack[1]表示头部
x,y:longint;
go:facing;
end;
killingmobs:array[1..trunc(sqrt(mapsize))] of site;
snacklen:longint;//蛇的长度
died:boolean;
strng:string;
temp1,temp2,i,j:longint;//各种变量
s,s2:string;
procedure randomset(thing:mapbit;var backx,backy:longint);//在随机位置放置东西
var
x,y:longint;
begin
x:=random(mapsize)+1;
y:=random(mapsize)+1;
while map[x,y]<>nothing do begin
x:=random(mapsize)+1;
y:=random(mapsize)+1;
end;
map[x,y]:=thing;
backx:=x;
backy:=y;
end;
procedure setbit(thing:mapbit;x,y:longint);//放东西
begin
map[x,y]:=thing;
gotoxy(y*2-1,x);
case thing of
nothing:write(' ');
killingmob:write('╳');
wall:write('▓');
snackhead:write('╬');
food:write('┼');
end;
gotoxy(mapsize*2+1,mapsize+1);
end;
procedure writexy(s:string;x,y:longint);
begin
gotoxy(y*2-1,x);
writeln(s);
gotoxy(mapsize*2+3,mapsize+1);
end;
procedure writemapfirst;//第一次绘制地形
var
i,j:longint;
begin
clrscr;
for i:=1 to mapsize do begin
for j:=1 to mapsize do begin
delay(1);
case map[i,j] of
nothing:write(' ');
killingmob:write('╳');
wall:write('▓');
snackhead:write('╬');
food:write('┼');
end;
end;
if i<mapsize then writeln;
end;
end;
2017年12月10日 13点12分 2
level 8
徐一凡_exe 楼主
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
level 8
徐一凡_exe 楼主
根据自己的屏幕分辨率调节Const下Mapsize常量的值,一般43足矣。楼主的电脑是联想的顶配游戏本,所以我一般设置的是66*66.
2017年12月10日 13点12分 5
level 8
徐一凡_exe 楼主
方向键移动,Q自杀,Enter快进(其实就是敌人加速)。
玩家不移动,敌对生物也不移动。
叉叉是敌对生物,十字是事物,吃十字来变长。
2017年12月10日 13点12分 6
level 8
徐一凡_exe 楼主
2017年12月10日 13点12分 7
level 8
徐一凡_exe 楼主
╳是敌对生物。
╬是蛇的头。
┼是食物。
2017年12月10日 13点12分 8
level 8
徐一凡_exe 楼主
代码很烂,望吧友指教。
2017年12月10日 13点12分 9
level 8
加强版贪吃蛇???[滑稽]
2017年12月14日 05点12分 10
不,这是player在海底遗迹中,躲避守卫者的追杀,收集金块的故事[滑稽]
2017年12月14日 09点12分
@徐一凡_exe 又一个狂热的Mcer[滑稽]
2017年12月15日 14点12分
不过字符界面还原度蛮高的[滑稽]
2017年12月15日 14点12分
1