贪吃蛇 源代码 C++游戏编程贪吃蛇 源代码 C++游戏编程
#include
#include
#include"snaker.h"
#include"table.h"
//ÓÎÏ?×?Ì???Òå
#define GAME_STATE_WAIT 0 //ÓÎÏ?µÈ?ý×?Ì? #define GAME_STATE_RUN 1 //ÓÎÏ?ÔËÐÐ×?Ì? #define GAME_STATE_END 2 //ÓÎÏ??áÊø×?Ì?
//?çÃæÏà?ØÎï?þ?ß?ç??Òå
#define WALL_WIDTH 80 //ꉂ...
贪吃蛇 源代码 C++游戏编程
#include
#include
#include"snaker.h"
#include"table.h"
//ÓÎÏ?×?Ì???Òå
#define GAME_STATE_WAIT 0 //ÓÎÏ?µÈ?ý×?Ì? #define GAME_STATE_RUN 1 //ÓÎÏ?ÔËÐÐ×?Ì? #define GAME_STATE_END 2 //ÓÎÏ??áÊø×?Ì?
//?çÃæÏà?ØÎï?þ?ß?ç??Òå
#define WALL_WIDTH 80 //ÍâÇ??Ó×ó??µ?ÓÎÏ?ÇøµÄ?í?È
#define WALL_HEIGHT 80 //ÍâÇ??Ó????µ?ÓÎÏ?ÇøµÄ?ß?È
#define BMP_SCORE_BOARD_WIDTH 256 //?ÖÊýÎ?Í??åµÄ?í?È #define BMP_SCORE_BOARD_HEIGHT 55 //?ÖÊýÎ?Í??åµÄ?ß?È
#define BMP_WALL_WIDTH 16 //Ç?Î?Í?µÄ?í?È #define BMP_WALL_HEIGHT 16 //Ç?Î?Í?µÄ?ß?È
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam);
void DrawGame(void);
void ShellDraw( HDC hdc );
void GameAreaDraw(HDC hdc);
void OnTimer(UINT uTIMER_ID);
void StartGame( void );
void EndGame( void );
//????Ò??ö×À×Ó
CTable table;
int tableBlockWidth = 0; //×À×ÓµÄ?ñ×ÓµÄ?í?È int tableBlockHeight = 0; //×À×ÓµÄ?ñ×ÓµÄ?ß?È int iScores = 0; //ÓÎÏ?µÄµÃ?Ö
UINT uGameState = GAME_STATE_WAIT; //µ?Ç?ÓÎÏ?×?Ì?
HDC windowDC = NULL; //windowsÆÁÄ?Éè?? HDC bufferDC = NULL; //?º?åÉè?????? HDC picDC = NULL; //snakeÍ?ÏñÄÚ?æÉè?? HDC endDC = NULL; //ÓÎÏ?ÖÕ?áÍ?ÏñÄÚ?æÉè??
HDC scoreDC = NULL; //?ÖÊý?åÄÚ?æÉè??
HWND hAppWnd = NULL; //??application???Ú?ä?ú
HBITMAP picBMP = NULL; //snakeÍ?ÏñÎ?Í??ä?ú HBITMAP bufferBMP = NULL; //?º?åÎ?Í??ä?ú HBITMAP endBMP = NULL; //ÓÎÏ?ÖÕ?áÍ?ÏñÄÚ?æ?ä?ú HBITMAP hbmpWall = NULL; //Ç?Î?Í??ä?ú HBITMAP hbmpScore = NULL; //?ÖÊý?åÎ?Í??ä?ú
HBRUSH hbrushWall = NULL; //Ç??-Ë?
//??Ê?Æ??êÊ?
UINT uSnakeMoveTimer; //ÉßµÄÒÆ??
UINT uFoodAddTimer; //Ë??ûµÄ?úÉú
//?ò?ܵÄÎ?ÖÃÊý?Ý??Òå
//GDI RECT ?ø??ÊÇ MFC CRect
RECT g_ClientRect;
RECT g_GameValueRect;
int g_iClientWidth;
int g_iClientHeight;
int WINAPI WinMain(HINSTANCE hCurrentInst,HINSTANCE hPrevInstance,
PSTR lpszCmdLine,int nCmdShow) {
WNDCLASS wndClass;
HWND hWnd;
MSG msg;
UINT width,height;
//??Òå???Ú
wndClass.style=CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hCurrentInst;
wndClass.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_MAIN));
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName="Snake_CLASS";
//×??á???Ú
RegisterClass(&wndClass);
//È?Õû?öÆÁÄ?µÄ?ß?ç
width=GetSystemMetrics(SM_CXSCREEN);
height= GetSystemMetrics(SM_CYSCREEN);
//???????Ú
hWnd=CreateWindow(
"Snake_CLASS",
"skyblue snake",
WS_POPUP,
0,0,
width,height,
NULL,NULL,
hCurrentInst,
NULL);
hAppWnd = hWnd;
//ÏÔÊ????Ú
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
//?ñÈ???Ìå?óÐ?
GetClientRect(hAppWnd, &g_ClientRect);
g_iClientWidth = g_ClientRect.right-g_ClientRect.left;
g_iClientHeight = g_ClientRect.bottom-g_ClientRect.top;
//??ÓÎÏ?ÇøÓò?Ö?É×Ý??ºá?ùΪ20?éµÄÐ????é
//???ÆËãÃ??éÇøÓòµÄ?óÐ?
tableBlockWidth = (g_iClientWidth-2*WALL_WIDTH)/20;
tableBlockHeight = (g_iClientHeight-2*WALL_HEIGHT)/20;
//?ñÈ?µ?Ç?Ö????ÚÉè??ÓëwindowDC?ØÁª
windowDC=GetDC(NULL);
//????ÓëwindowDC?æÈݵÄÄÚ?æÉè??????
bufferDC=CreateCompatibleDC(windowDC);
picDC=CreateCompatibleDC(windowDC);
endDC=CreateCompatibleDC(windowDC);
scoreDC=CreateCompatibleDC(windowDC);
//Î?Í?µÄ?õÊ????òÔØÈëÎ?Í?
bufferBMP=CreateCompatibleBitmap(windowDC,g_iClientWidth,g_iCli
entHeight);
picBMP=(HBITMAP)LoadImage(NULL,"snake.bmp",IMAGE_BITMAP,160,80,
LR_LOADFROMFILE);
hbmpWall=(HBITMAP)LoadImage(NULL,"brick.bmp",IMAGE_BITMAP,16,16
,LR_LOADFROMFILE);
endBMP =
(HBITMAP)LoadImage(NULL,"end.bmp",IMAGE_BITMAP,369,300,LR_LOADFROM
FILE);
hbmpScore=(HBITMAP)LoadImage(NULL,"scoreboard.bmp",IMAGE_BITMAP
,265,55,LR_LOADFROMFILE);
//ÉùÃ?Î?Í?ÓëÉè??????µÄ?ØÁª
SelectObject(bufferDC,bufferBMP);
SelectObject(picDC,picBMP);
SelectObject(endDC,endBMP);
SelectObject(scoreDC,hbmpScore);
//??Á??-Ë?ÓëÆäÃûÏà?ÔÓ?µÄÍ?ÏñµÄ?ØÁª??
//ÒÔ??ÓÃË?×Ó??Ç?Ë??öÀ???ÓÃPatBlt()ʵÏÖ
hbrushWall = CreatePatternBrush(hbmpWall);
StartGame();
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam) {
switch(message)
{
case WM_TIMER :
OnTimer((UINT)wParam);
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
exit(0);
break;
case VK_UP:
table.ChangeSnakeDirect(S_UP);
break;
case VK_DOWN:
table.ChangeSnakeDirect(S_DOWN);
break;
case VK_LEFT:
table.ChangeSnakeDirect(S_LEFT);
break;
case VK_RIGHT:
table.ChangeSnakeDirect(S_RIGHT);
break;
case VK_SPACE:
if( uGameState == GAME_STATE_END )
{
StartGame();
break;
}
}
return 0;
case WM_SETCURSOR:
SetCursor(NULL);
return 0;
case WM_DESTROY:
ReleaseDC(hWnd,picDC);
ReleaseDC(hWnd,bufferDC);
ReleaseDC(hWnd,windowDC);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
void DrawGame(void)
{
//?æÖÆÍâ?ÇÇøÓòµ??º?å
ShellDraw(bufferDC);
//?æÖÆÓÎÏ?ÇøÓòµ??º?å
GameAreaDraw(bufferDC);
//??Õû?ö?-Ãæ?Ó?º?åDC?????öÆÁÄ?
BitBlt(windowDC,0,0,g_iClientWidth,g_iClientHeight,bufferDC,0,0
,SRCCOPY);
}
void OnTimer(UINT uTIMER_ID)
{
if ( uTIMER_ID == uSnakeMoveTimer )
{
//ÒÆ??Éß
table.SnakeMove();
//?ì?âÊÇ?ñÅöµ?ÉíÌå(??ÈÆ)???áÊøÓÎÏ?
if(table.GetSnake()->IsHeadTouchBody(table.GetSnake()->GetPos()
[0].x,table.GetSnake()->GetPos()[0].y))
{
EndGame();
}
//?ù?ÝÉßÍ?ËùÔÚµÄÇøÓò×??öÏàÓ?µÄ??Àí
switch(table.GetData(table.GetSnake()->GetPos()[0].x,table.GetS
nake()->GetPos()[0].y))
{
case TB_STATE_FOOD:
table.ClearFood(table.GetSnake()->GetPos()[0].x,table.GetSnake(
)->GetPos()[0].y);
table.AddBlock((rand())%tableBlockWidth,(rand())%tableBlockHeig
ht);
table.GetSnake()->AddBody();
++iScores;
break;
case TB_STATE_BLOCK:
case TB_STATE_SBLOCK:
//?ì?âÊÇ?ñÅöµ?ÕÏ?-Îï???áÊøÓÎÏ?
EndGame();
break;
}
//ÏÔÊ?
DrawGame();
}
else if ( uTIMER_ID == uFoodAddTimer )
{//??Ê??ÓÊ?Îï
table.AddFood((rand())%tableBlockWidth,(rand())%tableBlockHeigh
t);
}
}
void StartGame()
{
iScores=0;
//×ÀÃæµÄ?õÊ???
table.InitialTable(tableBlockWidth,tableBlockHeight);
table.GetSnake()->ChangeDirect(S_RIGHT);
table.GetSnake()->SetHeadPos(tableBlockWidth/2,tableBlockHeight
/2);
//Ô?ÏÈËæ?ú?úÉú???öÊ?Îï
srand( (unsigned)time(NULL) );
for(int iFoodNum=0; iFoodNum<4; iFoodNum++)
{
table.AddFood((rand())%tableBlockWidth,(rand())%tableBlockHeigh
t);
}
//????ÏÂÖÖ×ÓÒ??ÉÒÔÖ??ÓÓÃrand(),
//µ?ÊÇÃ??ÎÓÎÏ??ªÊ???ÊÇ?úÉúÍêÈ?Ò?ÑùµÄÎ?Ëæ??ÐòÁÐ
//?ò?ª??Ê?Æ?
uSnakeMoveTimer = SetTimer(hAppWnd,500,100,NULL);
uFoodAddTimer = SetTimer(hAppWnd,600,7000,NULL);
uGameState = GAME_STATE_RUN;
}
void EndGame( void )
{
//?Ø?Õ??Ê?Æ?
KillTimer(hAppWnd,uSnakeMoveTimer);
KillTimer(hAppWnd,uFoodAddTimer);
uGameState = GAME_STATE_END;
}
void ShellDraw( HDC hdc )
{
// HDC hMemDc;
// BOOL ret = TRUE;
// HDC hMemoryDC;
// HBITMAP hbmp;
//?ÖÊýÌáÊ?ÏÔÊ?ÎÄ×Ö
char szText[30] = "Score: ";
char szNum[20];
int iNowScore = iScores*100;
itoa(iNowScore,szNum,10);
strcat(szText, szNum);
RECT rt, rect;
GetClientRect(hAppWnd, &rt);
//Ç?µÄ?æÖÆ
SelectObject(hdc,hbrushWall);
PatBlt(hdc,rt.left,rt.top,rt.right,rt.bottom,PATCOPY);
//ÄÚ??ÓÎÏ?ÇøµÄ?×É?µ×Æ?Ãæ
rect.left = rt.left+WALL_WIDTH;
rect.top = rt.top + WALL_HEIGHT;
rect.right = rt.right - WALL_WIDTH;
rect.bottom = rt.bottom - WALL_HEIGHT;
FillRect(hdc, &rect, (HBRUSH) (COLOR_WINDOW+1));
//?ÖÊýÌáÊ??åµÄ?æÖÆ
/* hMemoryDC = CreateCompatibleDC(NULL);
hbmp = CreateCompatibleBitmap(hdc,265,55);
SelectObject(hMemoryDC,hbrushScore);
SelectObject(hMemoryDC,hbmp);
PatBlt(hMemoryDC,0,0,256,55,PATCOPY);
BitBlt(hdc,GetSystemMetrics(SM_CXSCREEN)/3,
10,256,55,hMemoryDC,0,0,SRCCOPY); */
BitBlt(hdc,GetSystemMetrics(SM_CXSCREEN)/3,
10,256,55,scoreDC,0,0,SRCCOPY);
//?ÖÊýµÄ?òÓ??æÖÆ
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, GetSystemMetrics(SM_CXSCREEN)/3+50, 30,szText,strlen(szText) );
}
void GameAreaDraw(HDC hdc)
{
int i,j;
int x,y, x_pos,y_pos;
BitmapState state;
char strMark[20];
//?æÖÆË??ûÓë ???û
for(i=0;iGetPos()[0].x;
y=table.GetSnake()->GetPos()[0].y;
x_pos = x*20+WALL_WIDTH;
y_pos = y*20+WALL_HEIGHT;
state=table.GetSnake()->GetStateArray()[0];
switch(state)
{
case M_UP_UP:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,20,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,20,SRCAND);
break;
case M_DOWN_DOWN:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,20,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,20,SRCAND);
break;
case M_LEFT_LEFT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,20,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,20,SRCAND);
break;
case M_RIGHT_RIGHT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,20,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,20,SRCAND);
break;
}
//?ù?Ý???öÉßÉí?ÚµãµÄ×?Ì??æÖÆÉßÉíµÄÐÎ×?
for(i=1;iGetLength()-1;i++)
{
x=table.GetSnake()->GetPos()[i].x;
y=table.GetSnake()->GetPos()[i].y;
x_pos = x*20+WALL_WIDTH;
y_pos = y*20+WALL_HEIGHT;
state=table.GetSnake()->GetStateArray()[i];
switch(state)
{
case M_UP_UP:
case M_DOWN_DOWN:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,40,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,40,SRCAND);
break;
case M_LEFT_LEFT:
case M_RIGHT_RIGHT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,40,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,40,SRCAND);
break;
case M_RIGHT_DOWN:
case M_UP_LEFT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,60,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,60,SRCAND);
break;
case M_LEFT_DOWN:
case M_UP_RIGHT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,60,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,60,SRCAND);
break;
case M_RIGHT_UP:
case M_DOWN_LEFT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,40,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,40,SRCAND);
break;
case M_LEFT_UP:
case M_DOWN_RIGHT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,40,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,40,SRCAND);
break;
}
}
//?æÖÆÉßÎ??Í
x=table.GetSnake()->GetPos()[table.GetSnake()->GetLength()-1].x;
y=table.GetSnake()->GetPos()[table.GetSnake()->GetLength()-1].y;
x_pos = x*20+WALL_WIDTH;
y_pos = y*20+WALL_HEIGHT;
state=table.GetSnake()->GetStateArray()[table.GetSnake()->GetLength()-1];
switch(state)
{
case M_UP_UP:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,60,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,60,SRCAND);
break;
case M_DOWN_DOWN:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,0,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,0,SRCAND);
break;
case M_LEFT_LEFT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,60,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,60,SRCAND);
break;
case M_RIGHT_RIGHT:
BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,0,SRCPAINT);
BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,0,SRCAND);
break;
}
if(uGameState == GAME_STATE_END)
{//?æÖÆÓÎÏ??áÊøÍ?Ïñ
int x_pos = g_iClientWidth/3;
int y_pos = g_iClientHeight/4;
BitBlt(hdc, x_pos, y_pos, 369, 300, endDC, 0, 0, SRCCOPY);
}
}
本文档为【贪吃蛇 源代码 C++游戏编程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。