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

📄 unittest.cpp

📁 一个好玩的小游戏
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UnitTest.h"
#include "UnitAbout.h"
#include "UnitEnterName.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormMain *FormMain;
//---------------------------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Owner)
    : TForm(Owner)
{
  randomize();
  LoadParams();

  StageNo = 0;
  Paused = false;
  DrMove = TSnakeBuf::sdUp;

  int dx = ScrollBoxSnake->Width - PaintBoxSnake->Width;
  int dy = ScrollBoxSnake->Height - PaintBoxSnake->Height;
  ScrollBoxSnake->Width = dx + TSnakeBuf::UnitX*16;
  ScrollBoxSnake->Height = dy + TSnakeBuf::UnitY*16;
  ScrollBoxSnake->DoubleBuffered = true;

  MiBlocks->Checked=SnakeParams.BmpSet;
  LabelHS->Caption=SnakeParams.HighScore;
  LabelStage->Caption=StageNo+1;
  LabelScore->Caption=SnakeBuf.Score;
  LabelHome->Font->Color = clBlue;

  LabelHomeDefProc = LabelHome->WindowProc;
  LabelHome->WindowProc = LabelHomeWndProc;

  RunBmp = new Graphics::TBitmap;
  RunBmp->LoadFromResourceName(0,"BMP_SNAKE");
  RunBmp->PixelFormat = pfDevice;

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

  OverBmp = new Graphics::TBitmap;
  OverBmp->LoadFromResourceName(0,"BMP_GMOVER");
  OverBmp->PixelFormat = pfDevice;
  OverBmp->Transparent = true;

  MaskBmp = new Graphics::TBitmap;
  MaskBmp->Assign(RunBmp);
  MaskBmp->Mask(MaskBmp->Canvas->Pixels[MaskBmp->Width-1][MaskBmp->Height-1]);

  SnakeTimer = new TSnakeTimer;
  SnakeTimer->Interval = 300;
  SnakeTimer->OnTimer = SnakeTimerTimer;
}
//---------------------------------------------------------------------------
__fastcall TFormMain::~TFormMain()
{
  SnakeTimer->DestroyTimer();
  delete MaskBmp;
  delete OverBmp;
  delete PausedBmp;
  delete RunBmp;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::LabelHomeWndProc(Messages::TMessage &Message)
{
  if(Message.Msg==CM_MOUSEENTER)
   {
     LabelHome->Font->Color = clRed;
     LabelHome->Font->Style = LabelHome->Font->Style<<fsUnderline;
   }
  else if(Message.Msg==CM_MOUSELEAVE)
   {
     LabelHome->Font->Color = clBlue;
     LabelHome->Font->Style = LabelHome->Font->Style>>fsUnderline;
   }
  LabelHomeDefProc(Message);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::LabelHomeClick(TObject *Sender)
{
  ShellExecute(Handle,"open","http://www.cppfans.com/",0,"",SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::PaintBoxSnakePaint(TObject *Sender)
{
  TPaintBox *pb = (TPaintBox*)Sender;
  TCanvas *lpCanvas = pb->Canvas;
  TRect rc(pb->Left,pb->Top,pb->Left+pb->Width,pb->Top+pb->Height);
  lpCanvas->Brush->Style = bsSolid;
  lpCanvas->Brush->Color = clWhite;
  lpCanvas->FillRect(rc);

  int u, x0,y0,x1,y1;
  TSnakeBuf::TSnakeNode *lpPoint;
  for(int y=0; y<TSnakeBuf::UnitY; y++)
   {
     x1=0;
     y1=y*16;
     for(int x=0; x<TSnakeBuf::UnitX; x++)
      {
        u=SnakeBuf.GetDispBuf(x,y);
        if(u>0)
         {
           u--;
           x0=TSnakeBuf::BmpPos[SnakeParams.BmpSet].Pos[u].x*16;
           y0=TSnakeBuf::BmpPos[SnakeParams.BmpSet].Pos[u].y*16;
           ::BitBlt(lpCanvas->Handle,x1,y1,16,16, RunBmp->Canvas->Handle,x0,y0, SRCINVERT);
           ::BitBlt(lpCanvas->Handle,x1,y1,16,16, MaskBmp->Canvas->Handle,x0,y0, SRCAND  );
           ::BitBlt(lpCanvas->Handle,x1,y1,16,16, RunBmp->Canvas->Handle,x0,y0, SRCINVERT);
         }
        x1+=16;
      }
   }
  if(Paused)
   {
     int w=PausedBmp->Width,h=PausedBmp->Height;
     int x=(pb->Width-w)/2,y=(pb->Height-h)/2;
     lpCanvas->Draw(x,y,PausedBmp);
   }
  else if(SnakeBuf.GameOver)
   {
     int w=OverBmp->Width,h=OverBmp->Height;
     int x=(pb->Width-w)/2,y=(pb->Height-h)/2;
     lpCanvas->Draw(x,y,OverBmp);
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::SnakeTimerTimer(TObject *Sender)
{
  if((!SnakeBuf.GameOver)&&(StageNo<TSnakeBuf::StageCount)&&(!Paused))
   {
     bool bCheckScore = false;
     SnakeBuf.StepMove(DrMove);
     if(SnakeBuf.GameOver)
      {
        LabelScore->Caption=SnakeBuf.Score;
        PaintBoxSnake->Invalidate();
        bCheckScore = true;
        //Application->MessageBox("Game Over!","Game Over",MB_OK|MB_ICONSTOP);
      }
     if(SnakeBuf.EndStage)
      {
        StageNo++;
        StageNo%=TSnakeBuf::StageCount;
        LabelScore->Caption=SnakeBuf.Score;
        //Application->MessageBox("Next stage.","Next stage",MB_OK|MB_ICONINFORMATION);
        LabelStage->Caption=StageNo+1;
        DrMove = TSnakeBuf::sdUp;
        SnakeBuf.InitStage(StageNo);
      }
     LabelScore->Caption=SnakeBuf.Score;
     PaintBoxSnake->Invalidate();

     if(bCheckScore)
      {
        LoadParams();
        if(SnakeBuf.Score>SnakeParams.HighScore)
         {
           SaveHighScore();
           ShowHighScore();
         }
      }
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if((!SnakeBuf.GameOver)&&(!Paused))
   {
     int d = 0;
     switch(Key)
      {
        case VK_UP   : if(DrMove!=TSnakeBuf::sdDown )d=TSnakeBuf::sdUp   ; break;
        case VK_DOWN : if(DrMove!=TSnakeBuf::sdUp   )d=TSnakeBuf::sdDown ; break;
        case VK_LEFT : if(DrMove!=TSnakeBuf::sdRight)d=TSnakeBuf::sdLeft ; break;
        case VK_RIGHT: if(DrMove!=TSnakeBuf::sdLeft )d=TSnakeBuf::sdRight; break;
      }
     if(d)
      {
        DrMove = d;
        SnakeTimer->TriggerTimer();
      }
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MiNewClick(TObject *Sender)
{
  StageNo = 0;
  Paused = false;
  LabelStage->Caption=StageNo+1;
  DrMove = TSnakeBuf::sdUp;
  SnakeBuf.ClearScore();
  SnakeBuf.InitStage(StageNo);
  LabelScore->Caption=SnakeBuf.Score;
  PaintBoxSnake->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MiExitClick(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::ApplicationEvents1Deactivate(TObject *Sender)
{
  if(SnakeBuf.Running)
    Paused = true;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::fSetPaused(bool b)
{
  _bPaused = b;
  MiPause->Checked=_bPaused;
  PaintBoxSnake->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MiPauseClick(TObject *Sender)
{
  if(SnakeBuf.Running)
    Paused=!Paused;
  else
    Paused=false;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MiBlocksClick(TObject *Sender)
{
  LoadParams();
  SnakeParams.BmpSet=!MiBlocks->Checked;
  MiBlocks->Checked=!MiBlocks->Checked;
  PaintBoxSnake->Invalidate();
  SaveParams();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::About1Click(TObject *Sender)
{
  FormAbout = new TFormAbout(this);
  FormAbout->ShowModal();
  delete FormAbout;
}
//---------------------------------------------------------------------------
void TFormMain::LoadParams(void)
{
  memset(&SnakeParams,0,sizeof(TSnakeParams));
  AnsiString fname = ChangeFileExt(ParamStr(0),".cfg");
  FILE *f = fopen(fname.c_str(),"rb");
  if(f)
   {
     fread(&SnakeParams,sizeof(TSnakeParams),1,f);
     fclose(f);
   }
}
//---------------------------------------------------------------------------
void TFormMain::SaveParams(void)
{
  AnsiString fname = ChangeFileExt(ParamStr(0),".cfg");
  FILE *f = fopen(fname.c_str(),"wb");
  if(f)
   {
     fwrite(&SnakeParams,sizeof(TSnakeParams),1,f);
     fclose(f);
   }
}
//---------------------------------------------------------------------------
void TFormMain::SaveHighScore(void)
{
  SnakeParams.HighScore = SnakeBuf.Score;
  LabelHS->Caption=SnakeParams.HighScore;
  AnsiString HsName;

  FormEnterName = new TFormEnterName(this);
  FormEnterName->EditName->MaxLength=30;
  while(HsName.IsEmpty())
   {
     FormEnterName->ShowModal();
     HsName = FormEnterName->EditName->Text.Trim();
   }
  delete FormEnterName;

  strcpy(SnakeParams.HsName,HsName.c_str());
  SaveParams();
}
//---------------------------------------------------------------------------
void TFormMain::ShowHighScore(void)
{
  AnsiString s;
  s.sprintf("游戏纪录: %s: %d", SnakeParams.HsName, SnakeParams.HighScore);
  Application->MessageBox(s.c_str(),"游戏纪录",MB_OK|MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::HighScore1Click(TObject *Sender)
{
  ShowHighScore();
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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