📄 tank.pas
字号:
Canvas.Draw(176,128,BitmapGameover);
sleep(2000);
//调用游戏结束声音
sndPlaySound( 'Gameover.wav', SND_ASYNC);
//Mainform.Font.Color:=clBlue;
//Mainform.Font.Size:=32;
//Mainform.Font.Name:='华文行楷';
//Canvas.TextOut(100,100,'坦克你真是个天才');
end;
end;
end;
end;
{Procedure TMainForm.SetValue(Etank:array of Byte);
begin
//管理新出现的敌方坦克
//如果检测到游戏开始标志则进行赋值
// if gsPlaying:=true then
// Begin
// end;
end;
}
//此函数处理敌方坦克坐标和方向
Procedure TMainForm.Etanks(Var Etank:TPatDt);
// var
// Cn:Byte;
begin
//用黑色背景先把敌方坦克原来位置覆盖掉,敌方坦克然后再改变坐标
Rect_L:=Rect(0,0,32,32);
Rect_M:=Rect(Etank.Xpos,Etank.Ypos,Etank.Xpos+32,Etank.Ypos+32);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
//把随即数打乱
Randomize;
//定义敌人坦克改变方向行驶的概率
//Cn:=Random(100);
if Random(100)<5 then
begin
Etank.Smov := Random(4);
end;
//如果敌方坦克移动方向为右(0=右;1=左;2=下:3=上)
// if (Chpon.Xpos<220 )or(Chpon.Xpos>356)or(Chpon.Ypos<356)
//then begin
if Etank.Smov=0 then
begin
//把向右的敌方坦克对应的画面显示出来
Etank.Sban:=11;
Etank.Xpos := Etank.Xpos + 4;
//碰到军旗周围的砖头
if (Etank.Xpos>224 )and(Etank.Xpos<352)and(Etank.Ypos>352)then
begin
//坦克掉头
Etank.Smov:=1;
end;
end;
//如果敌方坦克移动方向向左
if Etank.Smov=1 then
begin
//把向左的坦克显示出来
Etank.Sban:=10;
Etank.Xpos := Etank.Xpos - 4;
if (Etank.Xpos>224 )and(Etank.Xpos<356)and(Etank.Ypos>352)then
begin
Etank.Smov:=0;
end;
end;
//如果敌方坦克移动方向向下
if Etank.Smov=2 then
begin
//把向下的敌方坦克显示出来
Etank.Sban:=9;
Etank.Ypos := Etank.Ypos + 4;
if (Etank.Xpos>224 )and(Etank.Xpos<356)and(Etank.Ypos>352)then
begin
Etank.Smov:=3;
end;
end;
if Etank.Smov=3 then
begin
Etank.Sban:=8;
Etank.Ypos := Etank.Ypos - 4;
if (Etank.Xpos>224 )and(Etank.Xpos<356)and(Etank.Ypos>352)then
begin
Etank.Smov:=2;
end;
end;
// end
// else
// Chpon.Xpos:=ChPon.Xpos;
// Chpon.Ypos:=Chpon.Ypos;
// end
{ case ChPon.Smov of
0: Chpon.Xpos := ChPon.Xpos + 4;
1: ChPon.Xpos := ChPon.Xpos - 4;
2: ChPon.Ypos := ChPon.Ypos + 4;
3: ChPon.Ypos := ChPon.Ypos - 4;
end;
}
//对于敌方坦克移动到屏幕外所做的处理
//(0=右;1=左;2=下:3=上)
if (Etank.Xpos < 0) then
begin
Etank.Smov:=0;
end
else if (Etank.Xpos >DYoko -32) then
begin
Etank.Smov:=1;
end
else if(Etank.Ypos<0)then
begin
Etank.Smov:=2;
end
else if (Etank.Ypos >DTate - 32 )then
begin
Etank.Smov := 3;
end;
end ;
Procedure TMainForm.Mytanks(Var Mytank:TPatDt);
begin
// Rect_L:=Rect(0,0,32,32);
// Rect_M:=Rect(Mytank.Xpos,Mytank.Ypos,Mytank.Xpos+32,Mytank.Ypos+32);
// Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
//Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
//移动方向(0=右;1=左;2=下:3=上)
if Mytank.Smov=0 then
begin
//把向右的我方坦克对应的图画的编号赋值
Mytank.Sban:=23;
end ;
//如果我方坦克移动方向向左
if Mytank.Smov=1 then
begin
//把向左的坦克显示出来
Mytank.Sban:=22;
end;
//如果我方坦克移动方向向下
if Mytank.Smov=2 then
begin
//把向下的我方坦克显示出来
Mytank.Sban:=21;
end;
if Mytank.Smov=3 then
begin
Mytank.Sban:=20;
end;
end;
//绘制敌人坦克函数
Procedure TMainForm.DrawEtank(Sban:Byte;X1,Y1:Integer);
begin
// 画出敌人坦克
GX:=(Sban mod 8)*32;
GY:=(Sban div 8)*32;
Rect_L:=Rect(GX,GY,GX+32,GY+32);
Rect_M:=Rect(X1,Y1,X1+32,Y1+32);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
end;
//子弹碰撞检测函数
Procedure TMainForm.HitCk;
var
X,Y,Cn:Byte;
begin
//我方子弹移动方向(0=右;1=左;2=下:3=上)
// 如果子弹向上出现中
// if MyBullet[0].Used=3 then
// begin
//碰撞判断的计算式-30<=敌方坦克的坐标-子弹的坐标<=14
// Count:=0;
// for Cn:=0 to MaxETank-1 do
for Cn:=0 to 2 do
begin
if Etank[Cn].Used=1 then
begin
// Count:=Count+1;
// if Count>3 then begin
// Etank[4].Used:=1;
// end;
X2:=Etank[Cn].Xpos-MyBullet[0].Xpos;
Y2:=Etank[Cn].Ypos-MyBullet[0].Ypos;
if(X2>=-30)and(X2<=14)and(Y2>=-30)and(Y2<=14) then
begin
//爆炸标志设计为255
// Etank[Cn].FExplode:=255;
Etank[Cn].Used:=255;//当Used=255设定为爆炸标志
//我方子弹用黑色背景去除,敌人坦克产生爆炸效果
GX:=(0 mod 16)*16;
GY:=(0 div 16)*16;
Rect_L:=Rect(GX,GY,GX+16,GY+16);
Rect_M:=Rect(MyBullet[0].Xpos,MyBullet[0].Ypos,MyBullet[0].Xpos+16,MyBullet[0].Ypos+16);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
//我方子弹消失标志,使按键能够再次发射子弹
MyBullet[0].Used:=4;
//把子弹的全局变量坐标设置到画框外面
// 使敌人坦克不至于碰到原来子弹的位置而停止运动把它当作跟子弹 碰撞来处理
MyBullet[0].Xpos:=-16;
MyBullet[0].Ypos:=-16;
end;
end;
//我方坦克与敌方子弹碰撞
if Mytank[0].Used=1 then
begin
//Count:=Count+1;
// if Count>3 then begin
//Etank[4].Used:=1;
// end;
X3:=Mytank[0].Xpos-EBullet[Cn].Xpos;
Y3:=Mytank[0].Ypos-EBullet[Cn].Ypos;
if(X3>=-30)and(X3<=14)and(Y3>=-30)and(Y3<=14) then
begin
//爆炸标志设计为255
// Etank[Cn].FExplode:=255;
Mytank[0].Used:=255;//当Used=255设定为爆炸标志
//敌方子弹用黑色背景去除,我方坦克产生爆炸效果
GX:=(0 mod 16)*16;
GY:=(0 div 16)*16;
Rect_L:=Rect(GX,GY,GX+16,GY+16);
Rect_M:=Rect(EBullet[Cn].Xpos,EBullet[Cn].Ypos,EBullet[Cn].Xpos+16,EBullet[Cn].Ypos+16);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
//敌方对应坦克子弹消失标志
EBullet[Cn].Used:=4;
//把子弹的全局变量坐标设置到画框外面
// 使敌人坦克不至于碰到原来子弹的位置而停止运动把它当作跟子弹 碰撞来处理
EBullet[Cn].Xpos:=-16;
EBullet[Cn].Ypos:=-16;
end;
end;
//敌我子弹与砖块碰撞
for Y := 0 to (Tate - 1) do
for X := 0 to (Yoko - 1) do
begin
//与砖块发生碰撞
if Grid[X,Y]=1 then
begin
MapGrid[X,Y].Xpos:=X*32;
MapGrid[X,Y].Ypos:=Y*32;
//敌方子弹与砖块碰撞检测
X5:= MapGrid[X,Y].Xpos-EBullet[Cn].Xpos;
Y5:= MapGrid[X,Y].Ypos-EBullet[Cn].Ypos;
//我方子弹与砖块碰撞检测
X6:=MapGrid[X,Y].Xpos-MyBullet[0].Xpos;
Y6:=MapGrid[X,Y].Ypos-MyBullet[0].Ypos;
if(X5>=-30)and(X5<=14)and(Y5>=-30)and(Y5<=14) then
begin
MapGrid[X,Y].Used:=255;//当Used=255设定为爆炸标志
//地图砖块不存在了
Grid[X,Y]:=0;
// 调用坦克爆炸声音
sndPlaySound( 'bomb.wav', SND_ASYNC);
//敌方对应坦克子弹消失标志
EBullet[Cn].Used:=4;
GX:=(0 mod 16)*16;
GY:=(0 div 16)*16;
Rect_L:=Rect(GX,GY,GX+16,GY+16);
Rect_M:=Rect(EBullet[Cn].Xpos,EBullet[Cn].Ypos,EBullet[Cn].Xpos+16,EBullet[Cn].Ypos+16);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
//把敌人坦克与子弹碰撞时坦克的坐标赋值给全局变量
X4:=MapGrid[X,Y].Xpos;
Y4:=MapGrid[X,Y].Ypos;
//调用爆炸开始图第一张爆炸图
UseMap:=0;
//把定时器2开启调用爆炸画面
Timer2.Enabled:=true;
//把子弹的全局变量坐标设置到画框外面
// 使敌人坦克不至于碰到原来子弹的位置而停止运动把它当作跟子弹 碰撞来处理
EBullet[Cn].Xpos:=-16;
EBullet[Cn].Ypos:=-16;
end;
if(X6>=-30)and(X6<=14)and(Y6>=-30)and(Y6<=14) then
begin
MapGrid[X,Y].Used:=255;//当Used=255设定为爆炸标志
//地图砖块不存在了
Grid[X,Y]:=0;
// 调用坦克爆炸声音
sndPlaySound( 'bomb.wav', SND_ASYNC);
//敌方对应坦克子弹消失标志
MyBullet[0].Used:=4;
GX:=(0 mod 16)*16;
GY:=(0 div 16)*16;
Rect_L:=Rect(GX,GY,GX+16,GY+16);
Rect_M:=Rect(MyBullet[0].Xpos,MyBullet[0].Ypos,MyBullet[0].Xpos+16,MyBullet[0].Ypos+16);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
//把敌人坦克与子弹碰撞时坦克的坐标赋值给全局变量
X4:=MapGrid[X,Y].Xpos;
Y4:=MapGrid[X,Y].Ypos;
//调用爆炸开始图第一张爆炸图
UseMap:=0;
//把定时器2开启调用爆炸画面
Timer2.Enabled:=true;
//把子弹的全局变量坐标设置到画框外面
// 使敌人坦克不至于碰到原来子弹的位置而停止运动把它当作跟子弹 碰撞来处理
MyBullet[0].Xpos:=-16;
MyBullet[0].Ypos:=-16;
end;
end;
//如果子弹碰到的是军旗
if Grid[X,Y]=30 then
begin
MapGrid[X,Y].Xpos:=X*32;
MapGrid[X,Y].Ypos:=Y*32;
X5:= MapGrid[X,Y].Xpos-EBullet[Cn].Xpos;
Y5:= MapGrid[X,Y].Ypos-EBullet[Cn].Ypos;
//我方子弹与军旗的碰撞
X6:=MapGrid[X,Y].Xpos-MyBullet[0].Xpos;
Y6:=MapGrid[X,Y].Ypos-MyBullet[0].Ypos;
if(X5>=-30)and(X5<=14)and(Y5>=-30)and(Y5<=14) then
begin
sndPlaySound( 'bomb.wav', SND_ASYNC);
EBullet[Cn].Used:=4;
GX:=(0 mod 16)*16;
GY:=(0 div 16)*16;
Rect_L:=Rect(GX,GY,GX+16,GY+16);
Rect_M:=Rect(EBullet[Cn].Xpos,EBullet[Cn].Ypos,EBullet[Cn].Xpos+16,EBullet[Cn].Ypos+16);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
Rect_1:=Rect(224,96,256,128);
Rect_2:=Rect(MapGrid[X,Y].Xpos,MapGrid[X,Y].Ypos,MapGrid[X,Y].Xpos+32,MapGrid[X,Y].Ypos+32);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_2,Load_Bmap.Canvas,Rect_1);
Mytank[0].used:=0;
//sleep(2000);
//BitmapGameover:=TBitmap.Create();
//BitmapGameover.LoadFromFile(GetcurrentDir+'\img\Gameover.bmp');
//Canvas.Draw(176,128,BitmapGameover);
//游戏结束 定时器不工作
//gsSuccess:=True;
//调用游戏结束声音
//sndPlaySound( 'Gameover.wav', SND_ASYNC);
//end;
end;
if(X6>=-30)and(X6<=14)and(Y6>=-30)and(Y6<=14) then
begin
sndPlaySound( 'bomb.wav', SND_ASYNC);
MyBullet[0].Used:=4;
GX:=(0 mod 16)*16;
GY:=(0 div 16)*16;
Rect_L:=Rect(GX,GY,GX+16,GY+16);
Rect_M:=Rect(MyBullet[0].Xpos,MyBullet[0].Ypos,MyBullet[0].Xpos+16,MyBullet[0].Ypos+16);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
Rect_1:=Rect(224,96,256,128);
Rect_2:=Rect(MapGrid[X,Y].Xpos,MapGrid[X,Y].Ypos,MapGrid[X,Y].Xpos+32,MapGrid[X,Y].Ypos+32);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_2,Load_Bmap.Canvas,Rect_1);
Mytank[0].used:=0;
MyBullet[0].Xpos:=-16;
MyBullet[0].Ypos:=-16;
end;
end;
end;
end;
end ;
//子弹爆炸画面函数
Procedure TMainForm.Explode(Sban:Byte;X1,Y1:Integer);
begin
GX:=(Sban mod 8)*32;
GY:=(Sban div 8)*32;
Rect_L:=Rect(GX,GY,GX+32,GY+32);
Rect_M:=Rect(X1,Y1,X1+32,Y1+32);
Make_Bmap.Canvas.CopyMode:=cmSrcCopy;
Make_Bmap.Canvas.CopyRect(Rect_M,Load_Bmap.Canvas,Rect_L);
// count:=0;
end;
//我方坦克子弹控制函数
Procedure TMainForm.MyBullets;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -