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

📄 unittetris.cpp

📁 此为一简单的俄罗斯方块游戏
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UnitTetris.h"
#include "UnitEnterName.h"
#include "UnitAbout.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormTetris *FormTetris;
//---------------------------------------------------------------------------
__fastcall TFormTetris::TFormTetris(TComponent* Owner)
    : TForm(Owner)
{
  Font->Name    = "宋体";
  Font->Charset = GB2312_CHARSET;
  Font->Size    = 9;

  ScrollBox1->DoubleBuffered = true;
  int dx = ScrollBox1->Width-PaintBox1->Width;
  int dy = ScrollBox1->Height-PaintBox1->Height;
  ScrollBox1->Width = dx+TBaseTetris::MapXsize*16;
  ScrollBox1->Height = dy+TBaseTetris::MapYsize*16;

  LoadParams();
  Paused = false;
  Application->Title = "俄罗斯方块";
  Caption = Application->Title;
  LabelHome->Font->Color = clBlue;

  TtBmp = new Graphics::TBitmap;
  TtBmp->LoadFromResourceName(0,"BMP_BLOCKS");

  PsBmp = new Graphics::TBitmap;
  PsBmp->LoadFromResourceName(0,"BMP_PAUSED");
  PsBmp->Transparent = true;

  OvBmp = new Graphics::TBitmap;
  OvBmp->LoadFromResourceName(0,"BMP_GMOVER");
  OvBmp->Transparent = true;
}
//---------------------------------------------------------------------------
__fastcall TFormTetris::~TFormTetris()
{
  delete OvBmp; //GmOver
  delete PsBmp; //Paused
  delete TtBmp; //Blocks
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::PaintBox1Paint(TObject *Sender)
{
  TPaintBox *pb = (TPaintBox *)Sender;
  TRect rc(0,0,pb->Width,Height);
  pb->Canvas->Brush->Style = bsSolid;
  pb->Canvas->Brush->Color = clWhite;
  pb->Canvas->FillRect(rc);

  int n;
  for(int y=0; y<TBaseTetris::MapYsize; y++)
   for(int x=0; x<TBaseTetris::MapXsize; x++)
    {
      if((n=Tetris.DisplayBuffer->TetrisBuffer[y][x])>0)
       ::BitBlt(pb->Canvas->Handle, x*16,y*16,16,16, TtBmp->Canvas->Handle, (n-1)*16,0, SRCCOPY);
    }

  if(Paused)
    pb->Canvas->Draw((pb->Width-PsBmp->Width)/2,(pb->Height-PsBmp->Height)/2,PsBmp);
  else if(Tetris.GameOver)
    pb->Canvas->Draw((pb->Width-OvBmp->Width)/2,(pb->Height-OvBmp->Height)/2,OvBmp);
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::PaintBox2Paint(TObject *Sender)
{
  TPaintBox *pb = (TPaintBox *)Sender;
  int n;
  for(int y=0; y<4; y++)
   for(int x=0; x<4; x++)
    {
      if((n=Tetris.IncomingUnits->un[Tetris.IncomingUnits->r][y][x])>0)
       ::BitBlt(pb->Canvas->Handle, x*16,y*16,16,16, TtBmp->Canvas->Handle, (n-1)*16,0, SRCCOPY);
    }
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::Timer1Timer(TObject *Sender)
{
  if((!Tetris.GameOver)&&(Tetris.Started)&&(!Paused))
   {
     Tetris.Move(TBaseTetris::btmDown);
     CheckGameStatus();
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if((!Tetris.GameOver)&&(Tetris.Started)&&(!Paused)&&(!Tetris.Busy))
   {
     int btm = 0;
     switch(Key)
      {
        case VK_LEFT  :  btm=TBaseTetris::btmLeft ; break;
        case VK_RIGHT :  btm=TBaseTetris::btmRight; break;
        case VK_DOWN  :  btm=TBaseTetris::btmDown ; break;
        case VK_UP:
        case VK_SPACE :  btm=TBaseTetris::btmCW   ; break;
        case VK_RETURN:  btm=TBaseTetris::btmCCW  ; break;
      }
     if(btm)
      {
        Tetris.Move(btm);
        CheckGameStatus();
      }
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::RefreshDisplay(void)
{
  PaintBox1->Invalidate();
  PaintBox2->Invalidate();

  LabelLines->Caption = Tetris.Lines;
  LabelScore->Caption = Tetris.Score;
  LabelHighScore->Caption = TetrisParams.Scores[0].Score;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::CheckGameStatus(void)
{
  RefreshDisplay();
  if(Tetris.GameOver)
   {
     int iChanged = -1;
     LoadParams();
     for(int i=0; i<NumScores; i++)
      if(Tetris.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 = Tetris.Score;
        GetPlayerName(TetrisParams.Scores[iChanged].Name);
        RefreshDisplay();
        SaveParams();
      }
     ShowHighScores();
   }
}
//---------------------------------------------------------------------------
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;
  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&&(!Tetris.GameOver)&&(Tetris.Started);
  AnPause->Checked = _bPaused;
  RefreshDisplay();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::ApplicationEvents1Deactivate(TObject *Sender)
{
  Paused = true;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::LabelHomeMouseEnter(TObject *Sender)
{
  LabelHome->Font->Color = clRed;
  LabelHome->Font->Style = LabelHome->Font->Style<<fsUnderline;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::LabelHomeMouseLeave(TObject *Sender)
{
  LabelHome->Font->Color = clBlue;
  LabelHome->Font->Style = LabelHome->Font->Style>>fsUnderline;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::LabelHomeClick(TObject *Sender)
{
  ShellExecute(Handle,"open","http://www.cppfans.com/",0,"",SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnNewExecute(TObject *Sender)
{
  Tetris.NewGame();
  Paused = false;
  RefreshDisplay();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnPauseExecute(TObject *Sender)
{
  Paused = !Paused;
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnHScoreExecute(TObject *Sender)
{
  Paused = true;
  LoadParams();
  ShowHighScores();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnExitExecute(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TFormTetris::AnHelpExecute(TObject *Sender)
{
  Paused = true;
  AnsiString s;
  s = "游戏操作:\r\n左,右,下移光标键\r\n空格: 顺时针旋转\r\n回车: 逆时针旋转\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);
   }
}
//---------------------------------------------------------------------------


⌨️ 快捷键说明

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