欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    用VC实现俄罗斯方块的程序设计60.pdf

    • 资源ID:84296805       资源大小:825.51KB        全文页数:18页
    • 资源格式: PDF        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    用VC实现俄罗斯方块的程序设计60.pdf

    1/18 课 程 设 计 课程名称:程 序 设 计 课题名称:俄罗斯方块游戏的设计 班 级:计算机学院 09-1BJ 班 完成人:曾灵芝(14092400558)指导教师:甘靖 湖南理工学院计算机学院 2011 年 4 月 14 日 2/18 用 VC+实现俄罗斯方块的程序设计 一、课程设计的目的与要求 1.1 课程设计的目的 综合运用所学知识,熟练掌握 VC+程序设计的编码与 MFC 框架结构。1.2 课程设计的要求 要求用设计与实现俄罗斯方块游戏。要求包括系统的需求分析;系统总框图及每个模块的设计分析;MFC 应用程序架构;框架的扩展;算法的设计与实现;游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;列出所有定义的函数及说明;附上程序源代码。二、设计正文 2.1 需求分析 2.1.1 游戏需求 随机给出不同的形状(长条形、Z 字形、反 Z 形、田字形、7 字形、反 7 形、T 字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置六关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。游戏功能要求如下:2.2.2 游戏界面需求:良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。2.1.3 游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z 字形、反 Z 形、田字形、7 字形、反 7 形、T 字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。3/18 2.2 算法分析 2.2.1 程序流程图 到 达 底 部到达底部,游戏结束 到 达 底 部结束 销行操作 生成下一个下坠物 将新生的下坠物代替旧的“下一 个下坠物“将旧的“下一个下坠物”用作当前 下坠物 销行操作 游戏结束处理 下降一个单位 开始 4/18 图 2.2.3 程序运行调用图 2.2.2 定义方块的数据结构 对于方块在某一瞬间的位置标识,我们采用一个42的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用 4 个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号 2。图 3.1 方块编号 ActiveStatus00和 ActiveStatus01则是第 0 号方块的横坐标 x 和纵坐标 y;ActiveStatus20和 ActiveStatus21则是第 2 号方块的横坐标 x 和纵坐标 y。刷新 游戏结束 重新游戏 下一个图行 达 到指定 位置 达 到指定 位显 示屏 幕信息 按向上键 游戏开始 否 按键 7.OnTimer()10.IsBottom()12.RectChange()9.OnDraw()6.invalidatecurren8.GamePaush()5.RectDown()11.KeyDown()13.GameEnd()1.Main()2.Rectview()3.Gamestart()4.DrawGame 0 1 2 3 (x0,y0)(x1,y1)(x2,y2)(x3,y3)2 3 0 1 (x0,y0)(x1,y1)(x2,y2)(x3,y3)5/18 2.2.3 游戏设计分析 有前面的功能描述可知,我先虚拟出俄罗斯方块游戏的类对象,并抽象出核心的数据属性和操作方法等,然后再作细化,最后将整个虚拟类的外壳脱掉,再移植到视图类中去,其实现如下:CRectGameView:public CView /内部存取数据结构 int m_stateMapMAX_ROWMAX_COL;/初始化操作 GameInitnal();/游戏的初始化 /用于判断数据相关状态的操作 IsLeftLimit();/下坠物件是否可向左移动 IsRightLitmit();/IsBottom();/是否已经到达了底部 IsGameEnd();/是否游戏已经结束 /方块物件下坠过程中的操作 RectChange();/下坠物件变形 RectDown();/下坠物件正常下落 RectArrow();/下坠物件方向移动(左,右,下加速)/状态控制操作 GameStart();/游戏开始 GamePause();/游戏暂停 GameEnd();/游戏结束 通过上面的代码可以看出,在虚拟类中抽象出了核心的内部数据和一些基本的操作函数。对于操作函数,可以把它们分为内部实现的基本核心操作(如判断操作)以及明显提供给外部使用的整体模块外部操作(如状态控制操作)。而内部的基本操作又可以分为判断操作和执行操作这样两种类型3。6/18 三 系统设计 3.1 创建界面的主框架 首先建立一个项目工程,名为 skyblue_Rect,并在 AppWizard 的架构选择过程中选择单文档方式,其他保持默认选项。其项目的架构类视图信息如图所示:在构架类视图中是MFC基本架构组合:App(应用程序)类、Document(文档)类、View(视图)类、Frame(框架)类和用于提示关于作者的对话框CAboutDlg类,至于COptionDlg类是用作俄罗斯方块参数选择的对话框类对象。3.2 正常流程的设计 3.2.1 定时制机制 从分析游戏的特性可以知道,定时器的产生与生效应该在游戏开始的时候,而在游戏暂停或者游戏结束时则将已经设定的定时器失效/销亡(对于暂停的情况,使它销亡,当游戏从暂停状态又进入游戏状态时候,则重新创建一个定时器并激活它的运作),所以分别在游戏的开始函数、暂停函数已经结束函数中实现定时器的激活与去激活工作。这里,先在资源编辑器菜单资源里面添加三个菜单选项,分别是游戏的“开始”、“暂停”、和“结束”,然后利用ClassWizard直接在视图类对象Cskyblue_RectView中为它们添加空白的处理函数,具体如表 2 所示。3.2.1 菜单选项功能对应表 菜单选项名称 快捷键 资源ID 响应处理函数 开始游戏&S ID_GAME_STAT OnGameStart()暂停游戏&P ID_GAME_PAISH OnGamePaush()结束游戏&E ID_GAME_END OnGameEnd()7/18 3.2.2 定时处理 经过定时器的设置后,这里通过利用 ClassWizard 跳到定时器到时候的处理函数OnTimer()去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行 RectDown()下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束。图 3.2.2 装载方块 视图类创建了 m_icurrentStatus 和 m_inextStatus 两个成员变量来记录下坠物的类型,共有七种形状,并从 7 种方块中随机抽取图形。而 m_currentRect 除了记录下坠物的类型外,还需记录其当前的变形状态,最多用两位表示,第1位用作类型标识(17),第2位用作同种类型的不同表现方式,最多有 4 种状态(14)。在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数 Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。四、系统实施 是 否 7 6 5 4 3 2 1 随机抽取一个数 随机数 一字形 Z 字形 反 Z 形 7 字形 反 7 形 倒T形 田字型 游戏是否结束 保存当前方块坐标 显示方块于屏幕上 游戏结束 调 GameEnd()关数初始化 返回开始界面 8/18 4.1 底部到达的判断与销行的实现 图 3.2.3 处理方块到达图 将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态(MAP_STATE_NOT_EMPTY=1)来确定,利用数组 InterFace744记录 17 种下坠物的14 种形态的接触面信息。统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少,程序统计分数是:消一行得 100 分,同时消 2 行得 400 分,销掉 x 行,则分数为:x*(x*100)。如果总分数达到过关条件就过关,改变游戏速度,游戏初始化,开启新的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。是 否 堆积方块,判断接触面状态及是否得分 2.统计分数 判断是否过关 关数增加,游戏速度将变快。调用游戏初始化 GameStart()开始新的一关 视图重绘(InvalidateView())1.判 断 行 满、处 理 销行、堆积方块向下移动 9/18 4.2 中断操作流程的实现(1)处理键盘事件 关于按键命令消息的响应,可以通过对 WM_KEYDOWN 消息的处理函数进行截获并重写来实现,下面是对该处理函数 OnKeyDown()的重写。/功能:处理用户的输入,方块的左,右移,加速及变形 void CSkyblue_RectView:OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)switch(nChar)case VK_LEFT:RectArrow(LEFT);break;case VK_RIGHT:RectArrow(RIGHT);break;case VK_UP:RectChange();break;case VK_DOWN:RectArrow(DOWN);break;CView:OnKeyDown(nChar,nRepCnt,nFlags);4.3 变形的实现 当按下向上键时,将会执行方块变化事件(change())。常见的方块有 7 种(长条形、Z字形、反 Z 形、田字形、7 字形、反 7 形、T 字型),所有图形都是用两个一维数组来统计它的横坐标和纵坐标,每个方块有 4 种不同的变化形状。例计算变形后的小方块的坐标和显示的状态值/变形后位置在数组中的存放顺序仍需遵循先左后右,在同一列中先上后下 10/18 xx1=x1;xx2=x2;xx3=x3;xx4=x4;yy1=y1;yy2=y2;yy3=y3;yy4=y4;switch(m_currentRect)case 1:xx1=x1+1;yy1=y1-1;xx3=x3-1;yy3=y3+1;xx4=x4-2;yy4=y4+2;m_lscurrentRect=11;break;case 11:xx1=x1-1;yy1=y1+1;xx3=x3+1;yy3=y3-1;xx4=x4+2;yy4=y4-2;m_lscurrentRect=1;break;/省略部分为同类实现的变形后小方块坐标的计算代码 case 73:xx2=x2+1;yy2=y2-1;xx3=x3+2;yy3=y3-2;xx4=x4-1;yy4=y4-1;m_lscurrentRect=7;break;4.4 游戏区域绘图的实现 首先将外部位图文件 rect.bmp 中的位图动态导入(映射)到内存位图里面,根据游戏区域中的二维数组 GameStatusMAX_ROWMAX_COL中的内部数据将所有数据状态中为被占用状态 MAP_STATE_NOT_EMPTY 的小方块区域用指定的小方块图样类型来填充,然后将已经绘制好的游戏区域图像一次性的拷贝到与屏幕关联的设备环境中,从而达到屏幕的显示。4.5 功能的完善 为了使得游戏功能更加健全,另外为用户提供了一些附加功能,如表 4.5.1 所示。表 4.5.1 附加功能描述列表 功能名称 选项 其他描述 游戏等级选择 初级.顶级 对游戏快慢难度的设定 11/18 功能名称 选项 其他描述 方块图案样式选择 深蓝.条纹 对下坠物的小方块图案样式选择 游戏区域大小选择 小、中、大 对游戏区域的行列数选择 网格的选用 有、无 是否需要在游戏区域绘制网格 背景音乐的选用 有、无 在游戏过程中是否播放背景音乐 先将这些目标功能通过资源编辑器在主菜单条进行添加,将前面已有的菜单选项补全,再通过 ClassWizard 添加对应的响应处理函数。其最终效果如图 1 图 4.5.2 游戏设置 游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我在游戏中添加了漂亮的场景和动听的背景音乐,设置了个性化的工具栏快捷键,激发大家的娱乐激情。4.6 游戏演示 游戏主界面如图所示。12/18 图 4.6.1 俄罗斯方块游戏运行主界面 4.7 主程序源程序清单 CSkyblue_RectView:CSkyblue_RectView()/第一次开始游戏 m_bFistPlay=TRUE;/缺省为不是游戏暂停状态 m_bGamePaush=FALSE;/缺省为不插放背景音乐 m_bMusic=FALSE;/缺省为画网格线 m_bDrawGrid=TRUE;/总分值清零 m_iPerformance=0;/测试值:为 12 行,10 列 m_iRow=12;m_iCol=10;/左上角 X,Y 坐标 m_iStartX=10;m_iStartY=10;/缺省级别为 3 级 m_iLevel=2;/第一种样式 m_iBlockSytle=0;/缺省方块大小为 m_iLarge 个象素 13/18 m_iLarge=30;/缺省游戏是结束的 m_bGameEnd=TRUE;int i,j;/赋初值 for(i=0;i100;i+)for(j=0;j100;j+)GameStatusij=0;/各种形状方块的接触面数据,参见设计书的接触面表格,/5.判断游戏是否已结束:碰了底,且第 1 行有小方块 if(m_isBottom)for(i=0;im_iCol;i+)if(GameStatus0i)KillTimer(1);AfxMessageBox(游戏已结束!);for(j=0;jm_iRow;j+)for(k=0;km_iCol;k+)GameStatusjk=0;Invalidate(FALSE);m_bGameEnd=TRUE;break;else /当前方块下降 RectDown();CView:OnTimer(nIDEvent);/函数:产生一个最大值不大于指定值的随机正整数(Random)/参数:MaxNumber:随机数的上限/返回值:产生的随机数 int CSkyblue_RectView:Random(int MaxNumber)/布下随机种子 srand(unsigned)time(NULL);/产生随机数 int random=rand()%MaxNumber;/保证非 0 if(random=0)random+;return random;/内部函数:刷新当前的区域 void CSkyblue_RectView:InvalidateCurrent()14/18 int i;for(i=0;i0)&IsLeftLimit()&!m_isBottom)/清原来的方块 GameStatusx1y1=MAP_STATE_EMPTY;GameStatusx2y2=MAP_STATE_EMPTY;GameStatusx3y3=MAP_STATE_EMPTY;GameStatusx4y4=MAP_STATE_EMPTY;/添加新的移动后数据状态 ActiveStatus01-=1;ActiveStatus11-=1;ActiveStatus21-=1;ActiveStatus31-=1;GameStatusx1y1-1=MAP_STATE_NOT_EMPTY;GameStatusx2y2-1=MAP_STATE_NOT_EMPTY;GameStatusx3y3-1=MAP_STATE_NOT_EMPTY;GameStatusx4y4-1=MAP_STATE_NOT_EMPTY;InvalidateCurrent();15/18 break;case RIGHT:if(ActiveStatus31 SelectObject(m_pBlackBrush);CRect rect;GetClientRect(&rect);pDC-Rectangle(rect);/选用灰色画刷,绘制游戏区域的背景 pDC-SelectObject(m_pGrayBrush);pDC-Rectangle(m_iStartY,m_iStartX,m_iStartY+301,m_iStartX+360);pDC-SelectObject(m_pBlackPen);/画网格线 if(m_bDrawGrid)/画横线 for(i=0;iMoveTo(m_iStartY,m_iStartX+i*m_iLarge);pDC-LineTo(m_iStartY+300,m_iStartX+i*m_iLarge);/画竖线 for(i=0;iMoveTo(m_iStartY+i*m_iLarge,m_iStartX);pDC-LineTo(m_iStartY+i*m_iLarge,m_iStartX+360);int x,y,nW,nH;/小方块的绘制 for(i=0;im_iRow;i+)for(j=0;jBitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY);18/18 /画下一次将要出现的方块,用于提示用户 if(!m_bGameEnd)pDC-SetBkColor(BLACK);pDC-SetTextColor(WHITE);pDC-TextOut(m_iStartY+320,m_iStartX,下一个方块:);int x,y,nW,nH;for(UINT k=0;kBitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY);/功能:承担所有绘制屏幕工作 void CSkyblue_RectView:OnDraw(CDC*pDC)DcEnvInitial();DrawGame(&m_memDC);/在内存位图的游戏区域绘制 pDC-BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);五、课程设计总结或结论 在本次课程设计中,我从指导老师颜宏文身上学到了很多东西。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。她无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感她耐心的辅导。另外,在游戏开发过程中谢中科老师也给于我们很大的帮助,帮助解决了不少的难点,使得游戏能及时开发完成,还有所有的同学同样给与我不少帮助,这里一并表示感谢。六、参考文献 1Ben Sawyer.游戏软件设计与开发指南M.北京:人民邮电出版社,1998.846 2钦科技.Visual C+游戏设计M.北京:科海电子出版社,2003.1211 3坂本千寻.Visual C+专业游戏程序设计M.北京:中国铁道出版社,2004

    注意事项

    本文(用VC实现俄罗斯方块的程序设计60.pdf)为本站会员(深夜****等你...)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开