`
huobengluantiao8
  • 浏览: 1029785 次
文章分类
社区版块
存档分类
最新评论

win32 C 贪吃蛇源码

 
阅读更多

#define MAXSIZE 50
struct Snake
{
POINT m_pos[MAXSIZE]; //每一个结点的x,y坐标
int m_direction; //可自行设定方向,比如0朝上,1朝右,2朝下,3朝左
int len;
};
Snake m_snake;
#define WIDTH 20
#define HEIGHT 20
HBITMAP bitmap;
int row=23;
int col=23;
int score = 0;
int rank = 1;
POINT m_food;
bool t_start = false; //空格键暂停
void MyPaint(HDC hdc)
{
HBRUSH hbr=CreateSolidBrush(RGB(200,0,0));//定义白色画刷
SelectObject(hdc,hbr);
for(int y=0;y<row;y++)
{
for(int x=0;x<col;x++)
{
Rectangle(hdc,x*WIDTH,y*HEIGHT,(x+1)*WIDTH,(y+1)*HEIGHT);
}
}
HBRUSH hbrgreen=CreateSolidBrush(RGB(0,255,0));
SelectObject(hdc,hbrgreen);
for(int n=0;n<m_snake.len;n++)
{
Rectangle(hdc,m_snake.m_pos[n].x*WIDTH,m_snake.m_pos[n].y*HEIGHT,
(m_snake.m_pos[n].x+1)*WIDTH,(m_snake.m_pos[n].y+1)*HEIGHT);
}
HBRUSH hbrblue=CreateSolidBrush(RGB(0,0,255));
SelectObject(hdc,hbrblue);
Rectangle(hdc,m_food.x*WIDTH,m_food.y*HEIGHT,(m_food.x+1)*WIDTH,(m_food.y+1)*HEIGHT);

//加载位图
HBITMAP hbmp = (HBITMAP)LoadImage(NULL,"snake.bmp",IMAGE_BITMAP,290,447,LR_LOADFROMFILE);
HDC mdc = CreateCompatibleDC(hdc);
SelectObject(mdc,hbmp);
BitBlt(hdc,460,14,800,570,mdc,0,0,SRCCOPY);
}
#include <time.h>
void generatefood() //产生食物 使用递归防止食物产生在蛇身上
{
srand( (unsigned)time( NULL ) );
m_food.x=rand()%23;
m_food.y=rand()%23;
for( int n=0;n<m_snake.len-1;n++)
{
if(m_snake.m_pos[n].x == m_food.x && m_snake.m_pos[n].y == m_food.y)
{
generatefood();
}
}
}
void init_snake()
{
m_snake.len=1; //设定蛇的长度
srand( (unsigned)time( NULL ) );//设定蛇的长度
m_snake.m_pos[0].x=10; //设定蛇头的坐标位置
m_snake.m_pos[0].y=10;
m_snake.m_direction=1; //设定蛇的方向,1表示朝右


for(int n=1;n<MAXSIZE;n++)
{
m_snake.m_pos[n].x=-1;
m_snake.m_pos[n].y=-1;
}
m_food.x=rand()%20;
m_food.y=rand()%20;
for( n=0;n<m_snake.len-1;n++)
{
if(m_snake.m_pos[n].x == m_food.x &&m_snake.m_pos[n].y == m_food.y)
{
init_snake();
break;
}
}
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;


hInst = hInstance; // Store instance handle in our global variable


hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);


if (!hWnd)
{
return FALSE;
}


ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

init_snake();
HDC hdc=GetDC(hWnd);
MyPaint(hdc);


TextOut(hdc,530,0,"Rank: 1 , SCORE: 0",strlen("Rank: 1 , SCORE: 0"));
TextOut(hdc,500,460,"↑↓←→控制方向,Space键暂停",strlen("↑↓←→控制方向,Space键暂停"));
TextOut(hdc,100,460,"源码请访问http://blog.csdn.net/zjbpku",strlen("源码请访问http://blog.csdn.net/zjbpku"));
return TRUE;
}


//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);


switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_KEYDOWN:
switch(wParam) // 控制方向
{
case VK_SPACE:
if(t_start == true)
{
KillTimer(hWnd,1);
t_start = false;
}
break;
case VK_UP:
if(t_start == false)
{
t_start = !t_start;
switch(rank)
{
case 1:
SetTimer(hWnd,1,300,NULL);
break;
case 2:
SetTimer(hWnd,1,100,NULL);
break;
case 3:
SetTimer(hWnd,1,80,NULL);
break;
case 4:
SetTimer(hWnd,1,60,NULL);
break;
}
m_snake.m_direction=0;
}
else
{
m_snake.m_direction=0;
}
break;
case VK_RIGHT:
if(t_start == false)
{
t_start = !t_start;
switch(rank)
{
case 1:
SetTimer(hWnd,1,300,NULL);
break;
case 2:
SetTimer(hWnd,1,100,NULL);
break;
case 3:
SetTimer(hWnd,1,80,NULL);
break;
case 4:
SetTimer(hWnd,1,60,NULL);
break;
}
m_snake.m_direction=1;
}
else
{
m_snake.m_direction=1;
}
break;
case VK_DOWN:
if(t_start == false)
{
t_start = !t_start;
switch(rank)
{
case 1:
SetTimer(hWnd,1,300,NULL);
break;
case 2:
SetTimer(hWnd,1,100,NULL);
break;
case 3:
SetTimer(hWnd,1,80,NULL);
break;
case 4:
SetTimer(hWnd,1,60,NULL);
break;
}
m_snake.m_direction=2;
}
else
{
m_snake.m_direction=2;
}
break;
case VK_LEFT:
if(t_start == false)
{
t_start = !t_start;
switch(rank)
{
case 1:
SetTimer(hWnd,1,300,NULL);
break;
case 2:
SetTimer(hWnd,1,100,NULL);
break;
case 3:
SetTimer(hWnd,1,80,NULL);
break;
case 4:
SetTimer(hWnd,1,60,NULL);
break;
}

m_snake.m_direction=3;
}
else
{
m_snake.m_direction=3;
}
break;
}
break;
case WM_TIMER:
{

//更新蛇的其他部分;
for(int n=m_snake.len-1;n>=1;n--)
{
m_snake.m_pos[n]=m_snake.m_pos[n-1];
}
//更新蛇的坐标,0朝上,1朝右,2朝下,3朝左
if(0==m_snake.m_direction)
{
if(m_snake.m_pos[0].y > 0)
{
m_snake.m_pos[0].y=m_snake.m_pos[0].y-1;
}
else if(rank == 4 && m_snake.m_pos[0].y == 0)
{
m_snake.m_pos[0].y = col-1;
}
else
{
KillTimer(hWnd,1);
score = 0;
MessageBox(hWnd,"The game is Over !","Warning",MB_ICONWARNING);
init_snake();
t_start = false;
}
}
if(1==m_snake.m_direction)
{
if(m_snake.m_pos[0].x < row-1)
{
m_snake.m_pos[0].x=m_snake.m_pos[0].x+1;
}
else if(rank == 4 && m_snake.m_pos[0].x == row-1 )
{
m_snake.m_pos[0].x = 0;
}
else
{
KillTimer(hWnd,1);
score = 0;
MessageBox(hWnd,"The game is Over !","Warning",MB_ICONWARNING|MB_OK);
init_snake();
t_start = false;
}
}
if(2==m_snake.m_direction)
{
if(m_snake.m_pos[0].y < col-1)
{
m_snake.m_pos[0].y=m_snake.m_pos[0].y+1;
}
else if(rank == 4 && m_snake.m_pos[0].y == col-1)
{
m_snake.m_pos[0].y = 0;
}
else
{
KillTimer(hWnd,1);
score = 0;
MessageBox(hWnd,"The game is Over !","Warning",MB_ICONWARNING|MB_OK);
init_snake();
t_start = false;
}
}
if(3==m_snake.m_direction)
{
if(m_snake.m_pos[0].x > 0)
{
m_snake.m_pos[0].x=m_snake.m_pos[0].x-1;
}
else if(rank==4 && m_snake.m_pos[0].x ==0 )
{
m_snake.m_pos[0].x = row -1;
}
else
{
KillTimer(hWnd,1);
score = 0;
MessageBox(hWnd,"The game is Over !","Warning",MB_ICONWARNING|MB_OK);
init_snake();
t_start = false;
}
}


//吃食物
if(m_snake.m_pos[0].x==m_food.x&&m_snake.m_pos[0].y==m_food.y)
{
m_snake.len++;
PlaySound("eatfood.wav", NULL, SND_SYNC); //声音
score += 10;
if(rank < 5)
{
if(score == 100)
{
rank++;
SetTimer(hWnd,1,300,NULL);
KillTimer(hWnd,1);
MessageBox(hWnd,"恭喜你进入下一关","提示",MB_ICONINFORMATION|MB_OK);
t_start = false;
}
if(score == 300)
{
rank++;
SetTimer(hWnd,1,100,NULL);
KillTimer(hWnd,1);
MessageBox(hWnd,"恭喜你进入下一关","提示",MB_ICONINFORMATION|MB_OK);
t_start = false;
}
if(score == 350)
{
rank++;
SetTimer(hWnd,1,60,NULL);
KillTimer(hWnd,1);
MessageBox(hWnd,"恭喜你进入超级模式","提示",MB_ICONINFORMATION|MB_OK);
t_start = false;
}
}
else
{
rank = 4;
}
generatefood();
}
//判断是否吃到自身
for(int k =1;k < m_snake.len;k++)
{
if(m_snake.m_pos[0].x == m_snake.m_pos[k].x && m_snake.m_pos[0].y == m_snake.m_pos[k].y)
{
KillTimer(hWnd,1);
MessageBox(hWnd,"GAME OVER !!!","Warning",MB_ICONWARNING);
init_snake();
score = 0;
t_start = false;
break;
}
}
PlaySound("smove.wav", NULL, SND_ASYNC);
HDC hdc=GetDC(hWnd);
char strtext[50];
if(rank == 4)
{
TextOut(hdc,610,100,"你已进入超级模式",strlen("你已进入超级模式"));
}
sprintf(strtext,"Rank: %d , SCORE: %d",rank,score);
TextOut(hdc,530,0, strtext, strlen(strtext));
MyPaint(hdc);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MyPaint(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}


// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;


case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics