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

📄 unittetris.cpp

📁 俄罗斯方块双打版
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                  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 + -