⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tank.pas

📁 可以像电玩一样玩坦克
💻 PAS
📖 第 1 页 / 共 3 页
字号:
              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 + -