为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

贪吃蛇 源代码 C++游戏编程

2017-09-20 18页 doc 44KB 261阅读

用户头像

is_601191

暂无简介

举报
贪吃蛇 源代码 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++游戏编程
贪吃蛇 源代码 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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索