ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:199.75KB ,
资源ID:9578814      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9578814.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC++课程设计报告俄罗斯方块.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VC++课程设计报告俄罗斯方块.docx

1、VC+课程设计报告俄罗斯方块课程设计报告( 2008 - 2009 年度第 1 学期)名 称: 专业综合训练课程设计 题 目: VC+ 专 业: 06软件技术 班 级: 2 班 学 号: 07 学生姓名: 常聪 指导教师: 邢煜 设计学时: 60 成 绩: 日期: 2009 年 1 月 3 日目 录一、课程设计的目的与要求 31.1课程设计的目的 31.2课程设计的要求 3二、设计正文 32.1需求分析 32.1.1 游戏需求 32.2.2游戏界面需求: 32.1.3游戏形状(方块)需求: 32.2算法分析 42.2.1程序流程图 42.2.2定义方块的数据结构 62.2.3 游戏设计分析 7

2、三 系统设计 83.1创建界面的主框架 83.2正常流程的设计 83.2.1定时制机制 83.2.2定时处理 94.1底部到达的判断与销行的实现 104.2中断操作流程的实现 134.3变形的实现 144.4 游戏区域绘图的实现 154.5 功能的完善 154.6 游戏演示 164.7主程序源程序清单 17六、参考文献 32用VC+实现俄罗斯方块的程序设计一、课程设计的目的与要求1.1课程设计的目的综合运用所学知识,熟练掌握VC+程序设计的编码与MFC框架结构 。1.2课程设计的要求要求用设计与实现俄罗斯方块游戏。要求包括系统的需求分析;系统总框图及每个模块的设计分析;MFC应用程序架构;框架

3、的扩展;算法的设计与实现;游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;列出所有定义的函数及说明;附上程序源代码。二、设计正文2.1需求分析2.1.1 游戏需求 随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置六关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。游戏功能要求如下:2.2.2游戏界面需求:良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽

4、度适中,要实现美感。2.1.3游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。2.2算法分析2.2.1程序流程图 图2.2.3 程序运行调用图2.2.2定义方块的数据结构对于方块在某一瞬间的位置标识,我们采用一个42的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进

5、行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号 2 。0123(x0,y0)(x1,y1)(x2,y2)(x3,y3)2301(x0,y0)(x1,y1)(x2,y2)(x3,y3) 图3.1 方块编号ActiveStatus00和ActiveStatus01则是第0号方块的横坐标x和纵坐标y ;ActiveStatus20和ActiveStatus21则是第2号方块的横坐标x和纵坐标y。2.2.3 游戏设计分析有前面的功能描述可知,我先虚拟出俄罗斯方块游戏的类对象,并抽象出核心的数据属性和操作方法等,然后再作细化,最后将整个虚拟类的外壳脱掉,再移植到视图类中去,其实现如下:CR

6、ectGameView : public CView /内部存取数据结构 int m_stateMapMAX_ROWMAX_COL; /初始化操作 GameInitnal(); /游戏的初始化 /用于判断数据相关状态的操作 IsLeftLimit(); /下坠物件是否可向左移动 IsRightLitmit(); / IsBottom(); /是否已经到达了底部 IsGameEnd(); /是否游戏已经结束 /方块物件下坠过程中的操作 RectChange(); /下坠物件变形 RectDown(); /下坠物件正常下落 RectArrow(); /下坠物件方向移动(左,右,下加速) /状态控制

7、操作 GameStart(); /游戏开始 GamePause(); /游戏暂停 GameEnd(); /游戏结束通过上面的代码可以看出,在虚拟类中抽象出了核心的内部数据和一些基本的操作函数。对于操作函数,可以把它们分为内部实现的基本核心操作(如判断操作)以及明显提供给外部使用的整体模块外部操作(如状态控制操作)。而内部的基本操作又可以分为判断操作和执行操作这样两种类型3。三 系统设计3.1创建界面的主框架 首先建立一个项目工程,名为skyblue_Rect,并在AppWizard的架构选择过程中选择单文档方式,其他保持默认选项。其项目的架构类视图信息如图所示: 在构架类视图中是MFC基本架构

8、组合:App(应用程序)类、Document(文档)类、View(视图)类、Frame(框架)类和用于提示关于作者的对话框CAboutDlg类,至于COptionDlg类是用作俄罗斯方块参数选择的对话框类对象。 3.2正常流程的设计 3.2.1定时制机制 从分析游戏的特性可以知道,定时器的产生与生效应该在游戏开始的时候,而在游戏暂停或者游戏结束时则将已经设定的定时器失效/销亡(对于暂停的情况,使它销亡,当游戏从暂停状态又进入游戏状态时候,则重新创建一个定时器并激活它的运作),所以分别在游戏的开始函数、暂停函数已经结束函数中实现定时器的激活与去激活工作。这里,先在资源编辑器菜单资源里面添加三个菜

9、单选项,分别是游戏的“开始”、“暂停”、和“结束”,然后利用ClassWizard直接在视图类对象Cskyblue_RectView中为它们添加空白的处理函数,具体如表2所示。3.2.1菜单选项功能对应表菜单选项名称快捷键资源ID响应处理函数开始游戏&SID_GAME_STATOnGameStart()暂停游戏&PID_GAME_PAISHOnGamePaush()结束游戏&EID_GAME_ENDOnGameEnd()3.2.2定时处理 经过定时器的设置后,这里通过利用ClassWizard跳到定时器到时候的处理函数OnTimer()去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到

10、达了底部,不是则进行RectDown()下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束。图 3.2.2装载方块 视图类创建了m_icurrentStatus和m_inextStatus两个成员变量来记录下坠物的类型,共有七种形状,并从7种方块中随机抽取图形。而m_currentRect除了记录下坠物的类型外,还需记录其当前的变形状态,最多用两位表示,第1位用作类型标

11、识(17),第2位用作同种类型的不同表现方式,最多有4种状态(14)。在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。四、系统实施4.1底部到达的判断与销行的实现图3.2.3 处理方块到达图将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态(MAP_STATE_NOT_E

12、MPTY=1)来确定,利用数组InterFace744记录17种下坠物的14种形态的接触面信息。统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少,程序统计分数是:消一行得100分,同时消2行得400分,销掉x行,则分数为:x*(x*100)。如果总分数达到过关条件就过关,改变游戏速度,游戏初始化,开启新的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。4.2中断操作流程的实现(1) 处理键盘事件关于按键命令消息的响应,可以通过对WM_KEYDOWN消息的处理函数进行截获并重写来实现,下面是对该处理函数OnKeyDown()的重

13、写。/ 功能:处理用户的输入,方块的左,右移,加速及变形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, nFlag

14、s);4.3变形的实现当按下向上键时,将会执行方块变化事件(change())。常见的方块有7种(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),所有图形都是用两个一维数组来统计它的横坐标和纵坐标,每个方块有4种不同的变化形状。例计算变形后的小方块的坐标和显示的状态值/变形后位置在数组中的存放顺序仍需遵循先左后右,在同一列中先上后下 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

15、=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

16、.bmp中的位图动态导入(映射)到内存位图里面,根据游戏区域中的二维数组GameStatusMAX_ROWMAX_COL中的内部数据将所有数据状态中为被占用状态MAP_STATE_NOT_EMPTY的小方块区域用指定的小方块图样类型来填充,然后将已经绘制好的游戏区域图像一次性的拷贝到与屏幕关联的设备环境中,从而达到屏幕的显示。4.5 功能的完善为了使得游戏功能更加健全,另外为用户提供了一些附加功能,如表4.5.1所示。表 4.5.1 附加功能描述列表功能名称选项其他描述游戏等级选择初级.顶级对游戏快慢难度的设定方块图案样式选择深蓝.条纹对下坠物的小方块图案样式选择游戏区域大小选择小、中、大对游

17、戏区域的行列数选择网格的选用有、无是否需要在游戏区域绘制网格背景音乐的选用有、无在游戏过程中是否播放背景音乐先将这些目标功能通过资源编辑器在主菜单条进行添加,将前面已有的菜单选项补全,再通过ClassWizard添加对应的响应处理函数。其最终效果如图1图 4.5.2 游戏设置游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我在游戏中添加了漂亮的场景和动听的背景音乐,设置了个性化的工具栏快捷键,激发大家的娱乐激情。4.6 游戏演示 游戏主界面如图所示。图4.6.1 俄罗斯方块游戏运行主界面4.7主程序源程序清单CSkyblue_RectView:CSkyblue

18、_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; /缺省方块大小

19、为m_iLarge个象素 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;k

20、m_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()

21、 % MaxNumber; /保证非0 if(random = 0 ) random+; return random; /内部函数:刷新当前的区域void CSkyblue_RectView:InvalidateCurrent() int i; for (i=0;i0) & IsLeftLimit() & !m_isBottom) /清原来的方块 GameStatusx1y1=MAP_STATE_EMPTY; GameStatusx2y2=MAP_STATE_EMPTY; GameStatusx3y3=MAP_STATE_EMPTY; GameStatusx4y4=MAP_STATE_EMPT

22、Y; /添加新的移动后数据状态 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(); break; case RIGHT: if ( (Ac

23、tiveStatus31 m_iCol-1) & IsRightLitmit() & !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; GameStatusx

24、1y1+1=MAP_STATE_NOT_EMPTY; GameStatusx2y2+1=MAP_STATE_NOT_EMPTY; GameStatusx3y3+1=MAP_STATE_NOT_EMPTY; GameStatusx4y4+1=MAP_STATE_NOT_EMPTY; InvalidateCurrent(); break; case DOWN: RectDown(); break; / 内部函数:方块的变形void CSkyblue_RectView:RectChange() /先预先变形,然后判断变形后的方块是否有空间,如有足够空间,则进行实际变形,否则不变 int xx1,xx

25、2,xx3,xx4,yy1,yy2,yy3,yy4; int m_lscurrentRect; CString lsStr; int x1,x2,x3,x4,y1,y2,y3,y4; x1 = ActiveStatus00; x2 = ActiveStatus10; x3 = ActiveStatus20; x4 = ActiveStatus30; y1 = ActiveStatus01; y2 = ActiveStatus11; y3 = ActiveStatus21; y4 = ActiveStatus31; /变形后位置在数组中的存放顺序仍需遵循先左后右,在同一列中先上后下 xx1=x1

26、; 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; /改变形状代码 m_currentRect = m_lscurr

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1