您好,欢迎访问三七文档
用VC++设计与实现俄罗斯方块游戏时间:2010-09-2618:07来源:未知作者:admin点击:482次目录1引言61.1游戏的历史61.2Windows编程特点71.3VisualC++6.0编程特点81.4课程设计目的82需求分析92.1游戏需求92.2软硬件需求92.3接口控制103概要设计103.1定义方块的数据结构103.2游戏设计分析113.3游戏流程图134详细设计144.1总目录1引言61.1游戏的历史61.2Windows编程特点71.3VisualC++6.0编程特点81.4课程设计目的82需求分析92.1游戏需求92.2软硬件需求92.3接口控制103概要设计103.1定义方块的数据结构103.2游戏设计分析113.3游戏流程图134详细设计144.1总体设计144.2创建界面的主框架154.3正常流程的设计164.4中断操作流程的实现234.5游戏区域绘图的实现274.6功能的完善274.7游戏演示29参考文献30摘要本课程设计主要解决利用VisualC++设计与实现俄罗斯方块游戏的算法、游戏内部功能、游戏区域的绘图的程序设计。在课程设计中,系统开发平台为Windows2000,程序设计设计语言采用VisualC++6.0,程序运行平台为Windows98/2000/XP。对于每个俄罗斯方块各自的形态变换改变到下一个形态利用数组来实现,在程序设计中,采用MFC机制来实现,并且直接从架构的其中一个类对象中继承下来,将它完善而变成有某功能特性的物件对象。关键词俄罗斯方块;MFC;算法;数组1引言俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。然后程序根据这七种方块堆叠成各种不同的模型。1.1游戏的历史俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在联众俄罗斯方块中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所[1]。图1.1俄罗斯方块1.2Windows编程特点(1)图形用户界面Windows为用户提供了独立于应用程序的图形设备接口,利用这个接口,程序员可以在应用程序中显示文本和图形;所有的硬件设备都由Windows的设备驱动程序来管理。(2)多任务在传统的MS-DOS环境中,每次只能够执行一个任务,只有从一个任务中退出才能执行下一任务,这样在客观上就浪费了很多的资源。但是在Windows操作环境中,多个应用程序可以同时运行,每个应用程序在屏幕上都有一个显示的窗口,即为Windows的多任务环境。(3)资源共享在windows操作系统中,应用程序之间共享资源的方式共有三种:剪贴板、DDE和OLE。1.3VisualC++6.0编程特点VisualC++6.0是微软公司推出的开发Win32应用程序(Windows95/98/2000/XP/NT)的、面向对象的可视化集成工具。它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C++类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。1.4课程设计目的综合运用所学理论知识和技能,设计开发俄罗斯方块,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力,为将来实际工作打下坚实的基础。2需求分析2.1游戏需求随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置六关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。游戏功能要求如下:游戏界面需求:良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。键盘处理事件:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定的分数时过关。设置六关,每关方块下落的速度不同。2.2软硬件需求操作系统Windows98/me/2000/XP/2003内存容量64MB显卡要求8M声卡要求支持DirectX8.0音效卡交互工具键盘/鼠标CPU奔腾133以上光驱8倍速以上硬盘空间400MB显示器VGA以上显示器开发软件Java可视化编程3.0以上版本2.3接口控制本软件需求通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对方块进行移动变形,要使用键盘的接口事件。3概要设计3.1定义方块的数据结构对于方块在某一瞬间的位置标识,我们采用一个4×2的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号[2]。图3.1方块编号ActiveStatus[0][0]和ActiveStatus[0][1]则是第0号方块的横坐标x和纵坐标y;ActiveStatus[2][0]和ActiveStatus[2][1]则是第2号方块的横坐标x和纵坐标y。3.2游戏设计分析有前面的功能描述可知,我先虚拟出俄罗斯方块游戏的类对象,并抽象出核心的数据属性和操作方法等,然后再作细化,最后将整个虚拟类的外壳脱掉,再移植到视图类中去,其实现如下:CRectGameView:publicCView{//内部存取数据结构intm_stateMap[MAX_ROW][MAX_COL];//初始化操作GameInitnal();//游戏的初始化//用于判断数据相关状态的操作IsLeftLimit();//下坠物件是否可向左移动IsRightLitmit();//IsBottom();//是否已经到达了底部IsGameEnd();//是否游戏已经结束//方块物件下坠过程中的操作RectChange();//下坠物件变形RectDown();//下坠物件正常下落RectArrow();//下坠物件方向移动(左,右,下加速)//状态控制操作GameStart();//游戏开始GamePause();//游戏暂停GameEnd();//游戏结束}通过上面的代码可以看出,在虚拟类中抽象出了核心的内部数据和一些基本的操作函数。对于操作函数,可以把它们分为内部实现的基本核心操作(如判断操作)以及明显提供给外部使用的整体模块外部操作(如状态控制操作)。而内部的基本操作又可以分为判断操作和执行操作这样两种类型[3]。图3.1正常流程的设计图3.2中断流程的设计4详细设计4.1总体设计序号方法名作用1Main()定义窗口2Rectview()创建变量3Gamestart()游戏开始4DrawGame()游戏界面初始化5RectDown()当前方块下降6invalidatecurrent()刷新指定区域7OnTimer()承担所有驱动8GamePaush()游戏暂停9OnDraw()绘制屏幕10IsBottom()处理到达后的图形,进行加分,满行判断及消行处理等11KeyDown()控制按键信息12Rectchange()控制图形变化13GameEnd()游戏结束表4.1涉及函数图4.1程序运行调用图4.2创建界面的主框架首先建立一个项目工程,名为skyblue_Rect,并在AppWizard的架构选择过程中选择单文档方式,其他保持默认选项。其项目的架构类视图信息如图所示:在构架类视图中是MFC基本架构组合:App(应用程序)类、Document(文档)类、View(视图)类、Frame(框架)类和用于提示关于作者的对话框CAboutDlg类,至于COptionDlg类是用作俄罗斯方块参数选择的对话框类对象图4.2主框架图4.3正常流程的设计(1)定时制机制从分析游戏的特性可以知道,定时器的产生与生效应该在游戏开始的时候,而在游戏暂停或者游戏结束时则将已经设定的定时器失效/销亡(对于暂停的情况,使它销亡,当游戏从暂停状态又进入游戏状态时候,则重新创建一个定时器并激活它的运作),所以分别在游戏的开始函数、暂停函数已经结束函数中实现定时器的激活与去激活工作。这里,先在资源编辑器菜单资源里面添加三个菜单选项,分别是游戏的“开始”、“暂停”、和“结束”,然后利用ClassWizard直接在视图类对象Cskyblue_RectView中为它们添加空白的处理函数,具体如表2所示。表4.3菜单选项功能对应表菜单选项名称快捷键资源ID响应处理函数开始游戏&SID_GAME_STARTOnGameStart()暂停游戏&PID_GAME_PAISHOnGamePaush()结束游戏&EID_GAME_ENDOnGameEnd()(2)定时处理经过定时器的设置后,这里通过利用ClassWizard跳到定时器到时候的处理函数OnTimer()去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行RectDown()下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束。图4.3装载方块视图类创建了m_icurrentStatus和m_inextStatus两个成员变量来记录下坠物的类型,共有七种形状,并从7种方块中随机抽取图形。而m_currentRect除了记录下坠物的类型外,还需记录其当前的变形状态,最多用两位表示,第1位用作类型标识(1~7),第2位用作同种类型的不同表现方式,最多有4种状态(1~4)。在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。(3)底部到达的判断与销行的实现图4.4处理方块到达图将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态(MAP_STATE_NOT_EMPTY=1)来确定,利用数组InterFace
本文标题:俄罗斯方块c源代码
链接地址:https://www.777doc.com/doc-3271168 .html