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

📄 fangmain.cpp

📁 俄罗斯方块的源程序.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 *        垒方块游戏(1.00版2001.7)     作者:金河曲  Email: jinhequ@sohu.com  *
 ******************************************************************************/
#pragma hdrstop
#include "FangMain.h"
#include "FangAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------初始化过程-------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner),KUAN(240),GAO(420),StartPosX(10),StartPosY(10)
{
        WindowProc = MyKeyDown;
        intKuaiCount=3;
        GetKuaiCount=7;
        clBrushKuai=0x00367BEF;
        clBrushKuai1=0x00367BEF;
        clPenKuai= clWhite;
        LetJiBie=3;
        GetDaXiao=15;
}
//----------------------------------------------------------------------------
  void TForm1::XiaZai(TWinControl *Parent1,int xPos,int yPos,int H,TColor MyColor)
  {
        TShape *shpKuai;
        for (int i=0;i<=intKuaiCount;i++)
        {
                shpKuai=new TShape(this);
                shpKuai->Parent=Parent1;
                shpKuai->Brush->Color =MyColor ;
                shpKuai->Pen->Color =clPenKuai ;
                shpKuai->SetBounds (xPos+intYang[0][i]*H,yPos+intYang[1][i]*H,H,H);
                FangKuai[i]=shpKuai;
        }
  }
//---------------------------------------------------------------------------
void TForm1::YangShi(int  & ModeNo,int & RoundNo) //理论上随机产生4*7或4*16种样式,其中7种基本样式,4种旋转
{
    randomize();
    ModeNo=random(GetKuaiCount); //随机产生样式序数
    randomize();
    intWei=StartPosX+2*GetDaXiao+random(KUAN/GetDaXiao-6)*GetDaXiao;//随机产生方块降临位置
    randomize();
    RoundNo=random(4);//随机产生旋转序数
}
//-------------下面函数使方块数组产生旋转-----------------------------------------------------
void TForm1::Xuan(int intYang[2][5]) 

{
        int intTemp [2][5];
        for (int i=0;i<=intKuaiCount;i++)
                {
                       intTemp[0][i]=intYang[0][i];
                       intTemp[1][i]=intYang[1][i];
                }
        for(int i=0;i<=intKuaiCount;i++)
                {
                      intYang[0][i]=intTemp[1][i]*(-1);
                      intYang[1][i]=intTemp[0][i]*(1);
                }
}
//----------------------------------------------------------------------------
void TForm1::ChuFangKuai()
{
        Guan=false;
        timXia->Enabled =false;
        intYangShi=intYangShi1;
        intXuan=intXuan1;
        clBrushKuai2=clBrushKuai1;
        if(GetKuaiColor)
        {
                randomize();
                clBrushKuai1=KuaiColor[random(7)];
        }
        else clBrushKuai1=clBrushKuai2=clBrushKuai;
        YangShi(intYangShi1,intXuan1); //产生基本样式随机数
        //-------下面载入预告栏方块------------
        while(Panel2->ControlCount!=0) delete Panel2->Controls[0];
        if (intYangShi1<=7)intKuaiCount=3;
        else intKuaiCount=4;
        ReadModel(intYangShi1);
        XuanYang(intYang,intXuan1);
        XiaZai(Panel2,25,15,8,clBrushKuai1);
        //--------下面载入游戏区方块-----------
        if (intYangShi<=7)intKuaiCount=3;
        else intKuaiCount=4;
        ReadModel(intYangShi);
        XuanYang(intYang,intXuan); //旋转样式
        XiaZai(Panel1,intWei,(StartPosY+2*GetDaXiao),GetDaXiao,clBrushKuai2);   //载入方块
        timXia->Enabled =true;//开始下降
}
//---------下面函数响应自己的消息--------------------------------------------------
void __fastcall TForm1::MyKeyDown(Messages::TMessage & Message)
{
        static bool j(false);
        if (blMsgOk && (Message.Msg == WM_KEYDOWN ||Message.Msg == WM_KEYUP) )
            switch (Message.WParamLo )//取低位字判断键盘消息
            {
                  case VK_LEFT :
                  {
                          if(Message.Msg == WM_KEYDOWN)spbtnLeft->Perform (WM_LBUTTONDOWN,0,0);
                          else spbtnLeft->Perform (WM_LBUTTONUP,0,0);
                  }
                  return;
                  case VK_RIGHT :
                  {
                          if(Message.Msg == WM_KEYDOWN)spbtnRight->Perform (WM_LBUTTONDOWN,0,0);
                          else spbtnRight->Perform (WM_LBUTTONUP,0,0);
                  }
                  return;
                  case VK_SHIFT :
                  {
                        if(Message.Msg == WM_KEYDOWN)
                          j=true;
                        else j=false;
                  }
                  return;
                  case VK_DOWN :
                  {
                        if (j)
                        {
                          if(Message.Msg == WM_KEYDOWN)spbtnDown->Perform (WM_RBUTTONDOWN,0,0) ;
                          else spbtnDown->Perform (WM_RBUTTONUP,0,0) ;
                        }
                        else
                        {
                          if(Message.Msg == WM_KEYDOWN)spbtnDown->Perform (WM_LBUTTONDOWN,0,0) ;
                          else spbtnDown->Perform (WM_LBUTTONUP,0,0) ;
                        }
                  }
                  return;
                  case VK_UP :
                  {
                          if(Message.Msg == WM_KEYDOWN) spbtnRound->Perform (WM_LBUTTONDOWN,0,0);
                          else spbtnRound->Perform (WM_LBUTTONUP,0,0);
                  }
                  return;
            }
            WndProc(Message);
}
//-------下面函数根据7或16种基本样式产生28或64种样式--------------
void TForm1::XuanYang(int intXuan[2][5],int XuanZhuan)
{
        switch (XuanZhuan)
        {
          case 1: Xuan(intXuan);
          break;
          case 2: {Xuan(intXuan); Xuan(intXuan);}
          break;
          case 3: {Xuan(intXuan); Xuan(intXuan);Xuan(intXuan);}
          break;
        }
}
//------------控制运动的定时器事件过程------------------------------------------
void __fastcall TForm1::timXiaTimer(TObject *Sender)
{
        if (Guan==false)
        NewMove(mvDown);
        else
        {
              for(int i=0;i<=intKuaiCount;i++)
                      FangKuai[i]->Tag=9;
              if(JianCha1())
              {
                     timXia->Enabled =false;
                     ShowMessage("方块到达上限,按确定重新开始!");
                     SpeedButton1->Click ();
                     return;
              }
              if (JianCha())
              ChuFangKuai();
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
    blMsgOk=true;
    Panel4->Caption =JiFen;
    spbtnRound->Enabled =true;
    spbtnLeft->Enabled =true;
    spbtnRight->Enabled =true;
    spbtnDown->Enabled =true;
    KaiShi();
}
//-----下面函数检查方块是否有满行的情况,若有的话则消除,完成后返回真值。------
bool TForm1::JianCha()
{
        TPoint pntJian;
        int intKuai1;
        int intKong1;
        JiFen1=0;
        for (int hanghao =1;hanghao <=(GAO/GetDaXiao);hanghao++)
            {
                  intKuai1=0;
                  intKong1=0;
                  for(int liehao=1;liehao<=(KUAN/GetDaXiao);liehao++)
                      {
                            pntJian.y=(StartPosY+GAO)-hanghao*GetDaXiao+0.5*GetDaXiao;
                            pntJian.x=StartPosX+(liehao-1)*GetDaXiao+0.5*GetDaXiao;
                            if (Panel1->ControlAtPos(pntJian,1,0)!=NULL)
                                intKuai1++;
                            else intKong1++;
                      }
        //----假如出现一行空的情况,说明上面已经没有方块,结束检查,返回真值。-----
                  if (intKong1==KUAN/GetDaXiao)
                  {
                    JiFen+=JiFen1;
                    Panel4->Caption =JiFen;
                    return true;
                  }
                  if (intKuai1==KUAN/GetDaXiao)//满一行则消掉一行,再从当前行开始继续检查。
                       {
                               for (int i=4;i<Panel1->ControlCount && i>=4;i++)
                                   {
                                          if (Panel1->Controls[i]->Top==(StartPosY+GAO)-hanghao*GetDaXiao )
                                            {
                                              delete Panel1->Controls [i];
                                              i--;
                                            }
                                   }
                               for (int i=4;i<Panel1->ControlCount;i++)
                                   {
                                          if (Panel1->Controls[i]->Top<(StartPosY+GAO)-hanghao*GetDaXiao && Panel1->Controls[i]->Top>StartPosX)
                                              Panel1->Controls[i]->Top=Panel1->Controls[i]->Top+GetDaXiao ;
                                   }
                               hanghao--;
                               JiFen1=(JiFen1+20)*2;
                       }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -