#include<windows.h>
struct Boarder
{
int Width_Ex,Height_Ex;
int Per_Width,Per_Height;
};
struct Node
{
int x,y;
};
struct Snack
{
struct Node node[100];
int len;
};
struct Snack snack;
struct Node foot;
struct Boarder boarder;
bool GameOver;
int direct;
float lastTime;
float nowTime;
HDC hdc;
HDC hdcMem;
HBITMAP hBitmapMem;
HWND hWnd;
RECT wndrect;
char title[10]="GAME";
void Init();
void Draw();
void FoodChange();
void TestRight();
void TestLeft();
void TestUp();
void TestDown();
LRESULT Windowproc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdLine,int nCmdShow)
{
MSG msg;
WNDCLASS wc;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)Windowproc;
wc.cbWndExtra =0;
wc.cbClsExtra =0;
wc.hInstance = hInstance;
wc.hIcon =NULL;
wc.hCursor =NULL;
wc.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszClassName =title;
wc.lpszMenuName =NULL;
RegisterClass(&wc);
hWnd=CreateWindow(title,title,WS_OVERLAPPEDWINDOW,0,0,800,600,NULL,NULL,hInstance,NULL);
if(!hWnd) return 0;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
Init();
while (1)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message ==WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Draw();
nowTime=(float)timeGetTime();
if(nowTime>400+lastTime)
{
lastTime=nowTime;
if(direct==0)
TestUp();
if(direct==1)
TestDown();
if(direct==2)
TestLeft();
if(direct==3)
TestRight();
}
if(GameOver)
{
break;
}
}
}
return 0;
}
LRESULT Windowproc(HWND hwnd ,UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 1;
case WM_KEYDOWN:
{
switch (wParam)
{
case VK_ESCAPE:
PostMessage(hwnd,WM_CLOSE,0,0);
break;
case VK_LEFT:
{
if(direct!=3)
{
direct=2;
TestLeft();
}
}
break;
case VK_RIGHT:
{
if(direct!=2)
{
direct=3;
TestRight();
}
}
break;
case VK_UP:
{
if(direct!=1)
{
direct=0;
TestUp();
}
}
break;
case VK_DOWN:
{
if(direct!=0)
{
direct=1;
TestDown();
}
}
break;
}
break;
}
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
void Init()
{
hdc=GetDC(hWnd);
GetWindowRect(hWnd,&wndrect);
hdcMem=CreateCompatibleDC(hdc);
hBitmapMem=CreateCompatibleBitmap(hdc,800,600);
SelectObject(hdcMem,hBitmapMem);
boarder.Per_Width =(int)(2.0/3.0*(wndrect.right /14.0));
boarder.Per_Height =(int)(wndrect.bottom /14.0);
boarder.Width_Ex =(int)2*boarder.Per_Width ;
boarder.Height_Ex =(int)2*boarder.Per_Height ;
snack.len =2;
snack.node[0].x =4;snack.node[0].y =4;
snack.node[1].x =4;snack.node[1].y =3;
foot.x =rand()%10;
foot.y =rand()%10;
GameOver=false;
direct=0;
lastTime=(float)timeGetTime();
}
void Draw()
{
HBRUSH hbrush1,hbrush2,hbrush3,hbrush4,hbrush_old;
hbrush1=(HBRUSH)CreateSolidBrush(RGB(100,100,100));
hbrush_old=(HBRUSH)SelectObject(hdcMem,hbrush1);
Rectangle(hdcMem,0,0,800,600);
hbrush2=(HBRUSH)CreateSolidBrush(RGB(50,50,200));
SelectObject(hdcMem,hbrush2);
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
Rectangle(hdcMem,
boarder.Width_Ex + j* boarder.Per_Width,
boarder.Height_Ex +i*boarder.Per_Height ,
boarder.Width_Ex + (j+1)* boarder.Per_Width,
boarder.Height_Ex +(i+1)*boarder.Per_Height);
}
}
hbrush3=(HBRUSH)CreateSolidBrush(RGB(0,200,0));
SelectObject(hdcMem,hbrush3);
for(i=0;i<snack.len ;i++)
{
Rectangle(hdcMem,
boarder.Width_Ex + snack.node[i].x * boarder.Per_Width,
boarder.Height_Ex +snack.node[i].y *boarder.Per_Height ,
boarder.Width_Ex + (snack.node[i].x +1)* boarder.Per_Width,
boarder.Height_Ex +(snack.node[i].y +1)*boarder.Per_Height);
}
hbrush4=(HBRUSH)CreateSolidBrush(RGB(200,50,50));
SelectObject(hdcMem,hbrush4);
Rectangle(hdcMem,boarder.Width_Ex + foot.x *boarder.Per_Width ,
boarder.Height_Ex +foot.y * boarder.Per_Height ,
boarder.Width_Ex + (foot.x +1) *boarder.Per_Width ,
boarder.Height_Ex +(foot.y+1) * boarder.Per_Height) ;
BitBlt(hdc,0,0,800,600,hdcMem,0,0,SRCCOPY);
SelectObject(hdcMem,hbrush1);
DeleteObject(hbrush1);
SelectObject(hdcMem,hbrush2);
DeleteObject(hbrush2);
SelectObject(hdcMem,hbrush3);
DeleteObject(hbrush3);
SelectObject(hdcMem,hbrush4);
DeleteObject(hbrush4);
}
void FootChange()
{
foot.x =rand()%10;
foot.y =rand()%10;
}
void TestLeft()
{
int i;
if(snack.node[0].x ==0)
{
GameOver=true;
return;
}
if(snack.node[0].x-1 == foot.x && snack.node[0].y == foot.y )
{
snack.len ++;
for(i=snack.len ;i>0;i--)
{
snack.node[i]=snack.node[i-1];
}
snack.node[0]=foot;
FootChange();
}
else
{
for(i=snack.len ;i>0;i--)
{
snack.node[i]=snack.node[i-1];
}
snack.node[0].x --;
}
}
void TestRight()
{
int i;
if(snack.node[0].x ==9)
{
GameOver=true;
return;
}
if(snack.node[0].x + 1 == foot.x && snack.node[0].y == foot.y )
{
snack.len ++;
for(i=snack.len ;i>0;i--)
{
snack.node[i]=snack.node[i-1];
}
snack.node[0]=foot;
FootChange();
}
else
{
for(i=snack.len ;i>0;i--)
{
snack.node[i]=snack.node[i-1];
}
snack.node[0].x ++;
}
}
void TestDown()
{
int i;
if(snack.node[0].y ==9)
{
GameOver=true;
return;
}
if(snack.node[0].x == foot.x && snack.node[0].y+1 == foot.y )
{
snack.len ++;
for(i=snack.len ;i>0;i--)
{
snack.node[i]=snack.node[i-1];
}
snack.node[0]=foot;
FootChange();
}
else
{
for(i=snack.len ;i>0;i--)
{
snack.node[i]=snack.node[i-1];
}
snack.node[0].y ++;
}
}
void TestUp()
{
int i;
if(snack.node[0].y ==0)
{
GameOver=true;
return;
}
if(snack.node[0].x == foot.x && snack.node[0].y-1 == foot.y )
{
snack.len ++;
for(i=snack.len ;i>0;i--)
{
snack.node[i]=snack.node[i-1];
}
snack.node[0]=foot;
FootChange();
}
else
{
for(i=snack.len ;i>0;i--)
{
snack.node[i]=snack.node[i-1];
}
snack.node[0].y--;
}
}