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

📄 unit1.cpp

📁 在bcb6开发环境下自己写的贪食蛇游戏,代码比较少,界面简洁,但是功能比较全!
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define VK_A       0x41
#define VK_S        0x53
#define VK_D        0x44
#define VK_W          0x57
TForm1 *Form1;
enum Dirction
{
  Left_S=1,
  Right_S=2,
  Up_S=3,
  Down_S=4,
  Enter_S=5,
};
int iStart,iKeyCode,iScore;
int iFlash;
const int X_Size=20,Y_Size=20;
const int Max_Length=400;
int Data0_Buf;
// unsigned char Snake_Data[Max_Length];
int Snake_Data[Max_Length];
typedef struct
{
  int Length;
  int Head_X,Head_Y;
  int Orientation_S;
  int Target;
}TSnake;
TSnake Snake;
typedef struct
{
  unsigned char Area[Y_Size][X_Size];
}TBuffer;
TBuffer Display_Buffer;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormShow(TObject *Sender)
{
    Randomize();
    Snake.Target=1;
    iStart=0;
    Label1->Font->Size=15;
    Label1->Font->Color=clRed;
    Label1->Caption="Press Space\nKey To Start";
    Label2->Font->Size=15;
    Label2->Font->Color=clRed;
    Label2->Caption="Score:";
    Label3->Font->Size=15;
    Label3->Font->Color=clRed;
    Label3->Caption=IntToStr(iScore);
    ScrollBox1->DoubleBuffered=true;

    TtBmp = new Graphics::TBitmap;
    TtBmp->LoadFromResourceName(0,"Grid");
    HeadBmp = new Graphics::TBitmap;
    HeadBmp->LoadFromResourceName(0,"Head");
    SnakeInitialize();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Move(int Orientation)
{
  int x=Snake.Head_X,y=Snake.Head_Y,Orien=Snake.Orientation_S;
  int iMove=0;
  switch(Orientation)
    {
      case 1:
      x--;
     // if(Snake.Orientation_S==Right_S) break;
     // Orien=Left_S;
      break;
      case 2:
      x++ ;
      //if(Snake.Orientation_S==Left_S)break;
     // Orien=Right_S;
      break;
      case 3:
      y--;
      //if(Snake.Orientation_S==Down_S)break;
      //Orien=Up_S;
      break;
      case 4:
      y++;
      //if(Snake.Orientation_S==Up_S)break;
      //Orien=Down_S;
      break;
    }
  iMove=Check_Snake(x,y,Orien);
  switch(iMove)
    {
      case 0:
      //normal
      Snake.Head_X=x;
      Snake.Head_Y=y;
      Snake.Orientation_S=Orien;
      Snake_Data[0]=Data0_Buf;
      CycData();
      ChangeToData(Snake.Head_X,Snake.Head_Y);
      SaveToBuffer();
      break;
      case 1:
      iScore+=10;
      Snake.Length++;
      Snake_Data[0]=Data0_Buf;
      CycData();
      Snake_Data[0]=Snake.Target;
      if(Snake.Target%20==0)
      	{
      		Snake.Head_X=19;
      		Snake.Head_Y=Snake.Target/20-1;
      	}
      else
      	{
      		Snake.Head_X=Snake.Target%20-1;
      		Snake.Head_Y=Snake.Target/20;
      	}
      //Snake.Head_X=Snake.Target%20-1;
      //Snake.Head_Y=Snake.Target/20;
      RandomTarget();
      SaveToBuffer();
      break;
      case 2:
      iStart=0;
      Label1->Caption="Over!\nPress Space\nKey To Start";
      break;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveToBuffer()
{
  int x,y;
  memset(&Display_Buffer,0,sizeof(TBuffer));
  for(int i=0;i<Snake.Length;i++)
    {

      //x=Snake_Data[i]%20-1;
      if(Snake_Data[i]%20==0)
      	{
      		x=19;
      		y=Snake_Data[i]/20-1;
      	}
      else
      	{
      		x=Snake_Data[i]%20-1;
      		y=Snake_Data[i]/20;
      	}
      //y=Snake_Data[i]/21;
      Display_Buffer.Area[y][x]=1;
    }
  if(Snake.Target%20==0)
  	{
  		x=19;
  		y=Snake.Target/20-1;
  	}
  else
  	{
  		x=Snake.Target%20-1;
  		y=Snake.Target/20;
  	}
  //x=Snake.Target%20-1;
  //y=Snake.Target/21;
  Display_Buffer.Area[y][x]=4;//1
/*  if(iFlash)
    {
      iFlash=0;
      Display_Buffer.Area[y][x]=0;
    }
  else if(!iFlash)
    {
      iFlash=1;
      Display_Buffer.Area[y][x]=1;
    }
*/
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Display_Snake()
{
  PaintBox1->Invalidate();
  Label3->Caption=IntToStr(iScore);

}
//---------------------------------------------------------------------------
int __fastcall TForm1::Check_Snake(int x,int y,int Orientation)
{
  //0:normal
  //1:eat
  //2:dead
  int iRevalue=0;
  switch(Orientation)
    {
      case 1:
      if(x<0)
        {
           iRevalue=2;return iRevalue;
        }
      break;
      case 2:
      if(x>=X_Size)
        {
          iRevalue=2;return iRevalue;
        }
      break;
      case 3:
      if(y<0)
        {
          iRevalue=2;return iRevalue;
        }
      break;
      case 4:
      if(y>=Y_Size)
        {
          iRevalue=2;return iRevalue;
        }
      break;
    }
  ChangeToData(x,y);
  for(int i=0;i<Snake.Length;i++)
    {
      if(Snake_Data[0]==Snake_Data[i+1])
        {
          iRevalue=2;
          return iRevalue;
        }
    }
  if(Snake_Data[0]==Snake.Target)
    {
      iRevalue=1;
      return iRevalue;
    }
  return iRevalue;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ChangeToData(int x,int y)
{
  Data0_Buf=Snake_Data[0];
  //Snake_Data[0]=y*20+x+1;
  Snake_Data[0]=y*20+x+1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CycData()
{
  for(int i=0;i<Snake.Length;i++)
    {
       Snake_Data[Snake.Length-i]=Snake_Data[Snake.Length-1-i];
    }
  Snake_Data[Snake.Length]=0;
}
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
  TPaintBox *ch=(TPaintBox *)Sender;
  TRect rc(0,0,ch->Width,Height);
  ch->Canvas->Brush->Style = bsSolid;
  ch->Canvas->Brush->Color = clPurple;
  ch->Canvas->FillRect(rc);
  for(int y=0;y<Y_Size;y++)
  {
    for(int x=0;x<X_Size;x++)
      {
        if(int n=Display_Buffer.Area[y][x])
          {
            ::BitBlt(ch->Canvas->Handle, x*16,y*16,16,16, TtBmp->Canvas->Handle, (n-1)*16,0, SRCCOPY);
          }
      }
    }
  int n=Snake.Orientation_S;
  ::BitBlt(ch->Canvas->Handle, Snake.Head_X*16,Snake.Head_Y*16,15,15, HeadBmp->Canvas->Handle, (n-1)*16,0, SRCCOPY);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  iKeyCode=0;
  if(iStart)
    {
      switch(Snake.Orientation_S)
        {
        case 1: iKeyCode=Left_S   ;break;
        case 2: iKeyCode=Right_S  ;break;
        case 3: iKeyCode=Up_S     ;break;
        case 4: iKeyCode=Down_S   ;break;
        }
      if(iKeyCode)
        {
        Move(iKeyCode);
        Display_Snake();
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  iKeyCode=0;
  switch(Key)
    {
      case VK_A:  iKeyCode=Left_S;break;
      case VK_D:  iKeyCode=Right_S;break;
      case VK_W:  iKeyCode=Up_S;break;
      case VK_S:  iKeyCode=Down_S;break;
      case VK_SPACE: iKeyCode=Enter_S;break;
    }
  if(iKeyCode)
    {
      if(iKeyCode==Enter_S)
        {
          if(iStart==0)
            {
              iStart=1;
              Label1->Caption="Runing...";
              iScore=0;
              SnakeInitialize();
              RandomTarget();
            }
        }
     else if(iStart)
        {
         int nMvoe=0;
         switch(Snake.Orientation_S)
           {
             case 1:
               if(iKeyCode==Right_S)break;
               nMvoe=1;
               Snake.Orientation_S=iKeyCode;
               break;
             case 2:
               if(iKeyCode==Left_S)break;
               nMvoe=1;
               Snake.Orientation_S=iKeyCode;
               break;
             case 3:
               if(iKeyCode==Down_S)break;
               nMvoe=1;
               Snake.Orientation_S=iKeyCode;
               break;
             case 4:
               if(iKeyCode==Up_S)break;
               nMvoe=1;
               Snake.Orientation_S=iKeyCode;
               break;
           }
         if(nMvoe)
           {
             Timer1->Enabled=false;
             Move(iKeyCode);
             Display_Snake();
             Timer1->Enabled=true;
            }

        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RandomTarget()
{
Randon_Again:
  Snake.Target=random(400);
  for(int i=0;i<Snake.Length;i++)
    {
      if(Snake.Target==Snake_Data[i])goto Randon_Again;

    }
//  Snake_Data[Snake.Length-1]=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SnakeInitialize()
{
    for(int i=0;i<Max_Length;i++)
      {
        Snake_Data[i]=0;
      }
    Snake.Length=4;
    Snake.Orientation_S=Right_S;
    Snake.Head_X=3;
    Snake.Head_Y=0;
    Snake_Data[0]=4;
    Snake_Data[1]=3;
    Snake_Data[2]=2;
    Snake_Data[3]=1;
//    RandomTarget();
    SaveToBuffer();
}

⌨️ 快捷键说明

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