1、湖南大学毕业设计(论文)第 IV 页 基于.Net的俄罗斯方块游戏设计与实现摘 要俄罗斯方块游戏,从俄罗斯人阿莱克斯帕伊特诺夫在八十年代末制作成功以来,以其规则简单,容易上手,游戏过程变化无穷,且能在娱乐中益智等特点,它已经成为一个家喻户晓老少皆宜的大众游戏。我设计的这款俄罗斯方块游戏,具有丰富的游戏操作功能,用户可以根据自己的操作水平和喜好进行相应的游戏操作设置,从而不仅使游戏初学者也能从中享受到成功的快乐,既便高水平的玩家也能品尝到挑战的刺激。游戏还可以保存前十名高分信息,让用户有不断挑战新高度的乐趣。该游戏在Visual Studio2005环境中使用C#开发实现。C#是基于面对象的开发
2、设计的编程语言,面向对象的开发在近年已广为普及,成为软件开发最基本的方法。Visual Studio2005作为当前功能最为强大的可视化集成开发环境,它不仅支持传统的软件开发方法,更重要的是它能支持可视化的开发风格。同时它还提供了相当优秀的代码编辑、调试、向导、编译和可视化资源编辑等功能,这些强大的功能使它成为当今世界最好的系统开发工具之一。关键字:俄罗斯方块,面向对象的开发,集成开发环境The Design and Implement of Tetris Based on .net AbstractIn the 1980s, a Russian named Alex Pajitnov des
3、igned and developed the Tetris game. After that the Tetris game has become a well-known and all ages game because of its simple roles, easy controlling and changeable gaming process.The Tetris game that I designed allows you to play the game in your own way. Players can change the configuration of c
4、ontroller by themselves, so not only beginners can enjoy the game, but some high level players also can challenge themselves. Besides all above, the game can save the top ten scores, and this function can inspire players to reach higher peak.The game is developed in C# with Microsoft Visual Studio 2
5、005.C# is a programming language based on OOP. The OOP has been well-known to all these years and it has been a basic software programming method now. As the strongest IDE, the Microsoft Visual Studio 2005 supports classic developing method and visual developing as well. As the same time, it supplie
6、s many functions such as outstanding code editor, debugger, Wizard, compiler, visual resource editor and so on. All these strong function make this tool the best one in the world.Key words: Tetris, OOP, IDE目 录1 绪论11.1 课题背景及目的11.2 国内外研究状况11.3 课题研究方法21.4 论文构成及研究内容22 技术原理32.1 编程语言32.2 面向对象32.3 GDI+62.4
7、 .net Framework 2.072.5 DirectSound组件82.6 配置文件92.7 XML语言92.8 多线程103 系统设计123.1 系统设计思想123.2 运用的控件和主要对象133.3 主要实现的功能134 系统实现144.1 屏幕信息初始化144.2 方块的实现154.3 键盘输入事件处理154.4 方块的移动184.5 方块的变换204.6 游戏速度与自动下降214.7 满行判断及消行234.8 声音播放254.9 游戏结束判断及处理254.10 游戏设置254.11 分数保存26小结27致谢28参考文献29附录A31附录B32湖南大学毕业设计(论文)第 33 页
8、1 绪论1.1 课题背景及目的俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人着迷。相信大多数人都还记得为它的规则简单,容易上手,且游戏过程变化无穷。而在“联众俄罗斯方块”中,游戏人既能感受到游戏中的乐趣,也能提供一个展现自己高超技艺的场所。究其历史,俄罗斯方块最早还是出现在PC机上。无数人进入游戏编程的世界都是从编写俄罗斯方块游戏开始的,因为这是检验一个人对开发语言、环境和基本数据结构知识熟练程度的便捷途径。Microsoft Visual
9、 Studio提供了开发Window应用程序的最迅速,最简捷的方法。不论是Windows 应用程序的资深专业开发人员还是初学者,Microsoft Visual Studio都为他们提供了整套的工具,以方便开发应用程序1。本课题的目的是在实现俄罗斯方块基本游戏的前提下,优化其算法与数据结构,并增加一些传统游戏中没有的新特点,最终实现一款小巧精致的益智俄罗斯方块游戏。本课题要求在.net平台下采用C#实现,图形使用GDI,并增添一些传统游戏未有的新特点,如在变换部件块的方位时同时改变其颜色,在游戏中可动态调整游戏的速度,在削去单行及多行时提供不同的音乐提示等。通过对本课题设计的实现,能提高对数据
10、结构与算法的认识,熟悉.net开发环境的使用,并且能提高对一些组件比如winmm与DirectSound中的接口的了解。1.2 国内外研究状况俄罗斯方块红遍世界的各个角落,一个本来是吃大锅饭的人在消极怠工的时候发明的娱乐工具成了造福全人类的宝贝,它的价值远远超越了开发时候的预想。这是一个算法实现比较简单,但又乐趣无穷的游戏。课题用C#实现,这是一种基于面向对象开发方法的编程语言。面向对象的方法正受到全世界越来越强烈的关注和高度重视,针对日趋复杂的软件需求,业界也越来越崇尚利用面向对象的方法和思想进行软件开发2。1.3 课题研究方法俄罗斯方块诞生到现在已经超过20年,无数人都曾设计并实现过自己的
11、俄罗斯方块。本课题完全按照课题要求实现,在保持原有俄罗斯方块规则不变的前提下,尽可能的提高游戏的乐趣。比如可调节的速度,可变化的颜色,多种不同的音效提示,可保存分数等等。本设计在.net平台下采用C#实现,图形使用GDI。游戏区域所选择的控件为PictureBox,而当选择Panel或者其他控件时,重画会有明显的拖慢。游戏的音效与音乐用两种不同的方式实现,音效使用DirectSound,音乐则使用到winmm这个组件,因为在尝试使用同一种方式同时播放两种声音时,出现了不能同时播放的问题,因此用这个办法来解决。在游戏存储方面,对于游戏分数的记录使用了XML文档进行存储,而对于用户配置的存储,使用
12、到了配置文件。1.4 论文构成及研究内容第二章介绍了该设计实现过程中所使用到的技术原理,这些是此课题实现的基本理论。第三章粗略的描述了课题的设计,这其中描述了课题的功能以及对这些功能的分析等。第四章详细描述了课题各个功能的具体设计思想与具体实现的过程。2 技术原理2.1 编程语言C#是一种编程语言,它是为生成在 .NET Framework 上运行的多种应用程序而设计的。C# 简单、功能强大、类型安全,而且是面向对象的3。C# 凭借它的许多创新,在保持 C 样式语言的表示形式和优美的同时,实现了应用程序的快速开发。Visual Studio 支持C#,这是通过功能齐全的代码编辑器、项目模板、设
13、计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。通过 .NET Framework 类库,可以访问多种操作系统服务和其他有用的精心设计的类,这些类可显著加快开发速度与减少开发周期4。2.2 面向对象面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域5。面向对象的基本概念:1. 对象。对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。2. 对象的状态和行为。对象具有状态,一个对象用数据值来描
14、述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中3. 类。具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象6。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。4. 类的结构。在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般-具体结构关系,整体-部分结构关系。(1) 一般具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。(2)
15、整体部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。5. 消息和方法。对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。面向对象的特征:1. 对象唯一性。每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。2. 分类性。分类性是指将具有一致的
16、数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。3. 继承性。继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。在软件开
17、发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重性。采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。4. 多态性(多形性)多态性使指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。多态性允许每个对象以适合自身的方式去响应共同的消息7。多态性增强了软件的灵活性和重用性。面向对象的要素:1. 抽象。抽象是指强调实体的本质、内在的属性。在系统开发中,抽象指的是在决定如何实现对象之前的对象
18、的意义和行为。使用抽象可以尽可能避免过早考虑一些细节。类实现了对象的数据(即状态)和行为的抽象。2. 封装性(信息隐藏)。封装性是保证软件部件具有优良的模块性的基础。面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。对象是封装的最基本单位。封装防止了程序相互依赖性而带来的变动影响。面向对象的封装比传统语言的封装更为清晰、更为有力。3. 共享性面向对象技术在不同级别上促进了共享同一类中的共享。同一类中的对象有着相同数据结构。这些对象之间是结构、行为特征的共享关系。在同一应用中共享。在同一应用的类层次
19、结构中,存在继承关系的各相似子类中,存在数据结构和行为的继承,使各相似子类共享共同的结构和行为。使用继承来实现代码的共享,这也是面向对象的主要优点之一。在不同应用中共享。面向对象不仅允许在同一应用中共享信息,而且为未来目标的可重用设计准备了条件。通过类库这种机制和结构来实现不同应用中的信息共享8。4. 强调对象结构而不是程序结构2.3 GDI+色彩鲜艳漂亮的高品质图像,一个个形象生动的Windows图标,高速运动、活灵活现的三维动画,这些无一不显示出程序设计者的艺术才华。在程序设计中,图像处理已经成为每个程序员的必修课9。在VC中编程显示一幅位图,下列步骤是不可缺少的:装入位图、获得位图的大小
20、信息、启用设备环境、位传输等,所需的程序代码一般比较冗长而且复杂。如果想将装入的位图另存为其他格式的图像文件,代码就更长了。这一切都是因为GDI本身的局限性造成的。GDI+技术使程序员不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序。和传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)。它是通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。对于图像文件,GDI+所关心的不是图像文件的文件头信息,不论要打开的文件格式是什么类型,GDI+首先要做的是在注册表中查看该图像格式的编码(或
21、解码)信息是否已经注册(HKEY_CLASSES_ROOTMIMEDatabaseContentType)。如果已经注册,就通过该编码信息调用COM组件,就这么简单。有了GDI+之后,只需简单地创建一个图形对象(Graphicsobject),然后直接调用该对象的方法(methods)进行绘图即可。图形对象是GDI+中的核心,正如DC之于GDI那样。图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别10。一个是基于句柄的GDI,一个是基于组件对象模型的GDI+。使用GDI+的SDK编程,必须按照下面的规范来进行:使用GDI+的命名空间(namespa
22、ceGdiplus),在使用GDI+函数时必须进行GDI+的初始化,使用完毕要销毁GDI+。2.4 .net Framework Framework是一个可以用来快速开发、部署网站服务及应用程序的开发平台。这个架构是两个项目的结果:第一个项目的目的是用来改善Windows 作业平台上的程序开发,特别是改善COM(Component Object Model,组件对象模块。一种微软所制定的软件技术;让对象的功能可以被其它软件所叫用,可以让组件重复使用、容易更新及维护);第二个项目则是制作一个以发展服务(Service)软件为目标的开发平台。这两个项目团队三年多前就已经在一起工作,他们希望可以发
23、展出一种可以快速开发出以因特网为基础,而且易学易用的开发平台。.net Framework 具有两个主要组件:公共语言运行库和.net Framework 类库11。公共语言运行库是.net Framework 的基础。您可以将公共语言运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。这类似于Java的虚拟机。事实上,代码管理的概念是公共语言运行库的基本原则。以公共语言运行库为目标的代码称为托管代码,而不以公共语言运行库为目标的代码称为非托管代码。.net Framework 的另一个
24、主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 ASP.net 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)12。.net Framework 旨在实现下列目标:提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。提供一个将软件部署和版本控制冲突最小化的代码执行环境。提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。提
25、供一个可消除脚本环境或解释环境的性能问题的代码执行环境。使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。按照工业标准生成所有通信,以确保基于.net Framework 的代码可与任何其他代码集成。2.5 DirectSound组件DirectSound是DirectX API的音频组件之一,它可以提供快速的混音、硬件加速功能,并且可以直接访问相关设备,当然,最主要的是它提供的功能与现有的设备驱动程序保持兼容性13。DirectSound允许进行波型声音的捕获、重放,也可以通过控制硬件和相应的驱动来获得更多的服务。Dire
26、ctSound的优势当然和DirectX的其它组件一样速度,它允许你最大效率的使用硬件,并拥有良好的兼容性。使用DirectSound可以做到什么呢?1、很方便的了解硬件能力,并且根据当前计算机硬件配置硬件来决定最好的解决问题的方法。2、弥补驱动程序的不足通过属性设置以便硬件能力可以完全发挥,即便是驱动程序没有很好的支持该功能。3、短传输延迟时间的混音为了快速的响应流。4、3-D声音5、声音的捕获DirectSound播放音频文件开发的基本流程:第一步,创建一个设备对象,设置设备对象的协作度。 第二步,创建一个辅助Buffer,也叫后备缓冲区。第三步,获取PCM类型的数据。第四步,将数据读取到
27、缓冲区。第五步,播放缓冲区中的数据。2.6 配置文件在应用系统开发时,管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等14。传统的配置文件ini已有被xml文件逐步代替的趋势,但对于简单的配置,ini文件还是有用武之地的。ini文件其实就是一个文本文件,它有固定的格式,节Section的名字用括起来,然后换行说明key的值:sectionkey=value2.7 XML语言扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用15。XML与Acce
28、ss,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。 XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows、Mac OS, Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输
29、出结果。XML(可扩展标记语言)是从称为SGML(标准通用标记语言)的更加古老的语言派生出来的。SGML的主要目的是定义使用标签来表示数据的标记语言的语法。标签由包围在一个小于号()之间的文本组成,例如。起始标签(start tag)表示一个特定区域的开始,例如;结束标签(end tag)定义了一个区域的结束,除了在小于号之后紧跟着一个斜线(/)外,和起始标签基本一样,例如。SGML还定义了标签的特性(attribute),它们是定义在小于号和大于号之间的值,例如中的src特性。如果你觉得它看起来很熟悉的话,应该知道,基于SGML的语言的最著名实现就是原始的HTML。在XML中,采用了如下的语
30、法:1. 任何的起始标签都必须有一个结束标签。2. 可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如。XML解析器会将其翻译成。3. 标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如this is a sample string。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。4. 所有的特性都必须有值。5. 所有的特性都必须在值的周围加上双引号。如今,XML已经是世界上发展最快的技术之一。它的主要目的是使用文本以结构化的方式来表示数据。在某些方面,X
31、ML文件也类似于数据库,提供数据的结构化视图16。2.8 多线程每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行17。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立18。线程
32、又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”19。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此将带来的线程调度,同步等问题20。使用线程的好处有以下几点:
33、使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。程序的运行速度可能加快。在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。3 系统设计3.1 系统设计思想游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。 从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,在设计中在一个图片框中构造了一个
34、30*30(像素)的小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。 俄罗斯方块游戏设计主要包括以下10个方面:1. 游戏界面的设计。2. 俄罗斯方块的实现
35、。3. 键盘输入信息的获取。4. 俄罗斯方块的移动(向左,向右和向下)。5. 俄罗斯方块的变换。6. 方块自动下落与速度的选择。7. 慢行的判断与消行。 8. 游戏得分的计算。 9. 游戏结束判断。10. 背景音乐及音效。 11. 用户配置保存。12. 得分保存。3.2 运用的控件和主要对象 在设计过程中主要用到的控件有:PictureBox控件,MenuStrip控件,Button控件,Label控件,Timer控件,winmm组件,DirectSound等等。 3.3 主要实现的功能我们开发的俄罗斯方块游戏,主要实现了以下几种功能: 1. 可以灵活控制方块在图形框中运动。2. 游戏过程中方
36、块可以自由旋转。3. 旋转方块同时变化方块颜色。4. 在游戏过程中可以自由调整游戏速度。5. 当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以同时消多行。 6. 游戏的得分支持积分,并且按照公式:得分 = 5+ 10 * (同时消除的行数-1) 这样,你同一时间消除的行数越多,你的得分也就越高,当游戏积分到了一定时可以自动升级,这个升级指速度升级。7. 游戏中提供了动听的音乐。8. 不同的用户对于键位有不同的要求,所以提供了配置保存的功能。这样就不需要每次游戏都重新配置。9. 保存前十高的分数。4 系统实现4.1 屏幕信息初始化用来显示状态信息的框private
37、 System.Windows.Forms.GroupBox statusBox;开始按钮 private System.Windows.Forms.Button btnStart;显示“下一块”的标签 private System.Windows.Forms.Label label3;显示“分数”的标签 private System.Windows.Forms.Label label2;显示“等级”的标签 private System.Windows.Forms.Label label1;用来画下一块方块的区域 private System.Windows.Forms.PictureBox
38、panel1;游戏区域 private System.Windows.Forms.PictureBox gameArea;菜单及许多菜单项的实现不一一列举,最终的的效果如下图:图 4.14.2 方块的实现在程序中每一个方块都是一个Block类的实例。Block包括的参数有方块的宽度,高度,最左端横坐标,最上端纵坐标,方块的数组表示。其中一共有7中形状的方块,以数组表示为: 11 11 1 11 010 10 01 01 10 1 11 111 11 11 01 10 1 01 10 1方块的7种形状分别以数字0-6来代表,在构造函数中,随机生成0-6中数字,以此来随机生成方块的形状。用来在界面
39、上显示方块的贴图也以0-6的数字来代表,同样以随机数的形式来随机的现实方块的颜色。4.3 键盘输入事件处理因为在界面上有一个按钮,并且只有一个按钮,所以该按钮在通常情况下都是默认为焦点。在这种情况下按下某些键,比如空格,就会产生出发按钮事件的情况。因此必须重载整个WinForm的ProcessCmdKey来避免这样的问题。当按向左,向右及旋转按钮时,只要相应的处理方块的位置或者形状即可,但是当按向下或者立即下落时,怎需要不同的处理。向下移动时,如果移动到最底部但还未固定,则需要重新设置计时器间隔时间,从而使自动下落时,底部未固定的方块到固定的时间相同。如果方块在最底部而未固定的时候,向下移动,
40、则立即固定。这两种情况,当方块固定后,都需要判断是否消行,并且重新处理分数和游戏等级及其显示,如果方块固定后导致游戏结束,则需要判断当前游戏分数是否进入排名,如果进入排名则需要进入系那个应的游戏分数记录处理。立即下落时,首先需要判断是否消行,然后重新处理分数与登记及其现实。如果该方块立即下落后导致游戏结束,则需要判断当前游戏分数是否进入排名,如果进入排名则需要进入相应的游戏分数记录处理。具体实现如下:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) if (游戏正在运行) if (游戏设置的向左按钮等于键盘
41、按下的按键) if (音效打开) 播放声音; 方块向左移动; 重画游戏区域; else if (游戏设置的向右按钮等于键盘按下的按键) if (音效打开) 播放声音; 方块向右移动; 重画游戏区域; else if(游戏设置的向下按钮等于键盘按下的按键) if (音效打开) 播放声音; 停止自动下落的计时器; if (方块向下移动后固定) 重新设置自动下落计时器的时间间隔; 重新显示分数与等级; else if (方块可以继续下移,表示方块在底部却未固定) 设置计时器间隔为当前间隔; else 设置计时器间隔为400毫秒; 重画游戏区域; 重画显示下一块图形的区域; if (游戏结束) 判断是否进排名并保存; 游戏结束处理; else 启动自动下落计时器; else if(游戏设置的旋转按钮等于键盘按下的按键) if (音效打开) 播放声音; 处理旋转方块; 重画游戏区域; else if (游戏设置的立即落下按钮等于键盘按下的按键) if (音效打开) 播放声音; 停止自动下落计时器; 处理立即落下方块; 重新设置自动下落计时器间隔时间; 重新显示分数; 重画游戏区域; 重画显示下一块图形的区域; if (游戏结束) 判断是否进排名并保存; 游戏结束处理; else 启动自动下落计时器;