📄 unit1.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 + -