📄 unittetris.cpp
字号:
break;
case 'S':
case 's': if(!_iLeftDown)
{
btm=TBaseTetris::btmDown;
_iLeftDown=1;
}
break;
case 'W':
case 'w': btm=TBaseTetris::btmCW; break;
case 'Q':
case 'q': btm=TBaseTetris::btmCCW; break;
}
if(btm)
{
TetrisLeft.Move(btm);
}
}
if((!TetrisRight.GameOver)&&(TetrisRight.Started)&&(!Paused)&&(!TetrisRight.Busy))
{
int btm = 0;
switch(Key)
{
case VK_LEFT : if(!_iRightLeft)
{
btm=TBaseTetris::btmLeft;
_iRightLeft=1;
}
break;
case VK_RIGHT : if(!_iRightRight)
{
btm=TBaseTetris::btmRight;
_iRightRight=1;
}
break;
case VK_DOWN : if(!_iRightDown)
{
btm=TBaseTetris::btmDown;
_iRightDown=1;
}
break;
case VK_UP:
case VK_SPACE : btm=TBaseTetris::btmCW ; break;
case VK_RETURN: btm=TBaseTetris::btmCCW ; break;
}
if(btm)
{
TetrisRight.Move(btm);
}
}
CheckGameStatus();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
switch(Key)
{
case 'a': case 'A': _iLeftLeft = 0; break;
case 'd': case 'D': _iLeftRight= 0; break;
case 's': case 'S': _iLeftDown = 0; break;
case VK_LEFT : _iRightLeft = 0; break;
case VK_RIGHT: _iRightRight= 0; break;
case VK_DOWN : _iRightDown = 0; break;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::RefreshDisplay(void)
{
sprintf(Str_L_Lines , "行数: %d", TetrisLeft.Lines );
sprintf(Str_L_Score , "分数: %d", TetrisLeft.Score );
sprintf(Str_R_Lines , "行数: %d", TetrisRight.Lines);
sprintf(Str_R_Score , "分数: %d", TetrisRight.Score);
sprintf(Str_Speed , "速度: %d", (400-nTimerMainInterval)/10+1 );
sprintf(Str_HighScore, "纪录: %d", TetrisParams.Scores[0].Score);
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::CheckGameStatus(void)
{
int Ln = TetrisRight.Lines;
if((!_bSingle)&&(Ln<TetrisLeft.Lines))
Ln = TetrisLeft.Lines;
int Sn = Ln/10 + InitSpeed - 1;
Sn*=10;
Sn = 400 - Sn;
if(Sn<60)
Sn=60;
if(nTimerMainInterval!=Sn)
nTimerMainInterval=Sn;
if(!_bSingle)
{
int DL = TetrisLeft.Lines-LnLeft;
int DR = TetrisRight.Lines-LnRight;
if(DL)
{
LnLeft = TetrisLeft.Lines;
switch(DL)
{
case 2: TetrisLeft.AddBombs(1); TetrisRight.AddMonsters(1); break;
case 3: TetrisLeft.AddBombs(1); TetrisRight.AddLines(2); break;
case 4: TetrisLeft.AddBombs(1); TetrisRight.AddLines(4); break;
}
}
if(DR)
{
LnRight = TetrisRight.Lines;
switch(DR)
{
case 2: TetrisRight.AddBombs(1); TetrisLeft.AddMonsters(1); break;
case 3: TetrisRight.AddBombs(1); TetrisLeft.AddLines(2); break;
case 4: TetrisRight.AddBombs(1); TetrisLeft.AddLines(4); break;
}
}
}
RefreshDisplay();
if(_bSingle)
{
if((TetrisRight.GameOver)&&(!_bGameOverR))
{
_bGameOverR = TetrisRight.GameOver;
LoadParams();
int iChanged = -1;
for(int i=0; i<NumScores; i++)
if(TetrisRight.Score>TetrisParams.Scores[i].Score)
{
for(int m=NumScores-1; m>i; m--)
TetrisParams.Scores[m] = TetrisParams.Scores[m-1];
iChanged = i;
break;
}
if(iChanged>=0)
{
TetrisParams.Scores[iChanged].Score = TetrisRight.Score;
GetPlayerName(TetrisParams.Scores[iChanged].Name);
RefreshDisplay();
SaveParams();
}
ShowHighScores();
}
}
else
{
if((!_bGameOverL)&&(!_bGameOverR))
if(TetrisLeft.GameOver||TetrisRight.GameOver)
Paused = true;
_bGameOverL = TetrisLeft.GameOver;
_bGameOverR = TetrisRight.GameOver;
}
}
//---------------------------------------------------------------------------
void TFormTetris::GetPlayerName(char *lpName)
{
AnsiString HsName;
FormEnterName = new TFormEnterName(this);
FormEnterName->EditName->MaxLength=30;
while(HsName.IsEmpty())
{
FormEnterName->ShowModal();
HsName = FormEnterName->EditName->Text.Trim();
}
delete FormEnterName;
strcpy(lpName,HsName.c_str());
}
//---------------------------------------------------------------------------
void TFormTetris::ShowHighScores(void)
{
AnsiString s;
LoadParams();
for(int i=0; i<NumScores; i++)
{
if(TetrisParams.Scores[i].Score)
s+=AnsiString().sprintf("第%d名: %s (%d分)\r\n", i+1, TetrisParams.Scores[i].Name, TetrisParams.Scores[i].Score);
else
break;
}
s=s.Trim();
if(s.IsEmpty())
s = "没有记录";
Application->MessageBox(s.c_str(),"英雄榜",MB_OK|MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::SetPause(bool b)
{
_bPaused = b&&(((!TetrisLeft.GameOver)&&(TetrisLeft.Started))||((!TetrisRight.GameOver)&&(TetrisRight.Started)));
AnPause->Checked = _bPaused;
RefreshDisplay();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
if(bDisplayEnabled)
VictorDDraw81->RefreshDisplay();
iTimerMainC1 = iTimerDownC1 = timeGetTime();
if((int)(iTimerMainC1-iTimerMainC0)>=nTimerMainInterval)
{
iTimerMainC0 = iTimerMainC1;
EvTimerMainTimer();
}
if((int)(iTimerDownC1-iTimerDownC0)>=nTimerDownInterval)
{
iTimerDownC0=iTimerDownC1;
EvTimerDownTimer();
}
Done = false;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::ApplicationEvents1Activate(TObject *Sender)
{
bDisplayEnabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::ApplicationEvents1Deactivate(TObject *Sender)
{
bDisplayEnabled = false;
Paused = true;
if(!VictorDDraw81->Windowed)
Application->Minimize();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::ApplicationEvents1Restore(TObject *Sender)
{
if(!VictorDDraw81->Windowed)
PostMessage(Handle,WM_SYSCOMMAND,SC_RESTORE,0);
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::LabelHomeClick(TObject *Sender)
{
ShellExecute(Handle,"open","http://www.cppfans.com/",0,"",SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnSingleExecute(TObject *Sender)
{
_bSingle = true;
TetrisRight.NewGame();
Paused = false;
LnLeft=LnRight=0;
_bGameOverR=false;
_iLeftDown = _iRightDown = 0;
_iLeftLeft = _iLeftRight = 0;
_iRightLeft = _iRightRight = 0;
RefreshDisplay();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnNewExecute(TObject *Sender)
{
_bSingle = false;
TetrisLeft.NewGame();
TetrisRight.NewGame();
Paused = false;
LnLeft=LnRight=0;
_bGameOverL=_bGameOverR=false;
_iLeftDown = _iRightDown = 0;
_iLeftLeft = _iLeftRight = 0;
_iRightLeft = _iRightRight = 0;
RefreshDisplay();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnPauseExecute(TObject *Sender)
{
Paused = !Paused;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnHScoreExecute(TObject *Sender)
{
Paused = true;
ShowHighScores();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnExitExecute(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnHelpExecute(TObject *Sender)
{
Paused = true;
AnsiString s;
s = "游戏操作:\r\n左,右,下移光标键,或A、D、S键\r\n空格、回车、Q、W: 旋转\r\n"
"\r\n计分标准:\r\n只是落下方块: 1 分\r\n同时消去一行: 10 分\r\n同时消去两行: 30 分\r\n同时消去三行: 50 分\r\n同时消去四行: 80 分";
Application->MessageBox(s.c_str(),Caption.c_str(),MB_OK|MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnAboutExecute(TObject *Sender)
{
Paused = true;
FormAbout = new TFormAbout(this);
FormAbout->ShowModal();
delete FormAbout;
}
//---------------------------------------------------------------------------
void TFormTetris::LoadParams(void)
{
memset(&TetrisParams,0,sizeof(TTetrisParams));
AnsiString fname = ChangeFileExt(ParamStr(0),".cfg");
FILE *f = fopen(fname.c_str(),"rb");
if(f)
{
fread(&TetrisParams,sizeof(TTetrisParams),1,f);
fclose(f);
}
}
//---------------------------------------------------------------------------
void TFormTetris::SaveParams(void)
{
AnsiString fname = ChangeFileExt(ParamStr(0),".cfg");
FILE *f = fopen(fname.c_str(),"wb");
if(f)
{
fwrite(&TetrisParams,sizeof(TTetrisParams),1,f);
fclose(f);
}
}
//---------------------------------------------------------------------------
int __fastcall TFormTetris::GetInitSpeed(void)
{
int iSpd = TetrisParams.Speed;
if(iSpd>35)iSpd=35;
if(iSpd<1)iSpd=1;
return iSpd;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::SetInitSpeed(int iSpd)
{
if(iSpd>35)iSpd=35;
if(iSpd<1)iSpd=1;
LoadParams();
TetrisParams.Speed=iSpd;
SaveParams();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnSpeedExecute(TObject *Sender)
{
FormSpeed = new TFormSpeed(this);
FormSpeed->ShowModal();
InitSpeed = atoi(FormSpeed->Edit1->Text.c_str());
delete FormSpeed;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -