感谢上外静中任淳同学提供
uses crt;
label
h; //h是重新开始游戏
const
y1=18;
y2=18; //p1,p2的纵坐标
var
x1,x2:byte; //p1,p2的横坐标
act:byte; //p2动作
sec,sec1:integer; //时间间隔
p,q:byte; //p1,p2的生命值
ek:byte; //用于增强p2防御力
c:char; //用于读取键盘敲击的键
m,e:char; //p1,p2的朝向(判断往哪里攻击)
i,j:byte; //循环变量
ys1,ys2:byte; //p1,p2的颜色
l,r:boolean; //l:p1是否胜利 r:p2是否胜利
f:boolean; //游戏是否结束
y,n:boolean; //判断玩家是否继续
procedure start;
begin
clrscr;
textcolor(lightmagenta);
writeln('Fighting Game');
textcolor(magenta);
writeln('a: left');
writeln('d: right');
writeln('j: attack');
writeln('space: pause');
textcolor(yellow);
writeln('You are p1.');
while not keypressed do x1:=10;
clrscr;
textcolor(lightgreen);
gotoxy(34,10);
write('ARE YOU READY? '); //倒计时
textcolor(lightred);
for i:=3 downto 1 do begin
write(i);
sound(100);
delay(1000);
write(#8);
nosound;
end;
clrscr;
textcolor(lightblue);
gotoxy(40,10);
write('GO!');
sound(1000);
delay(1000);
nosound;
clrscr;
end;
procedure life; //打印生命值
begin
p:=10;
q:=10;
gotoxy(11,1);
textcolor(ys1);
for i:=1 to p do write('+');
gotoxy(33,1);
write('p1');
textcolor(lightred);
write(' VS ');
textcolor(ys2);
write('p2');
gotoxy(61,1);
for i:=1 to q do write('+');
end;
procedure me; //打印p1
begin
textcolor(ys1);
gotoxy(x1,y1-1);
write('*');
gotoxy(x1,y1);
write('|');
gotoxy(x1,y1+1);
write('^');
end;
procedure enemy; //打印p2
begin
textcolor(ys2);
gotoxy(x2,y2-1);
write('*');
gotoxy(x2,y2);
write('|');
gotoxy(x2,y2+1);
write('^');
end;
procedure floor; //地板
begin
textbackground(green);
for i:=20 to 25 do
for j:=1 to 80 do begin
gotoxy(j,i);
write(' ');
end;
textbackground(black);
end;
procedure a; //p1向左
begin
if x1>1 then begin
gotoxy(x1,y1-1);
write(' ');
gotoxy(x1,y1);
write(' ');
gotoxy(x1,y1+1);
write(' ');
x1:=x1-1;
end;
m:='a';
me;
enemy;
end;
procedure d; //p1向右
begin
if x1<80 then begin
gotoxy(x1,y1-1);
write(' ');
gotoxy(x1,y1);
write(' ');
gotoxy(x1,y1+1);
write(' ');
x1:=x1+1;
end;
m:='d';
me;
enemy;
end;
procedure s; //p1攻击
begin
textcolor(ys1);
if (m='a') and (x1>1) then begin
gotoxy(x1-1,y1);
write('-');
if x1>=3 then begin
gotoxy(x1-2,y1);
write('(');
end;
if (x1-1=x2) or (x1-2=x2) then begin
ek:=ek+1;
if (q>0) and (ek=10) then begin
q:=q-1;
ek:=0;
end;
gotoxy(70-q,1);
write(' ');
textcolor(lightred);
gotoxy(x2,y2-1);
write('*');
gotoxy(x2,y2+1);
write('^');
delay(50);
end;
delay(50);
gotoxy(x1-1,y1);
write(' ');
if x1>=3 then begin
gotoxy(x1-2,y1);
write(' ');
end;
end
else if (x1<80) and (m='d') then begin
gotoxy(x1+1,y1);
write('-');
if x1<=78 then write(')');
if (x1+1=x2) or (x1+2=x2) then begin
ek:=ek+1;
if (q>0) and (ek=10) then begin
q:=q-1;
ek:=0;
end;
gotoxy(70-q,1);
write(' ');
textcolor(lightred);
gotoxy(x2,y2-1);
write('*');
gotoxy(x2,y2+1);
write('^');
delay(50);
end;
delay(50);
gotoxy(x1+1,y1);
write(' ');
if x1<=78 then begin
gotoxy(x1+2,y1);
write(' ');
end;
end;
if q=0 then begin
f:=false;
r:=false;
end;
me;
enemy;
end;
procedure je; //p2向左
begin
if x2>1 then begin
gotoxy(x2,y2-1);
write(' ');
gotoxy(x2,y2);
write(' ');
gotoxy(x2,y2+1);
write(' ');
x2:=x2-1;
end;
e:='j';
me;
enemy;
end;
procedure le; //p2向右
begin
if x2<80 then begin
gotoxy(x2,y2-1);
write(' ');
gotoxy(x2,y2);
write(' ');
gotoxy(x2,y2+1);
write(' ');
x2:=x2+1;
end;
e:='l';
me;
enemy;
end;
procedure k; //p2攻击
begin
textcolor(ys2);
if (e='j') and (x2>1) then begin
gotoxy(x2-1,y2);
write('-');
if x2>=3 then begin
gotoxy(x2-2,y2);
write('(');
end;
if (x2-2=x1) or (x2-1=x1) then begin
if p>0 then p:=p-1;
gotoxy(11+p,1);
write(' ');
textcolor(lightred);
gotoxy(x1,y1-1);
write('*');
gotoxy(x1,y1+1);
write('^');
delay(50);
end;
delay(50);
gotoxy(x2-1,y2);
write(' ');
if x2>=3 then begin
gotoxy(x2-2,y2);
write(' ');
end;
end
else if (e='l') and (x2<80) then begin
gotoxy(x2+1,y2);
write('-');
if x2<=78 then begin
gotoxy(x2+2,y2);
write(')');
end;
if (x2+1=x1) or (x2+2=x1) then begin
if p>0 then p:=p-1;
gotoxy(11+p,1);
write(' ');
textcolor(lightred);
gotoxy(x1,y1-1);
write('*');
gotoxy(x1,y1+1);
write('^');
delay(50);
end;
delay(50);
gotoxy(x2+1,y2);
write(' ');
if x2<=78 then write(' ');
end;
if p=0 then begin
f:=false;
l:=false;
end;
me;
enemy;
end;
begin //主程序
cursoroff;
randomize;
h:l:=true; //判断p1胜利
r:=true; //判断p2胜利
f:=true; //判断游戏是否结束
sec:=(random(2)+1)*50; //p2动作时间间隔
sec1:=0; //时间间隔
x1:=10; //p1横坐标位置
m:='d'; //p1面向的方向(d右,a左)
ys1:=14; //定义p1的颜色(黄色)
x2:=71; //p2横坐标位置
e:='j'; //p2面向的方向(l右,j左)
ys2:=8; //定义p2的颜色(暗灰色)
start; //操作说明
life; //显示生命值
me; //显示p1
enemy; //显示p2
floor; //显示地板
while f do begin
if keypressed then begin
c:=readkey;
if c=' ' then begin
gotoxy(38,12);
textcolor(lightmagenta);
write('PAUSE');
c:='p';
while c<>' ' do
if keypressed then c:=readkey;
gotoxy(38,12);
write(' '); //擦除'pause'
end; //暂停
if c='a' then a;
if c='d' then d;
if c='j' then s; //左右和攻击
end;
delay(5);
sec1:=sec1+5; //时间暂停
if sec1>=sec then begin //随机时间间隔到达后
sec1:=0;
sec:=(random(2)+1)*50;
act:=random(2);
if abs(x1-x2)>=3 then
begin
if x2<x1 then le else je;
end //判断p1朝哪个方向走
else //当p1,p2间距小于3,即x1,x2在攻击范围内时
begin
if x1<x2 then //p1在p2左面
if e='l' then le //p2背对p1时
else k //p2正对p1时
else if x2<x1 then //p1在p2右面
if e='j' then je //p2背对p1时
else k //p2正对p1时
else if x2=x1 then //p1,p2重叠时
case act of
0: je;
1: le;
end; //在p1,p2在同一位置时控制p2离开
end;
end;
end;
delay(500);
sound(100); //以下是判断p1,p2哪方胜利还是平手
if l then begin //如果p1胜利
gotoxy(x2,y2-1);
write(' ');
gotoxy(x2,y2);
write(' ');
gotoxy(x2,y2+1);
write(' ');
textcolor(ys2);
gotoxy(x2-1,y2+1);
write('>-*');
delay(2000);
nosound;
clrscr;
sound(1000);
textcolor(yellow);
gotoxy(37,10);
write('YOU WIN!');
end
else if r then begin //如果p2胜利
gotoxy(x1,y1-1);
write(' ');
gotoxy(x1,y1);
write(' ');
gotoxy(x1,y1+1);
write(' ');
textcolor(ys1);
gotoxy(x1-1,y1+1);
write('*-<');
delay(2000);
nosound;
clrscr;
sound(1000);
textcolor(lightred);
gotoxy(37,10);
write('YOU LOSE');
end
else begin //平手
gotoxy(x1,y1-1);
write(' ');
gotoxy(x1,y1);
write(' ');
gotoxy(x1,y1+1);
write(' ');
gotoxy(x2,y2-1);
write(' ');
gotoxy(x2,y2);
write(' ');
gotoxy(x2,y2+1);
write(' ');
textcolor(ys1);
gotoxy(x1-1,y1+1);
write('*-<');
textcolor(ys2);
gotoxy(x2-1,y2+1);
write('>-*');
delay(2000);
nosound;
clrscr;
sound(1000);
textcolor(lightgreen);
gotoxy(36,10);
write('nobody wins');
end;
delay(5000);
nosound; //以下为判断是否继续
clrscr;
y:=true;
n:=false;
textcolor(7);
gotoxy(38,11);
write('REPLAY?');
gotoxy(24,12);
write('(A: right D: left Enter: dicide)');
while c<>#13 do begin
gotoxy(36,13);
if y then textcolor(blink) else textcolor(7);
write('yes');
textcolor(7);
write(' ');
if n then textcolor(blink) else textcolor(7);
write('no');
if keypressed then begin
c:=readkey;
if c='a' then begin
y:=true;
n:=false;
end
else if c='d' then begin
y:=false;
n:=true;
end
else if c=#13 then
if y then goto h; //重新开始
end;
end;
end.