好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

VC实验手册贪吃蛇与俄罗斯方块.doc

79页
  • 卖家[上传人]:pu****.1
  • 文档编号:388830859
  • 上传时间:2023-01-15
  • 文档格式:DOC
  • 文档大小:542KB
  • / 79 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 实例分析一、贪吃蛇 阶段一:贪吃蛇程序整体类结构Ø 贪吃蛇游戏介绍一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个方向键控制蛇向上接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束贪吃蛇游戏示意图:Ø 贪吃蛇游戏类设计贪吃蛇游戏需要设计两个类:1) 蛇类:蛇自身的属性包括蛇头、蛇尾、蛇的位置等等;蛇的方法包括出生、移动、吃食等等,CSnake类结构下图所示:CSnake类属性成员变量名数据类型意 义m_lengthint蛇的长度m_newSnakeSnake_Struct蛇的新态的所有节点运动状态m_oldSnakeSnake_Struct蛇的旧态的所有节点运动状态m_pStateArrayBitmapState*蛇的所有节点显示位图的状态m_pPosSPoint*蛇体坐标方法成员函数名属 性函数功能GetRightState()private返回当前应当显示的身体状态Move()public蛇移动ChangeDirect()public改变移动方向AddBody()public蛇的身体增长SetHeadPos()public设置蛇头的坐标GetStateArray()public取蛇的状态标识数组GetPos()public取蛇的位置数组IsHeadTouchBody()public检测蛇头是否触碰到其身体GetLength()public获取蛇身的长度Initial()public游戏初始化CSnake()public构造函数~CSnake()public析构函数 注:1. Snake_Struct为结构体类型,定义为:struct Snake_Struct//定义蛇体状态 { MoveState head; //头部 MoveState *body; //身体 MoveState tail; //尾部 };2. MoveState为枚举类型,定义为://节点运动状态(方向),4个成员分别对应4个方向enum MoveState{S_NONE,S_UP,S_DOWN,S_LEFT,S_RIGHT};3. BitmapState为枚举类型,定义为://节点图像显示运动状态(方向),第一个成员代表无方向,后12个成员之分别对应12个方向EnumBitmapState{M_NONE,M_UP_UP,M_DOWN_DOWN,M_LEFT_LEFT,M_RIGHT_RIGHT,M_UP_LEFT,M_UP_RIGHT,M_LEFT_UP,M_LEFT_DOWN,M_RIGHT_UP,M_RIGHT_DOWN,M_DOWN_RIGHT,M_DOWN_LEFT}4. SPoint为结构体类型,定义为:struct SPoint{ int x,y;// 横、纵坐标};2) 桌面类:桌面类的属性包括桌子的宽度、高度、食物、蛇等等;方法包括设置桌面环境,获取食物等等,CTable类结构下图所示:CTable类属性成员变量名数据类型意 义m_widthint桌子的宽度m_heightint桌子的高度m_foodNumberint水果的数目m_blockNumberint障碍物(毒果)的数目m_snakeCSnake桌子上的蛇m_boardint**桌子面板(二维数组)方法成员函数名属 性函数功能InitialTable()public初始化桌面AddBlock()public在某个位置放置毒果AddFood()public在某个位置放置食物ClearFood()public清除某个位置的果实GetSnake()public获取蛇对象GetBoard()public取桌子对象GetData()public取桌子某个位置数据SnakeMove()public检测蛇头是否触碰到其身体ChangeSnakeDirect()public改变蛇的方向CTable()public构造函数~CTable()public析构函数CSnake::SetHeadPos()CTable::ChangeSnakeDirect()设置自动移动定时器和增加食物定时器游戏开始CTable::InitialTab()CTable::AddFood()桌面初始化初始化蛇头和蛇移动方向随机初始化一个食物到桌面SetTimer()CTable::AddFood()蛇移动蛇吃食?蛇增长继续?蛇死亡?桌面上随机生成食物CTable::SnakeMove()CTable::ClearFood()CSnake::AddBody()退出程序ESC是是否否StartGame()SPACECSnake::IsHeadTouchBody()TB_STATE_SBLOCK阶段二:贪吃蛇程序整体类间调用关系阶段三:Win32 SDK程序消息机制分析光标消息?1、 释放设备缓存2、 退出消息循环是程序结束否时钟消息?是1、蛇移动或者添加食物2、显示游戏图像销毁窗口?是是否否缺省消息处理消息处理完毕隐藏光标程序立即终止改变蛇头移动方向向上游戏开始GetMessagege()有效消息?是否按键消息?是否向上向下?向左?向右?改变蛇头移动方向向下改变蛇头移动方向向左改变蛇头移动方向向右否否否是是是是Esc?否空格?是否否是结束状态?是阶段四:游戏控制的实现因为有定时器,所以蛇会定时自动移动,为了蛇能继续长大、不碰壁和碰到毒果,必须通过改变方向来改变蛇的移动方向。

      设定键盘的上下左右键为蛇移动方向的控制键,捕获到键盘消息后,发送给窗口过程对应的上下左右4个方向按键的消息为:VK_UP、VK_DOWN、 VK_LEFT、 VK_RIGHT相应这四个消息、便可以对蛇的移动状态进行控制,保存在蛇的各个记录蛇状态的成员变量里,然后通过这些信息绘制出相应的蛇的实时移动状态图,达到控制目的阶段五:界面的实现与图像资源的加载l 游戏界面介绍此游戏界面为全屏模式,首先根据屏幕分辨率大小,建立一个全屏窗口,以像素为单位作为游戏界面:屏幕最外层四个方向为各80像素的围墙(障碍物),在上围墙中间又覆盖了一个记分板,中间剩余的部分为游戏区为了提高游戏的界面显示性能,导入了相关的位图图像资源:包括游戏图标资源、围墙位图资源brick.bmp、蛇及蛇的各种状态资源bitmap1.bmp、食物及毒果资源(障碍物)、游戏记分板资源scoreboard.bmp、游戏结束画面资源end.bmpl 游戏界面的实现和图像资源的加载n 定义各种图像设备环境(全局变量):HDC windowDC = NULL; //windows屏幕设备HDC bufferDC = NULL; //缓冲设备环境HDC picDC = NULL; //snake图像设备HDC endDC = NULL; //游戏终结图像设备HDC scoreDC = NULL; //分数板设备n 定义各种位图缓冲区(全局变量)HBITMAP picBMP = NULL; //snake图像位图句柄HBITMAP bufferBMP = NULL;//缓冲位图句柄HBITMAP endBMP = NULL; //游戏终结图像内存句柄HBITMAP hbmpWall = NULL; //墙位图句柄HBITMAP hbmpScore = NULL;//分数板位图句柄n 定义应用程序窗口句柄(全局变量)HWND hAppWnd = NULL; //应用程序窗口句柄在WinMain()函数中,要完成程序主窗口的创建和各种设备环境和缓冲区的加载。

      n 设计和注册一个窗口n 获取显示器宽和高(像素)//取整个屏幕的尺寸 width=GetSystemMetrics(SM_CXSCREEN);//返回屏幕宽度(像素)height=GetSystemMetrics(SM_CYSCREEN);//返回屏幕高度(像素)n 创建窗口调用CreateWindow()函数时候指定窗口宽和长分别为width和heightn 显示和更新窗口n 计算客户区大小 GetClientRect(hAppWnd, &g_ClientRect); g_iClientWidth = g_ClientRect.right-g_ClientRect.left; g_iClientHeight = g_ClientRect.bottom-g_ClientRect.top; //将游戏区域分成纵,横均为块的小方块 //并计算每块区域的大小 tableBlockWidth = (g_iClientWidth-2*WALL_WIDTH)/20; tableBlockHeight = (g_iClientHeight-2*WALL_HEIGHT)/20; n //获取当前主窗口设备句柄(与windowDC关联)GetDC()函数返回一个客户区显示设备环境windowDC=GetDC(NULL);CreateCompatibleDC()函数用于创建一个和WindowDC兼容的设备环境 bufferDC=CreateCompatibleDC(windowDC); picDC=CreateCompatibleDC(windowDC); endDC=CreateCompatibleDC(windowDC); scoreDC=CreateCompatibleDC(windowDC); CreateCompatibleBitmap()函数用于创建一个和windowDC 兼容的位图缓冲环境。

      bufferBMP=CreateCompatibleBitmap(windowDC,g_iClientWidth,g_iClientHeight);LoadImage()函数:加载位图资源,并返回图片指针 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_LOADFROMFI。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.