#include<Windows.h>
#include<stdio.h>
#include<time.h>
const UINT WM_RESTART=WM_USER+100;
const int M(1),Max_Len(30),MaxN(100),size(20),Time(1000);
POINT pt[Max_Len],food;
char used[MaxN][MaxN];
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int nCmdShow)
{
srand(time(NULL));
static TCHAR szAppName[]=TEXT("Snake");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wndclass);
hwnd=CreateWindow(szAppName,
TEXT("Snake"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.lParam;
}
POINT randFood(int Max_x,int Max_y)
{
POINT p;
do
{
p.x=rand()%(Max_x)+1;
p.y=rand()%(Max_y)+1;
}while(used[p.x][p.y]);
used[p.x][p.y]=2;
return p;
}
void restart(HWND hwnd,int &Length,BOOL &bStart,POINT &food,int Max_x,int Max_y,POINT pt[],UINT &Next)
{
Next=VK_RIGHT;
bStart=0;
Length=1;
memset(used,0,sizeof(used));
used[1][1]=1;
food=randFood(Max_x,Max_y);
used[food.x][food.y]=2;
pt[0].x=pt[0].y=size;
SetTimer(hwnd,M,Time+10,NULL);
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static int xCount,yCount,hight,width;
static int Length(1);
static UINT Next(VK_RIGHT);
static BOOL bStart(0),bWin(0);
HDC hdc;
PAINTSTRUCT ps;
// HPEN hPen=CreatePen(PS_INSIDEFRAME,2,RGB(0,0,255));
HBRUSH hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
HBRUSH hBrush2=(HBRUSH)GetStockObject(GRAY_BRUSH);
switch(message)
{
case WM_TIMER:
if(bStart)
SendMessage(hwnd,WM_KEYDOWN,Next,0);
break;
case WM_SIZE:
hight=HIWORD(lParam);
width=LOWORD(lParam);
xCount=width/size;
yCount=hight/size;
if(xCount==0||yCount==0)
bStart=false;
else
restart(hwnd,Length,bStart,food,xCount,yCount,pt,Next);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SelectObject(hdc,hBrush);
for(int i=0;i<=width;i+=size)
{
MoveToEx(hdc,i,0,NULL);
LineTo(hdc,i,yCount*size);
}
for(int j=0;j<=hight;j+=size)
{
MoveToEx(hdc,0,j,NULL);
LineTo(hdc,xCount*size,j);
}
for(int i=0;i<Length;i++)
Rectangle(hdc,pt[i].x-size,pt[i].y-size,pt[i].x,pt[i].y);
DeleteObject(hBrush);
SelectObject(hdc,hBrush2);
Rectangle(hdc,(food.x-1)*size,(food.y-1)*size,food.x*size,food.y*size);
DeleteObject(hBrush2);
EndPaint(hwnd,&ps);
break;
case WM_KEYDOWN:
{
int x,y;
switch(wParam)
{
case VK_UP:
if(Next==VK_DOWN)
{
SendMessage(hwnd,WM_RESTART,0,0);
return 0;
}
y=pt[Length-1].y-size;
x=pt[Length-1].x;
break;
case VK_DOWN:
if(Next==VK_UP)
{
SendMessage(hwnd,WM_RESTART,0,0);
return 0;
}
y=pt[Length-1].y+size;
x=pt[Length-1].x;
break;
case VK_LEFT:
if(Next==VK_RIGHT)
{
SendMessage(hwnd,WM_RESTART,0,0);
return 0;
}
y=pt[Length-1].y;
x=pt[Length-1].x-size;
break;
case VK_RIGHT:
if(Next==VK_LEFT)
{
SendMessage(hwnd,WM_RESTART,0,0);
return 0;
}
y=pt[Length-1].y;
x=pt[Length-1].x+size;
break;
default :
return 0;
}
if(x>xCount*size||y>yCount*size||x<size||y<size)
{
SendMessage(hwnd,WM_RESTART,0,0);
return 0;
}
if(used[x/size][y/size]==1&&!(pt[0].x==x&&pt[0].y==y))
{
SendMessage(hwnd,WM_RESTART,0,0);
return 0;
}
else
{
bStart=true;
if(used[x/size][y/size]==2)
{
pt[Length].x=x;
pt[Length].y=y;
used[x/size][y/size]=1;
Length++;
if(Length==Max_Len)
{
bWin=true;
SendMessage(hwnd,WM_RESTART,0,0);
bWin=false;
return 0;
}
SetTimer(hwnd,M,Time-Time*Length/Max_Len+10,NULL);
food=randFood(xCount,yCount);
}
else
{
used[pt[0].x/size][pt[0].y/size]=0;
for(int i=1;i<Length;i++)
pt[i-1]=pt[i];
used[x/size][y/size]=1;
pt[Length-1].x=x;
pt[Length-1].y=y;
}
InvalidateRect(hwnd,NULL,TRUE);
Next=wParam;
}
break;
}
case WM_RESTART:
restart(hwnd,Length,bStart,food,xCount,yCount,pt,Next);
if(MessageBox(hwnd,bWin?TEXT("你贏了!\n要繼續嗎?"):TEXT("你輸了!\n要繼續嗎?"),TEXT("消息"),MB_YESNO)==IDNO)
{
SendMessage(hwnd,WM_DESTROY,0,0);
return 0;
}
InvalidateRect(hwnd,NULL,TRUE);
break;
case WM_DESTROY:
KillTimer(hwnd,M);
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
自己寫的貪喫蛇
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.