2111.基于visual c++实现的单机版俄罗斯方块游戏的设计-----毕业论文_第1页
2111.基于visual c++实现的单机版俄罗斯方块游戏的设计-----毕业论文_第2页
2111.基于visual c++实现的单机版俄罗斯方块游戏的设计-----毕业论文_第3页
2111.基于visual c++实现的单机版俄罗斯方块游戏的设计-----毕业论文_第4页
2111.基于visual c++实现的单机版俄罗斯方块游戏的设计-----毕业论文_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要俄罗斯方块是非常传统的游戏,操作简单,难度却不低,广受娱乐界欢迎。给人们的生活带来了健康愉快的补充,唯美的艺术享受。本文在基于VISUALC实现的单机版俄罗斯方块游戏的基础上,深入的研究MFC框架中的各个类的关系和它们内部之间的联系。主要工作和结论1分析了俄罗斯游戏规则。2系统的介绍了实现俄罗斯方块游戏的算法设计过程。3将研究的思路运用于实际,在VC60平台下实现了俄罗斯方块游戏。关键词俄罗斯方块游戏;VC;MFC框架ABSTRACTRUSSIAISAVERYTRADITIONALBOXOFTHEGAME,SIMPLEOPERATION,THEDIFFICULTYISNOTLOW,WIDELYWELCOMEDBYTHEENTERTAINMENTINDUSTRYTOTHEPEOPLESLIFEAHAPPYANDHEALTHYCOMPLEMENTTOTHEFLAVOROFTHEENJOYMENTOFTHEARTSINTHISPAPER,BASEDONTHEVISUALCTOACHIEVETHESINGLEVERSIONOFTHERUSSIANBOXONTHEBASISOFTHEGAME,MFCDEPTHSTUDYINTHEFRAMEWORKOFVARIOUSTYPESANDTHEIRINTERNALRELATIONSBETWEENTHELINKSANDTHEMAINCONCLUSIONS1ANALYSISOFTHERUSSIANRULESOFTHEGAME2THESYSTEMINTRODUCESAGAMEOFRUSSIANBOXALGORITHMDESIGNPROCESS3WILLEXAMINETHEPRACTICALAPPLICATIONOFIDEAS,INVC60PLATFORMUNDERTHERUSSIANBOXGAMEKEYWORDSRUSSIANBOXGAMEVCMFCFRAMEWORK目录摘要IABSTRACTI1引言311选题及研究意义312论文研究的主要内容321APP应用程序类物件422文档视图机制523DOCUMENT文挡操作624文档视图的关联63俄罗斯游戏分析和总体设计731俄罗斯方块游戏功能描述832游戏规则分析84俄罗斯方块游戏的实现941游戏核心数据的抽象与设计1042操作方法的抽象与设计1343流程的设计与实现15431正常流程的设计15432正常流程的实现定时处理16433中断操作流程的设计19433中断操作流程的实现2044游戏区域绘图的实现21441位图资源的准备21442绘图机制设计22443绘图环境资源的初始化和释放22444游戏区域的绘制245功能的完善2751游戏背景音乐的实现2952工具栏快捷键的实现30结束语33参考文献33致谢34俄罗斯方块游戏的实现1引言我们国家正处于全球文化产业日新月异大格局中,电子游戏、网络游戏的发展速度之快,更是令人眼花缭乱,目不暇接。未来的电子和游戏发展趋势必将是更智能化、更艺术性、更人性味。在高性能的硬件设备的支持下,游戏的驱动引擎更具威力,控制功能更加完备,在一个错综复杂的极度扩张的游戏大世界中,带着超乎常人智慧的人工智能的应对力,使得所有要素包括艺术的风格、情感的互动、故事的铺展、视觉的表现、用户的界面,融合为有机的一体,给人们带来更丰富的娱乐和体验。好的游戏给人们的生活带来了健康愉快的补充,唯美的艺术享受,潜默的教育功效。本系统采用VC为主要开发工具设计实现了一个单机板的俄罗斯方块游戏。与其他程序相比,笔者的作品有三个特色一是精心设计的人机界面,不仅友好而且易于操作。二是笔者的游戏采用的是单机板。三是采用MFC应用程序开发模型进行编制,使开发人员减轻创建WINDOWS应用程序的负担。网络版的俄罗斯方块游戏是两个玩家通过网络进行较量,但在游戏过程中数据要通过服务器进行传送,网络版游戏经常会出现断线、超时等情况这些都是因为网络的速度比较慢造成的。而笔者设计的俄罗斯游戏虽然是单机版的,但速度快,提高了效率。11选题及研究意义俄罗斯方块游戏是一个比较经典的游戏,根据软件工程有关的规范,以合理的开发原则,设计出单机的俄罗斯方块游戏,并给人们的生活带来唯美的艺术享受和健康愉快的补充。游戏软件是一种与文化背景密切联系的产品,具有很强的民族性和丰富的文化内涵。伴随着游戏软件在市场上的销售,与其相关的文化也随之传播。因此发展我国自主的益智、健康的游戏软件已是当务之急。游戏是一种基于计算机的应用软件,是新型的休闲娱乐方式。当前开发的游戏软件应该做到知识性、娱乐性、趣味性、教育性相统一。12论文研究的主要内容在论文完成过程中,认真学习了游戏开发的基本技术,OOD方法软件设计的基础知识,VC程序设计语言等。结合游戏开发的过程、算法的设计与分析(如下坠物的生成、下坠物随机选择、游戏区画板实现的方法等)、软件工程等角度重点研究了实现游戏的算法和采用VC平台设计游戏的优点和现存结构的不足之处。以下是论文的组织结构第1部分是引言,主要介绍论文选题的意义、选题背景等相关情况。第2部分概述MFC应用程序框架。第3部分是游戏规则的分析。第4部分是游戏算法的实现、游戏功能模块、操作界面以及系统分析及设计。第5部分是对整个论文的结束语。对论文的主要工作作了归纳总结,分析了进一步需要做的工作。2MFC应用程序架构传统的WINDOWS应用程序的开发使用APIAPPLICATIONPROGRAMMINGINTERFACE函数。API函数的功能主要是为WINDOWS应用程序开发提供统一的编程接口。在使用API编程的过程中,窗口的创建和消息的处理都需要手工编码。一个简单的WINDOWS应用程序的代码需要上百行,这使WINDOWS应用程序开发变成了一件繁重的工作。现在编程,都是在VISUALC环境下采用基本MFCMICROSOFTFOUNDATIONCLASS的WINDOWS编程方法。MICROSOFT基本类库MFC是一个WINDOWS应用程序框架,它是C类结构的扩展。利用MFC提供的面向对象程序行色机的框架,可大大减轻程序开发人员创建WINDOWS应用程序的负担。MFC提供了管理窗口、菜单、对话诓的代码,可实现基本的输入输出和数据的存储。此外,MFC还提供一个应用程序来发模型,此模型被称为文档视图模型。文档视图模型视将应用程序数据与用户界面元素分离的一种应用编程方法,它允许这两部分程序独立存在。这样,程序员在更改其中部分代码的时候,不会大幅度地更改另一部分。该游戏的实现采用MFC框架。在构架类视图中有MFC基本架构组合APP应用程序类、DOCUMENT文档类、VIEW视图类、FRAME框架类和用于提示关于作者的对话框CABOUTDLG类。下面对这几个类做一个简单的列表,如表21所示。表21MFC应用程序架构表类别基类描述APPLICATIONCWINAPP代表应用程序的核心DOCUMENTCDOCUMENT包含应用程序的数据集WINDOWSCWIND主要用于图形用户界面GUI的对象,可以处理常见的WINDOWS消息FRAMECFRAMEWND用于应用程序的主要WINDOWS框架VIEWVCIEW用于显示数据并与文档DOCUMENT对象交互21APP应用程序类物件每种语言都有一个程序入口主函数,如C/C语言的MAIN函数。总地来说,MAIN函数的调用与终止代表着程序执行的开始与结束,在程序运行的过程中,无非是对一些业务性的功能流程进行不断的处理,当完成后才退出程序。其实,所有的程序也是采用同样的方法去实现,MFC机制巧妙地利用了APPLICATION类去封装实现了这样的效果功能,每个CWINAPP类对象实体都代表应用程序本身,它是基本的APPLICATIONCLASS应用程序类,其封装了WINDOWSBASED应用程序的初始化、运行、MESSAGE映射和终止等功能。假如创建了这样的一个对象实体,在运行期间处理初始化、消息映射、或者其他动作时就可以通过属性操作的调用去实现,而不像拥有结构化设计思想的MAINO函数那样的顺序去实现。那么,现在就来看看这个CWINAPP类对象的性质。在MFC框架中,应用程序必须有且仅有一个从CWINAPP派生的CLASSOBJECT类物件,这个OBJECT在WINDOWS创建之前就会被创建,也就是说这个OBJECT会和其他C全局OBJECT同时创建。当WINDOWS调用WINMAINO时在MFC应用程序中,不必亲自调用WINMAINO,因为机制已经对它封装好,当应用程序启动时会由框架自动调用,这个OBJECT已经可用了,并且该OBJECT是全局的。当用APPWIZARD创建DOCUMENTNIEW模式应用程序时,APPWIZARD会声明一个从CWINAPP派生的APPLICATIONCLASS,因此,由APPWIZARD所产生的CPP文件中还包括MESSAGE映射、空的构造函数、一个应用程序OBJECT即一个变量和INITINSTANCEO函数。APPWIZARD提供的源代码和MESSAGE映射可以满足一些基本的任务,但在通常情况下,还是需要手工修改那些源程序,特别是要修改INITINSTANCE函数。在CWINAPP中,有以下几个关键的可重写的成员数。INITINSTANCE此函数对文档模板DOCUMENTTEMPLATE进行创建和初始化,即在这过程中伴随着DOCUMENT、VIEW和FRAME的创建。RUN初始化后,WINMAIN就会调用这个成员函数去处理MESSAGE循环。EXITINSTANCE每当一个应用程序的COPY拷贝终止时,就会调用这个函数,即发生在应用程序退出时。ONIDLE当没有WINDOWSMESSAGE处理时,就会由FRAMEWORK调用这个函数,并重写这个函数去执行后台任务。当用户从CWINAPP派生一个APPLICATIONCLASS时,必须重写成员函数INITINSTANCE去创建应用程序的MAINWINDOWOBJECTOWINDOWS允许同时运行同一个应用程序的多个“COPY”,而且该应用程序的每个INSTANCE包括第一个的都会被初始化,而初始化时都会用到被OVERRIDE了的INITINSTANCE函数所提供的信息。通常情况下,每个WINDOWSBASED应用程序都有一个MAINWINDOW。因此,在初始化完成后,FRAMEWORK就会检查是否存在一个指向有效MAINWINDOWSCWINAPPM_PMAINWND的指针,如果不存在的话,应用程序就会终止。当利用APPWIZARD创建应用工程项目时,APPWIZARD会重写缺省的INITINSTANCE来创建MAINWINDOWOBJECT,还会使CWINAPP的数据成员M_PMAINWND指向那个WINDOW。22文档视图机制文档对视图的管理。若用非文档,视图机制的时候,交互界面显示的只有一种视图,在这种情况下,可以将内部数据以一种对应规则用图像显示出来。将一份数据用不同的方式去展示,并且将它们放在不同的窗口视图中,MFC机制给出了这样的实现方法先用一个CDOCUMENT这样的物件去处理数据的管理,然后用一个CVIEW这样的物件去管理视图的显示,这样一来,所有不同的显示图像若要以某种方式反映出数据的特性,必须在数据源和众多不同方式的图像显示之间有一定的关联。对于它们的关联,MFC机制用了一个很好的方法,就是将所有与这个数据源相关的图像显示都独立用CVIEW物件去表示,而当数据源就抽象成CDOCUMENT物件,而在DOCUMENT中有这样的一个指针列表CPTRLIST类型的日员变量M_VIEWLIST,将所有这些与之关联的视图用链表串起来。而这些用于显示不同性质的图像视图类也可以通过GETDOCUMENT来获取其所对应的DOCUMENT文档数据。23DOCUMENT文挡操作由于MFC机制设计出文档类对象专门负责数据的I/O存取和数据的运算和操作等。一般来说,数据运算是通过DOCUMENT类里面的扩展功能来实现的,这样做可以形成一种密集数据处理,达到方便易用和管理的好处。对于一个文件而言,如果文件内对象的排列顺序是固定的,那么对于文件读和写从形式上只有使用的运算符的不同。在MFC的文档视图框架结构中,一个文档的内部对象的构成往往是固定的,在这种情况下,写到文件中的对象在文件中的布局也是固定的。因此CDOCUMENT是利用其基类COBJECT提供的SERILIZE虚函数实现自动文档的读写操作的。当用户在界面上选择文件菜单或打开文件ID_FILE_OPEN时,CWINAPP派生类的ONFILEOPENO函数将被自动调用,它通过文档模板创建或重用框架、文档和视图对象,并最终调用CDOCUMENTONOPENDOCUMENT来读文件。当用户选择菜单文件或文件保存ID_FILE_SAVE,选择文件或另存ID_FILE_SAVEAS时,是通过呼叫函数CWINAPPONFILESAVE和CWINAPPONFILESAVEAS并最终调用CDOCUMENTONSAVEDOCUMENT实现的。24文档视图的关联视图与文档和窗口的关联和协调工作可以从视图类对象的ONDRAW函数开始,找出关联的物件与关系。在MFC机制中,关于DOCUMENTNIEW架构的项目工程和ONDRAWO函数的驱动绘图触发的流程CDOCUMENTUPDATEAIIVIEWSCVIEWONUPDATECWNDINVALIDATEONPAINTONDRAW从流程可知当用于装载重要数据的DOCUMENT类对象中的数据发生变化时,为了能让与其关联的各个视图实时表现出数据的特征性质,需要通知所有这些关联的视图进行更新重绘,而DOCUMENT类对象就拥有通知所有视图重绘的这样的一个功能函数。对于UPDATEAIIVIEWS函数实现对各个视图类对象对数据显示的更新是通过文档类内部CPTRLIST类型的成员变量M_VIEWLIST来维护和管理所有相关联的视图对象,如图11所示。DOCUMENT图11变量M_VIEWLIST视图对象而对于该文档关联视图的增添,与将DOCUMENTTEMPLTE文档模板添加到模板类表一样,也是有相应的处理函数,对于文档模板在模板管理列表的添加是在APP类的INITLNSTANCE里面使用ADDDOCTEMPLATE函数去实现,而对于视图在视图列表的添加,可以使用DOCUMENT类对象的成员函数ADDVIEW去实现。当与文档类关联的视图类收到文档类通过UPDATEAIIVIEWS函数发出的更新重绘通知后,会触发视图类的ONUPDATE函数的实现。M_VIEWLISTPVIEW_1PVIEW_2PVIEW_3PVIEW_4VIEW_4VIEW_3VIEW_2VIEW_13俄罗斯游戏分析和总体设计31俄罗斯方块游戏功能描述对于俄罗斯方块游戏,其功能描述如下游戏开始,游戏区域上方不断地出现预定义形状的下坠物件。下坠物件可以通过旋转改变其显示形态,并且不断地往下坠,直到它接触到游戏区域底部或其他之前已经累叠起的下坠物件。当一个下坠物件到达底部后,其位置则确定下来并占有该空间的位置区域。当游戏区域的某一行被下坠物件完全填充,则消除该行的所有下坠物,垒在其上的物件将掉下代替该行空间。游戏的结束是以下坠物件的顶部到达游戏区域顶部作为判断依据,表示装满溢出。并且在某一瞬间,下一个下坠物件的形态在游戏区域的右上方有预先提示,同时每抵消一行空间积分自增100。32游戏规则分析首先,在游戏开始后检查当前的下坠物是否已经到了底部,如果不是的话就将下坠物到了该定时器间隔的时间后整体往下移动一个单位,否则,进行到达底部后的操作。对于到达底部后的操作,可以分成以下几个步骤来处理。1先对进行到底部后的所有可以抵消的行进行销行处理。2生成一个新的“下一个下坠物”,这个下坠物的形态需要随机地生成。3在将旧的“下一个下坠物”置换成新的下一个下坠物,并在屏幕右上方显示。4将当前的“下坠物”换成以前产生的旧的“下一个下坠物”,并且马上使用。由于在这个过程中已经重新使用了一个新的下坠物件,在刚使用时并且还没有下降前,应该判断它是否已经不可以下降到底部也就是说,在方块己经堆砌到接近游戏区域顶部的时候,下坠物件一旦被使用,就已经到达了底部,如果是刚好到达底部则实行销行检测和操作,并且判断顶部第一行的某些区域是否已经被占用了,是则表示游戏已经触发结束的标志时间,应该进入游戏结束状态。5在前面判断为到达底部后,进行销行检测与操作。6在下坠物到达底部的同时,判断是否已经到达了游戏的顶部,是则表示游戏结束,进行游戏结束的资源释放与数据环境清理工作整个流程如图12所示。开始到达低部1销行操作2生成新的“下一个下坠物”3将新生的下坠物代替旧的“下一个下坠物”4将旧的“下一个下坠物”用作当前下坠物5销行操作6游戏结束处理到达顶部,游戏结束结束到达低部7下降一个单位图12流程图4俄罗斯方块游戏的实现俄罗斯方块游戏设计的实现,主要包括游戏核心数据的抽象与设计、操作方法的抽象与设计、及流程的设计与实现等。下面将对这几个部分作具体的设计。41游戏核心数据的抽象与设计在抽象出方法和属性前,先来分析一下整个游戏的具体实现。首先,游戏有开始、暂停、结束等操作接口,而在游戏过程中,随着用户的按键交互,会出现方块的形态变化、方块快速下坠、安放该下坠物件、销毁填满的行、产生下一将要出现的方块等功能。这里,先分析游戏的特点,把整个游戏的核心数据结构提取出来,再根据数据结构的特点提取出核心功能模块的关联,然后对这些功能一一进行细化,从而完成整个游戏的设计。下面就来分析整个游戏的整体状况,如图13所示。图13游戏内部方块从如图13所示可以看到,游戏区域可以看作是由许多个等面积的小方块构成的大面积区域。而这些区域的状态只有2种,被下坠物占据和空闲没有被下坠物占据,因此,对于整个游戏区域的数据,用一块空间来标识即可。其状态只有两种被占据1和空闲0。这块空间的分配,可以采用动态分配的方式或者静态分配的方式去实现,至于数据结构的选择,可以是链表、队列或者数组等,我这里选择静态分配并划分一个足够大的二维数组的方式来实现,如下所示。/INFILESKYBLUE_RECTVIEWHDEFINEMAX_ROW100/地图的最大行数DEFINEMAX_COL100/地图的最大列数/INFILESKYBLUE_RECTVIEWHCLASSCSKYBLUE_RECTVIEW/内部存取数据结构INTM_STATEMAPMAX_ROWMAX_COL从上述代码可以看到,在视图类对象里面分配了一个存储游戏区域地图状态的二维数组ID_STATEMAP成员变量,并定义其最大行数和列数都为100当然,实际可能并不需要那么大,只是先分配好足够的地图空间以供使用而已。同时,还应该预先定义该区域的两种状态值DEFINEMAP_STATE_EMPTY0/空(未被占据)DEFINEMAP_STATE_NOT_EMPTY1/被占据整个游戏区域的地图设计好后,再来看看具体的下坠物,通过分析它们的特性,还可以抽象出一些物件来。在每个下坠物在下坠的过程中,总是占有地图中的某一块区域,那么怎样表达这些下坠物的形态和它们占有的位置关系呢在此,先来看看它们的基本类型,然后进行归纳分析,其基本类型如图14所示。图14方块基本类型从图14可以看到,这些下坠物的形状一共有7种,对于这些形态各异的下坠物间存在一个最基本的共性,就是它们占有的位置空间是一样的,都是4个小方块区域。对于它们在某一瞬间的位置标识,我们可以采用一个4X2的小数组标识出来,如图15所示。图15方块位置标识也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个点的坐标值X,Y,于是就有如下定义。/INFILESKYBLUE_RECTCIEWH/用于保存当前方块的动态位置,4个小方块分别在大数组中的存放位置为先左后右,/每一列又遵循先上后下的原则INTACTIVESTATUS42/存入下一个要出现的方块形状的数组INTNEXTSTATUS42在上述代码中,分配了一个整型的二维数组ACTICESTATUS来存储每个下坠物的4个子方块的坐标位置,其实在游戏过程中,变动的下坠物件除了当前用户正在操控的下坠物件外,项目程序的右上方还需要显示出下一个下坠物件的形状。也就是说,在游戏过程中的某一瞬间,除了需要记录当前用户正在控制的下坠物状态外,还需要记录预先随机生产出来的下坠物件状态,于是代码中多了一个NEXTSTATUS数组成员变量,用以存储下坠物的形态。还有一个问题没有解决,这些形状各异的下坠物件,虽然都是由4个小方块构成,但是对于它们的编号还没有一定的规律,因此需要人为地定下一些规则,而这个规则就是编号从下坠物的左边起往右编排,而在同一列的方块中,则从上往下的顺序开始编号它们的对应关系如图16所示。图16方块类型对应位置标识如图16所示的两个不同的下坠物,每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号,而该方块所在游戏区域的位置坐标则存储在下标与编号所对应的ACTICESTATUS二维数组的每个单位里面,如ACTICESTATUS00和ACTICESTATUS01则是第0号方块的横坐标X和纵坐标Y。ACTICESTATUS20和ACTICESTATUS21则是第2号方块的横坐标X和纵坐标Y。至此,可以实现下坠物件的位置标识了,那么对于某一下坠物的形态特性又怎么标识呢可以使用这样的方法用一个宏去标识,第1位的数值变化范围为17,用于标识下坠物的种类7种,第2位标识该种类下坠物的不同形态,不同的下坠物,如“田”字形的下坠物只有1种形态,所以没有第2位,其他的不同形态则从14最多有4种形态按顺序标识即可,如第2种下坠物的第3种形态,其宏标识为23,如图17所示。01232031下坠物编号4状态编号1234形状宏标识41424344图17方块变形表示42操作方法的抽象与设计当完成整个游戏的基本核心数据的表达并进行抽象与设计后,接下来,就可以根据游戏的特性对核心的基本操作方法进行抽象,进而实现这些功能。下面将着重分析游戏过程中的实现细节,以便抽象出基本的操作功能。首先是游戏开始,应该有个事件触发游戏的开始,譬如菜单栏选项等,相应地,也可以类推出游戏暂停与游戏结束等操作功能。游戏开始后,产生一个下坠物件,并且在右上角生成下坠物件的基本形态,因此有随机物件产生这个操作。在游戏过程中,方块会自动随着时间的推移而向下移动,因此有向下移动的操作。在游戏过程中,用户可以通过按键对下坠物的功能进行操作,如变形操作、加速下降操作、向左移动操作、向右移动操作等。上面说到的几点大多是从与用户交互的角度去观察分析的,而从游戏的规则方面,也可以作一下分析,当下坠物响应用户的指示向左或向右移动的时候,需要判断该不坠物件是否已经到这了游戏区域的边界而无法向左或着向右移动当下坠物的形态改变的时候,需要计算出应该改变成何种形态当下坠物向下移动的时候,需要判断是否已经到达了底部等。先虚拟出该俄罗斯方块游戏的类对象,并抽象出核心的数据属性和操作方法等,然后再作细,最后将整个虚拟类的外壳脱掉,再移植到视图类中去,其实现如下所示。CRECTGAMEVIEWPUBLICCVIEW/内部存取数据结构INTM_STATEMAPMAX_ROWMAX_COL/用于保存当前方块的动态位置,4个小方块分别在大数组中的存取位置为先左后/右,每一列又遵循先上后下的原则INTACTIVESTATUS42/存入下一个要出现的方块形状的数组INTNEXTSTATUS42/初始化操作GAMEINITNAL;/游戏的初始化/用于判断数据相关状态的操作ISLEFTLIMIT/下坠物体是否可向左移动ISRIGHTLITMIT/下坠物体是否可向右移动ISBOTTOM/是否已经到达底部ISGAMEEND/是否游戏已经结束/方块物体下坠过程中的操作RECTCHANGE/下坠物体变形RECTDOWN/下坠物体正常下落RECTARROW/下坠物体方向移动左,右,下加速/状态控制操作GAMESTART/游戏开始GAMEPAUSE/游戏暂停GAMEEND/游戏结束通过上面的代码可以看出,在虚拟类中抽象出了核心的内部数据和一些基本的操作函数。对于操作函数,可以把它们分成内部实现的基本核心操如判断操作以及明显提供给外部使用的整体模块外部操作如状态控制操作。而内部的基本操作又可以分成判断操作和执行操作这样两种类型。这里将上面涉及到的操作整理成表,如表41所示。表41操作函数及功能描述属性和操作功能描述外部操作状态控制操作组GAMESTART游戏进入开始状态,进行相关数据的初始化以及关联操作GAMEPAUSE游戏进入暂停状态,进行数据的保持与其他关联的操作GAMEEND游戏进入结束状态,进行数据的清除以及资源的销毁和释放操作内部基本核心操作判断操作组ISLEFTLIMIT向左偏移前,判断该下坠物件是否已经到达了游戏区域的最左边界不可以再左移ISRIGHTLITMIT向右偏移前,判断该下坠物件是否已经到达了游戏区域的最右边界不可以再右移ISBOTTOM向下偏移加速或者下坠物件自动向下偏移前,判断是否已经到达了底部这里对底部定义是游戏区域底部或下面有其他下坠物ISGAMEEND判断下坠物是否到达了游戏区域顶部而应该结束游戏执行操作组RECTCHANGE下坠物件的状态变形,方法为在原来的状态下逆时针旋转90度RECTDOWN该下坠物件的4个小方块所有坐标位置向下偏移一个单位RECTARROW直接响应用户按键,向左或者向右或者向下偏移一个单位其他操作GAMELNITNAL游戏的初始化操作43流程的设计与实现流程的设计分正常流程设计和中断流程设计。下面对这两部分做具体的设计和实现。431正常流程的设计对于正常流程的实现是由定时器驱动的,也就是说,当预定的时间间隔到达后就执行这样的一个工作流程,所以必须先设置一个定时器机制,下面来对增加一个定时器进行实现。从分析游戏的特性可以知道,定时器的产生与生效应该在游戏开始的时候,而在游戏暂停或者游戏结束时则将已经设定的定时器失效/销亡对于暂停的情况,使它销亡,当游戏从暂停状态又进入游戏状态的时候,则重新创建一个定时器并激活它的运作,所以分别在游戏的开始函数、暂停函数以及结束函数中实现定时器的激活与去激活工作。这里,先在资源编辑器菜单资源里面添加3个菜单选项,分别是游戏的“开始”、“暂停”和“结束”由于这3个功能是外部给用户操作的功能,所以可以预先在菜单栏中添加相应的功能选项,然后在视图类中实现它们即可,当它们找到直接关联的物件后对虚拟类的功能操作预先脱壳,然后利用CLASSWIZARD直接在视图类对象CSKYBLUE_RECTVIEW中为它们添加空白的处理函数,具体如表42所示。表42菜单选项功能对应表菜单选项名称快捷键资源ID晌应处理函数开始游戏SETTIMER1、1500250M_ILEVEL、NULLL/游戏暂停VOIDCSKYBLUE_RECTVIEWONGAMEPAUSHM_BGAMEPAUSHTRUEKILLTIMER1/游戏结束VOIDCSKYBLUE_RECTVIEWONGAMEENDM_BGAMEENDTRUEM_BGAMEPAUSHFALSE/清除游戏暂停状态KILLTIMER1从上面的3个函数代码中可以看到,在添加这3个函数时,视图类还添加了涉及到游戏状态的3个成员变量,它们分别是用作判定当前游戏等级的M_ILEVEL、记录游戏状态的M_BGAMEPAUSH是否暂停和M_BGAMEEND是否结束游戏,它们在视图类中的定义如下所示。/INFILESKYBLUE_RECTVIEWHCLASSCSSKYBLUE_RECTVIEW/当前的级别,换算成速度的算法为1500M_ILEVEL200INTM_ILEVEL/游戏是否已经结束或者暂停BOOLM_BGAMEENDBOOLM_BGAMEPAUSH其中M_ILEVEL变量是标识当前游戏的等级,随着游戏等级的升高,定时器的固定时间间隔会逐渐变短,从而达到加快下降速度的效果。432正常流程的实现定时处理经过定时器的设置后,就可以在定时器预定时间到达后对正常流程进行实现了。这里通过利用CLASSWIZARD跳到定时器到时后的处理函数ONTIMERO去实现,其清单如下所示。/INTFILESKYBLUE_RECTVIEWCPPVOIDCSKYBLUE_RECTVIEWONTIMERUINTNIDEVENT/如果原来的方块已到底或游戏刚开始,则掉下一个新的方块INTI,J,KIFM_ISBOTTOM/1产生下一个随机下坠物M_ICURRENTSTATUSM_INEXTSTATUSM_INEXTSTATUSRANDOM7/得到下一次的方块样式/IFM_INEXTSTATUS0M_INEXTSTATUS/2修改新的“下一下坠物”RECTSTATUSTONEXTSTATUSM_INEXTSTATUS/CRECTRECTM_ISTARTY320,M_ISTARTX,M_ISTARTY440,M_ISTARTX160/INVALIDATERECT/INVALIDATEFALSE/3将旧的“下一下坠物”用作当前使用M_CURRENTRECTM_ICURRENTSTATUS/根据当前下坠物的形状去初始化激活状态下的下坠物坐标RECTSTATUSTOACTIVESTATUSM_ICURRENTSTATUS/将当前动态数组中的数据反映到大数组中ACTIVESTATUSTOGAMESTATUSM_ISBOTTOMFALSE/4判断当前方块是否已到底ISBOTTOM/5判断游戏是否已结束碰了底,且第1行有小方块IFM_ISBOTTOMFORI0ISELECTOBJECTM_PBLACKBRUSHCRECTRECTGETCLIENTRECTPDCRECTANGLERECT/选用灰色画刷,绘制游戏区域的背景PDCSELECTOBJECTM_PGRAYBRUSHPDCRECTANGLEM_ISTARTY,M_ISTARTX,M_ISTARTY301,M_ISTARTX360PDCSELECTOBJECTM_PBLACKPEN/画网格线IFM_BDRAWGRID/画横线FORI0IMOVETOM_ISTARTY,M_ISTARTXIM_ILARGEPDCLINETOM_ISTARTY300,M_ISTARTXIM_ILARGE/画竖线FORI0IMOVETOM_ISTARTYIM_ILARGE,M_ISTARTXPDCLINETOM_ISTARTYIM_ILARGE,M_ISTARTX360INTX,Y,NW,NH/小方块的绘制FORI0IBITBLTX,Y,NW,NH,/显示游戏区域及游戏级别的汉字描述IFM_BGAMEENDPDCSETBKCOLORBLACKPDCSETTEXTCOLORWHITEPDCTEXTOUTM_ISTARTY320,M_ISTARTX220,“游戏区域大小“PDCTEXTOUTM_ISTARTY320,M_ISTARTX240,M_STRAREAPDCTEXTOUTM_ISTARTY320,M_ISTARTX280,“游戏级别“PDCTEXTOUTM_ISTARTY320,M_ISTARTX300,M_STRLEVEL/显示总分IFM_BGAMEENDCSTRINGLSSTRLSSTRFORMAT“总分为D分“,M_IPERFORMANCEPDCSETBKCOLORBLACKPDCSETTEXTCOLORWHITEPDCTEXTOUTM_ISTARTY320,M_ISTARTX180,LSSTR/画下一次将要出现的方块,用于提示用户IFM_BGAMEENDPDCSETBKCOLORBLACKPDCSETTEXTCOLORWHITEPDCTEXTOUTM_ISTARTY320,M_ISTARTX,“下一个方块“INTX,Y,NW,NHFORUINTK0KBITBLTX,Y,NW,NH,从上述代码可以看到,这里并不是先将各个部分的图像所在的位置先计算出来,然后在相应的位置绘制适当的图像,而是采用类似于平常的手工作画方式,首先是将整个画布画上背景色,接着绘制游戏区域的背景色将原来整个画布的背景覆盖掉,然后在游戏区域中将位置为被占用状态的区域绘制成小方块图样,并将原先绘制好的游戏区域背景色覆盖掉。一般来说,使用这种方式去实现绘制,效率比先逐个计算出每个位置区域应当显示的图样,然后再一次性地绘制的方式要高,因为这样做不必花费太多的时间在计算方面。在绘制之前,分别通过黑色画刷M_PBLACKBRUSH以及灰色画刷M_PGRAYBRUSH,对窗口区域背景以及游戏区域背景进行绘制,并且选择黑色画笔M_PBLACKPEN对网格进行绘制。对于这些画刷和画笔的使用,也要预先准备好,所以在绘图资源初始化和释放函数中,也要添加它们的创建和释放。至此,就完成了俄罗斯游戏的全部基本功能,效果如图111所示。图111游戏界面5功能的完善完成游戏的功能后,为了使得游戏功能更加健全,还需要对它进行一些完善,下面是附加功能描述的列表,如表51所示。表51附加功能描述列表功能名称选项其他描述游戏等级选择初级顶级对游戏快慢难度的设定方块图案样式选择深蓝条纹对下坠物的小方块图案样式选择游戏区域大小选择小、中、大对游戏区域的行列数选择网格的选用有、无是否需要在游戏区域绘制网格背景音乐的选用有、无在游戏过程中是否播放背景音乐有了上面的目标功能定义后,这里先将这些目标功能通过资源编辑器在主菜单条进行添加,将前面已有的菜单选项补全,再通过CLASSWIZARD添加对应的响应处理函数,其详细信息如表52所示。表52菜单选项功能对应表菜单选项名称快捷键资源ID晌应处理函数基本选项组HWNDGETSAFEHWND/分配命令字符串缓冲,错误信息储存缓冲,播放的文件名CHARSZCMDBUF300,ERRBUF60,SZFILENAME255/错误码MCIERRORMCIERROR/初始化设备元素STRCPYSZFILENAME,“SKYBLUE_RECTMID“/初始化命令字符串WSPRINTFSZCMDBUF,“OPENSTYPESEQUENCERALIASBKMUSIC“,SZFILENAME/打开设备MCIERRORMCISENDSTRINGSZCMDBUF,ERRBUF,SIZEOFERRBUF,NULLIFMCIERROR0/如果打开成功则播放MCIERRORMCISENDSTRING“PLAYBKMUSICNOTIFY“,NULL,0,HWND/根据播放操作是否成功决定是否关闭设备IFMCIERROR0MCISENDSTRING“CLOSEBKMUSIC“,NULL,0,NULL/终止插放背景音乐/VOIDCSKYBLUE_RECTVIEWSTOPMID/关闭设备MCISENDSTRING“CLOSEBKMUSIC“,NULL,0,NULL完成播放PLAYMID以及停止播放STOPMID的功能封装后,现在只需在相应的菜单选项以及适当的代码位置中加上它们就可以了。52工具栏快捷键的实现在完成上面补充功能的拓展和完善后,接下来为俄罗斯方块游戏增加一个放置常用功能选项的工具栏,以便用户可以通过鼠标点击而直接对相应的选项功能进行实现。这些常用功能选项分别是游戏的“开始”、“暂停”、“结束”、“配置”。1工具栏的定义/INFILEMAINFRMHCLASSCMAINFRAMECTOOLBARM_WNDTOOLBAR2工具栏的创建/JINFILEMAINFRMCPPINTCMAINFRAMEONCREATELPCREATESTRUCTLPCREATESTRUCTIFCFRAMEWNDONCREATELPCREATESTRUCT1RETURN1/工具栏的实现CIMAGELISTIMGCSTRINGSTRIFM_WNDTOOLBARCREATEEXTHIS,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMICRETURN1/设置按钮的宽度和长度M_WNDTOOLBARGETTOOLBARCTRLSETBUTTONWIDTH40,100/改变属性M_WNDTOOLBARMODIFYSTYLE0,TBSTYLE_FLAT|CBRS_TOOLTIPS|TBSTYLE_TRANSPARENT|TBBS_CHECKBOX/设置按钮数为6M_WNDTOOLBARSETBUTTONSNULL,4/2添加图像/设置“热/HOT“状态的的位图IMGCREATE28,28,ILC_COLOR8|ILC_MASK,2,2IMGSETBKCOLORRGB0,0,102/顺序增添按键的图标IMGADDAFXGETAPPLOADICONIDI_ICON_STARTIMGADDAFXGETAPPLOADICONIDI_ICON_PAUSEIMGADDAFXGETAPPLOADICONIDI_ICON_ENDIMGADDAFXGETAPPLOADICONIDI_ICON_SETM_WNDTOOLBARGETTOOLBARCTRLSETHOTIMAGELISTIMGDETACH/设置“冷/COLD“状态的位图IMGCREATE32,32,ILC_COLOR8|ILC_MASK,2,2IMGSETBKCOLORGETSYSCOLORCOLOR_BTNFACE/顺序增添按键的图标IMGADDAFXGETAPPLOADICONIDI_ICON_STARTIMGADDAFXGETAPPLOADICONIDI_ICON_PAUSEIMGADDAFXGETAPPLOADICONIDI_ICON_ENDIMGADDAFXGETAPPLOADICONIDI_ICON_SETM_WNDTOOLBARGETTOOLBARCTRLSETIMAGELISTIMGDETACH/3设置文字M_WNDTOOLBARSETBUTTONINFO0,ID_GAME_START,TBSTYLE_BU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论