




免费预览已结束,剩余15页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
source code:#include /main.cpp #include #includesnaker.h #includetable.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_iClientHeight); 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_LOADFROMFILE); 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.GetSnake()-GetPos()0.y) case TB_STATE_FOOD: table.ClearFood(table.GetSnake()-GetPos()0.x,table.GetSnake()-GetPos()0.y); table.AddBlock(rand()%tableBlockWidth,(rand()%tableBlockHeight); 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()%tableBlockHeight); 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; iFoodNum4; iFoodNum+) table.AddFood(rand()%tableBlockWidth,(rand()%tableBlockHeight); /不部下种子也可以直接用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 szText30 = Score: ; char szNum20;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 strMark20;/绘制水果与 毒果 for(i=0;itableBlockHeight;i+) for(j=0;jGetPos()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); #include snake.hCSnake:CSnake(int x_pos,int y_pos,int len) if(len1) len=1; int i;m_length=len; /蛇的身体体长/初始化蛇的坐标位置 m_pPos=new SPointm_length+2; m_pPos0.x=x_pos;m_pPos0.y=y_pos; for(i=1;im_length+2;i+) m_pPosi.x=0;m_pPosi.y=0; /初始化蛇的运动状态 m_newSnake.head=S_NONE; m_oldSnake.head=S_NONE; m_newSnake.body=new MoveStatem_length; m_oldSnake.body=new MoveStatem_length; for(i=0;im_length;i+) m_newSnake.bodyi=S_NONE; m_newSnake.bodyi=S_NONE; m_newSnake.tail=S_NONE; m_oldSnake.tail=S_NONE;/初始化蛇的位图显示状态 m_pStateArray=new BitmapStatem_length+2; for(i=0;im_length+2;i+) m_pStateArrayi=M_NONE; CSnake:CSnake() SAFE_DELETE_ARRAY(m_pStateArray); SAFE_DELETE_ARRAY(m_pPos); / /根据新旧两个身体的运动趋势情况,返回当前应当显示的身体状态 / BitmapState CSnake:GetRightState(MoveState oldDirect,MoveState newDirect) BitmapState res; switch(oldDirect) case S_NONE: switch(newDirect) case S_NONE: res=M_NONE; break; case S_UP: res=M_UP_UP; break; case S_DOWN: res=M_DOWN_DOWN; break; case S_LEFT: res=M_LEFT_LEFT; break; case S_RIGHT: res=M_RIGHT_RIGHT; break; break; case S_UP: switch(newDirect) case S_UP: res=M_UP_UP; break; case S_LEFT: res=M_UP_LEFT; break; case S_RIGHT: res=M_UP_RIGHT; break; break; case S_DOWN: switch(newDirect) case S_DOWN: res=M_DOWN_DOWN; break; case S_LEFT: res=M_DOWN_LEFT; break; case S_RIGHT: res=M_DOWN_RIGHT; break; break; case S_LEFT: switch(newDirect) case S_LEFT: res=M_LEFT_LEFT; break; case S_UP: res=M_LEFT_UP; break; case S_DOWN: res=M_LEFT_DOWN; break; break; case S_RIGHT: switch(newDirect) case S_RIGHT: res=M_RIGHT_RIGHT; break; case S_UP: res=M_RIGHT_UP; break; case S_DOWN: res=M_RIGHT_DOWN; break; break; return res; / /改变方向 / void CSnake:ChangeDirect(MoveState d) / 改变方向的条件:非对立方向 / 只能为其左,前,右方 switch(d) case S_NONE: m_newSnake.head=d; break; case S_UP: if(m_newSnake.head!=S_DOWN) m_newSnake.head=d; break; case S_DOWN: if(m_newSnake.head!=S_UP) m_newSnake.head=d; break; case S_LEFT: if(m_newSnake.head!=S_RIGHT) m_newSnake.head=d; break; case S_RIGHT: if(m_newSnake.head!=S_LEFT) m_newSnake.head=d; break; / /蛇移动 / void CSnake:Move(void) int i; /1.计算新状态各个节点的状态 /保存蛇身体各个部位的形状 for(i=0;i0;i-) m_newSnake.bodyi=m_newSnake.bodyi-1; m_newSnake.body0=m_newSnake.head;/根据新旧状态特性取正确的状态 m_pStateArray0=GetRightState(m_oldSnake.head,m_newSnake.head); for(i=0;i0;i-) m_pPosi=m_pPosi-1; /蛇头的新位置根据蛇的运动方向判断做相应偏移 switch(m_newSnake.head) case S_UP: m_pPos0.y-=SNAKE_MOVE; break; case S_DOWN: m_pPos0.y+=SNAKE_MOVE; break; case S_LEFT: m_pPos0.x-=SNAKE_MOVE; break; case S_RIGHT: m_pPos0.x+=SNAKE_MOVE; break; / /蛇的身体增长 / void CSnake:AddBody(int n) / 分配临时的save类型变量,用作保留 / 蛇的各种数据状态 int i; Snake_Struct saveOldSnake,saveNewSnake; BitmapState *savestateArray; SPoint *savePos;/保存蛇的位置信息 / pos savePos=new SPointm_length+2; for(i=0;im_length+2;i+) savePosi=m_pPosi;/保存蛇的状态信息 / 1.oldSnake / 2.newSnake / 3.stateArray/1 saveOldSnake.head=m_oldSnake.head; saveOldSnake.body=new MoveStatem_length; for(i=0;im_length;i+) saveOldSnake.bodyi=m_oldSnake.bodyi; saveOldSnake.tail=m_oldSnake.tail; /2 saveNewSnake.head=m_newSnake.head; saveNewSnake.body=new MoveStatem_length; for(i=0;im_length;i+) saveNewSnake.bodyi=m_newSnake.bodyi; saveNewSnake.tail=m_newSnake.tail; /3 savestateArray=new BitmapStatem_length+2; for(i=0;im_length+2;i+) savestateArrayi=m_pStateArrayi;/将长度增长 m_length+=n;/释放所有蛇的身体存储数据空间 delete m_oldSnake.body;m_oldSnake.body=NULL; delete m_newSnake.body;m_newSnake.body=NULL; delete m_pStateArray;m_pStateArray=NULL; delete m_pPos;m_pPos=NULL;/创建并初始化增长后的蛇的存储数据空间m_newSnake.head=S_NONE; m_oldSnake.head=S_NONE; m_newSnake.body=new MoveStatem_length; m_oldSnake.body=new MoveStatem_length; for(i=0;im_length;i+) m_newSnake.bodyi=S_NONE; m_newSnake.bodyi=S_NONE; m_newSnake.tail=S_NONE; m_oldSnake.tail=S_NONE;m_pStateArray=new BitmapStatem_length+2; for(i=0;im_length+2;i+) m_pStateArrayi=M_NONE; m_pPos=new SPointm_length+2; for(i=0;im_length+2;i+) m_pPosi.x=0; m_p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年4月陕西汉中市中心医院招聘120指挥平台接线员2人考前自测高频考点模拟试题附答案详解(突破训练)
- 2024年福建省湄洲湾职业技术学校教师招聘考试真题
- 2025年三门峡黄河明珠(集团)有限公司公开招聘高校毕业生8人模拟试卷附答案详解(完整版)
- 2025年三环集团留学生招聘考前自测高频考点模拟试题及1套完整答案详解
- 公司数据通信机务员岗位工艺技术规程
- 钒铁浸滤工岗位安全技术规程
- 公司柔性版制版员岗位设备安全技术规程
- 2025江西九江市武宁县医疗卫生单位招聘劳务派遣人员3人考前自测高频考点模拟试题有答案详解
- 液氯工培训教材编写参与考核试卷及答案
- 2025年甘肃交通职业技术学院招聘编外聘用工作人员60人考前自测高频考点模拟试题附答案详解(考试直接用)
- 2024年南京大学公开招聘辅导员笔试题含答案
- 2025一建《机电工程管理与实务》考点一本通
- 2025年高考全国二卷数学真题(解析版)
- 航空煤油储存管理办法
- 高中政治课课件模板
- 新学期,新征程+课件-2025-2026学年高二上学期开学第一课主题班会
- 廊坊市物业管理办法
- 深基坑自动化监测施工工法
- 2025满分中考作文(15篇)
- 2024年深圳市公务员考试行测真题及答案详解(新)
- 现代化农业与农业机械化新技术
评论
0/150
提交评论