📄 fangmain.cpp
字号:
/******************************************************************************
* 垒方块游戏(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 + -