基于Net的俄罗斯方块游戏设计与实现毕业设计论文Word文件下载.docx
《基于Net的俄罗斯方块游戏设计与实现毕业设计论文Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于Net的俄罗斯方块游戏设计与实现毕业设计论文Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。
![基于Net的俄罗斯方块游戏设计与实现毕业设计论文Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/27/088273c9-67f0-4a18-be63-c733ad92b4c8/088273c9-67f0-4a18-be63-c733ad92b4c81.gif)
Inthe1980s,aRussiannamedAlexPajitnovdesignedanddevelopedtheTetrisgame.AfterthattheTetrisgamehasbecomeawell-knownandallagesgamebecauseofitssimpleroles,easycontrollingandchangeablegamingprocess.
TheTetrisgamethatIdesignedallowsyoutoplaythegameinyourownway.Playerscanchangetheconfigurationofcontrollerbythemselves,sonotonlybeginnerscanenjoythegame,butsomehighlevelplayersalsocanchallengethemselves.Besidesallabove,thegamecansavethetoptenscores,andthisfunctioncaninspireplayerstoreachhigherpeak.
ThegameisdevelopedinC#withMicrosoftVisualStudio2005.C#isaprogramminglanguagebasedonOOP.TheOOPhasbeenwell-knowntoalltheseyearsandithasbeenabasicsoftwareprogrammingmethodnow.AsthestrongestIDE,theMicrosoftVisualStudio2005supportsclassicdevelopingmethodandvisualdevelopingaswell.Asthesametime,itsuppliesmanyfunctionssuchasoutstandingcodeeditor,debugger,Wizard,compiler,visualresourceeditorandsoon.Allthesestrongfunctionmakethistoolthebestoneintheworld.
Keywords:
Tetris,OOP,IDE
1绪论
1.1课题背景及目的
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与经济价值可以说是游戏史上的一件大事。
这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人着迷。
相信大多数人都还记得为它的规则简单,容易上手,且游戏过程变化无穷。
而在“联众俄罗斯方块”中,游戏人既能感受到游戏中的乐趣,也能提供一个展现自己高超技艺的场所。
究其历史,俄罗斯方块最早还是出现在PC机上。
无数人进入游戏编程的世界都是从编写俄罗斯方块游戏开始的,因为这是检验一个人对开发语言、环境和基本数据结构知识熟练程度的便捷途径。
MicrosoftVisualStudio提供了开发Window应用程序的最迅速,最简捷的方法。
不论是Windows应用程序的资深专业开发人员还是初学者,MicrosoftVisualStudio都为他们提供了整套的工具,以方便开发应用程序[1]。
本课题的目的是在实现俄罗斯方块基本游戏的前提下,优化其算法与数据结构,并增加一些传统游戏中没有的新特点,最终实现一款小巧精致的益智俄罗斯方块游戏。
本课题要求在.net平台下采用C#实现,图形使用GDI,并增添一些传统游戏未有的新特点,如在变换部件块的方位时同时改变其颜色,在游戏中可动态调整游戏的速度,在削去单行及多行时提供不同的音乐提示等。
通过对本课题设计的实现,能提高对数据结构与算法的认识,熟悉.net开发环境的使用,并且能提高对一些组件比如winmm与DirectSound中的接口的了解。
1.2国内外研究状况
俄罗斯方块红遍世界的各个角落,一个本来是吃大锅饭的人在消极怠工的时候发明的娱乐工具成了造福全人类的宝贝,它的价值远远超越了开发时候的预想。
这是一个算法实现比较简单,但又乐趣无穷的游戏。
课题用C#实现,这是一种基于面向对象开发方法的编程语言。
面向对象的方法正受到全世界越来越强烈的关注和高度重视,针对日趋复杂的软件需求,业界也越来越崇尚利用面向对象的方法和思想进行软件开发[2]。
1.3课题研究方法
俄罗斯方块诞生到现在已经超过20年,无数人都曾设计并实现过自己的俄罗斯方块。
本课题完全按照课题要求实现,在保持原有俄罗斯方块规则不变的前提下,尽可能的提高游戏的乐趣。
比如可调节的速度,可变化的颜色,多种不同的音效提示,可保存分数等等。
本设计在.net平台下采用C#实现,图形使用GDI。
游戏区域所选择的控件为PictureBox,而当选择Panel或者其他控件时,重画会有明显的拖慢。
游戏的音效与音乐用两种不同的方式实现,音效使用DirectSound,音乐则使用到winmm这个组件,因为在尝试使用同一种方式同时播放两种声音时,出现了不能同时播放的问题,因此用这个办法来解决。
在游戏存储方面,对于游戏分数的记录使用了XML文档进行存储,而对于用户配置的存储,使用到了配置文件。
1.4论文构成及研究内容
第二章介绍了该设计实现过程中所使用到的技术原理,这些是此课题实现的基本理论。
第三章粗略的描述了课题的设计,这其中描述了课题的功能以及对这些功能的分析等。
第四章详细描述了课题各个功能的具体设计思想与具体实现的过程。
2技术原理
2.1编程语言
C#是一种编程语言,它是为生成在.NETFramework上运行的多种应用程序而设计的。
C#简单、功能强大、类型安全,而且是面向对象的[3]。
C#凭借它的许多创新,在保持C样式语言的表示形式和优美的同时,实现了应用程序的快速开发。
VisualStudio支持C#,这是通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。
通过.NETFramework类库,可以访问多种操作系统服务和其他有用的精心设计的类,这些类可显著加快开发速度与减少开发周期[4]。
2.2面向对象
面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。
如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域[5]。
面向对象的基本概念:
1.对象。
对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
2.对象的状态和行为。
对象具有状态,一个对象用数据值来描述它的状态。
对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
3.类。
具有相同或相似性质的对象的抽象就是类。
因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象[6]。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
4.类的结构。
在客观世界中有若干类,这些类之间有一定的结构关系。
通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
(1)一般——具体结构称为分类结构,也可以说是“或”关系,或者是“isa”关系。
(2)整体——部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“hasa”关系。
5.消息和方法。
对象之间进行通信的结构叫做消息。
在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。
发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。
一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
面向对象的特征:
1.对象唯一性。
每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。
在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
2.分类性。
分类性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。
一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。
任何类的划分都是主观的,但必须与具体的应用有关。
3.继承性。
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。
在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。
在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。
在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重性。
采用继承性,提供了类的规范的等级结构。
通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。
4.多态性(多形性)
多态性使指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。
不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
多态性允许每个对象以适合自身的方式去响应共同的消息[7]。
多态性增强了软件的灵活性和重用性。
面向对象的要素:
1.抽象。
抽象是指强调实体的本质、内在的属性。
在系统开发中,抽象指的是在决定如何实现对象之前的对象的意义和行为。
使用抽象可以尽可能避免过早考虑一些细节。
类实现了对象的数据(即状态)和行为的抽象。
2.封装性(信息隐藏)。
封装性是保证软件部件具有优良的模块性的基础。
面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。
对象是封装的最基本单位。
封装防止了程序相互依赖性而带来的变动影响。
面向对象的封装比传统语言的封装更为清晰、更为有力。
3.共享性
面向对象技术在不同级别上促进了共享
同一类中的共享。
同一类中的对象有着相同数据结构。
这些对象之间是结构、行为特征的共享关系。
在同一应用中共享。
在同一应用的类层次结构中,存在继承关系的各相似子类中,存在数据结构和行为的继承,使各相似子类共享共同的结构和行为。
使用继承来实现代码的共享,这也是面向对象的主要优点之一。
在不同应用中共享。
面向对象不仅允许在同一应用中共享信息,而且为未来目标的可重用设计准备了条件。
通过类库这种机制和结构来实现不同应用中的信息共享[8]。
4.强调对象结构而不是程序结构
2.3GDI+
色彩鲜艳漂亮的高品质图像,一个个形象生动的Windows图标,高速运动、活灵活现的三维动画,这些无一不显示出程序设计者的艺术才华。
在程序设计中,图像处理已经成为每个程序员的必修课[9]。
在VC中编程显示一幅位图,下列步骤是不可缺少的:
装入位图、获得位图的大小信息、启用设备环境、位传输等,所需的程序代码一般比较冗长而且复杂。
如果想将装入的位图另存为其他格式的图像文件,代码就更长了。
这一切都是因为GDI本身的局限性造成的。
GDI+技术使程序员不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序。
和传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)。
它是通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。
对于图像文件,GDI+所关心的不是图像文件的文件头信息,不论要打开的文件格式是什么类型,GDI+首先要做的是在注册表中查看该图像格式的编码(或解码)信息是否已经注册(HKEY_CLASSES_ROOT\MIME\Database\Content
Type)。
如果已经注册,就通过该编码信息调用COM组件,就这么简单。
有了GDI+之后,只需简单地创建一个图形对象(Graphics
object),然后直接调用该对象的方法(methods)进行绘图即可。
图形对象是GDI+中的核心,正如DC之于GDI那样。
图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别[10]。
一个是基于句柄的GDI,一个是基于组件对象模型的GDI+。
使用GDI+的SDK编程,必须按照下面的规范来进行:
使用GDI+的命名空间(namespace
Gdiplus),在使用GDI+函数时必须进行GDI+的初始化,使用完毕要销毁GDI+。
2.4.netFramework2.0
.netFramework是一个可以用来快速开发、部署网站服务及应用程序的开发平台。
这个架构是两个项目的结果:
第一个项目的目的是用来改善Windows作业平台上的程序开发,特别是改善COM(ComponentObjectModel,组件对象模块。
一种微软所制定的软件技术;
让对象的功能可以被其它软件所叫用,可以让组件重复使用、容易更新及维护);
第二个项目则是制作一个以发展服务(Service)软件为目标的开发平台。
这两个项目团队三年多前就已经在一起工作,他们希望可以发展出一种可以快速开发出以因特网为基础,而且易学易用的开发平台。
.netFramework具有两个主要组件:
公共语言运行库和.netFramework类库[11]。
公共语言运行库是.netFramework的基础。
您可以将公共语言运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。
这类似于Java的虚拟机。
事实上,代码管理的概念是公共语言运行库的基本原则。
以公共语言运行库为目标的代码称为托管代码,而不以公共语言运行库为目标的代码称为非托管代码。
.netFramework的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面(GUI)应用程序,也包括基于ASP.net所提供的最新创新的应用程序(如Web窗体和XMLWebservices)[12]。
.netFramework旨在实现下列目标:
提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在Internet上分布,或者是在远程执行的。
提供一个将软件部署和版本控制冲突最小化的代码执行环境。
提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。
提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。
使开发人员的经验在面对类型大不相同的应用程序(如基于Windows的应用程序和基于Web的应用程序)时保持一致。
按照工业标准生成所有通信,以确保基于.netFramework的代码可与任何其他代码集成。
2.5DirectSound组件
DirectSound是DirectXAPI的音频组件之一,它可以提供快速的混音、硬件加速功能,并且可以直接访问相关设备,当然,最主要的是它提供的功能与现有的设备驱动程序保持兼容性[13]。
DirectSound允许进行波型声音的捕获、重放,也可以通过控制硬件和相应的驱动来获得更多的服务。
DirectSound的优势当然和DirectX的其它组件一样——速度,它允许你最大效率的使用硬件,并拥有良好的兼容性。
使用DirectSound可以做到什么呢?
1、很方便的了解硬件能力,并且根据当前计算机硬件配置硬件来决定最好的解决问题的方法。
2、弥补驱动程序的不足——通过属性设置以便硬件能力可以完全发挥,即便是驱动程序没有很好的支持该功能。
3、短传输延迟时间的混音为了快速的响应流。
4、3-D声音
5、声音的捕获
DirectSound播放音频文件开发的基本流程:
第一步,创建一个设备对象,设置设备对象的协作度。
第二步,创建一个辅助Buffer,也叫后备缓冲区。
第三步,获取PCM类型的数据。
第四步,将数据读取到缓冲区。
第五步,播放缓冲区中的数据。
2.6配置文件
在应用系统开发时,管理配置是必不可少的。
例如数据库服务器的配置、安装和更新配置等等[14]。
传统的配置文件ini已有被xml文件逐步代替的趋势,但对于简单的配置,ini文件还是有用武之地的。
ini文件其实就是一个文本文件,它有固定的格式,节Section的名字用[]括起来,然后换行说明key的值:
[section]
key=value
2.7XML语言
扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用[15]。
XML与Access,Oracle和SQLServer等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:
数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。
事实上XML与其他数据表现形式最大的不同是:
他极其简单。
这是一个看上去有点琐细的优点,但正是这点使XML与众不同。
XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows、MacOS,Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。
XML(可扩展标记语言)是从称为SGML(标准通用标记语言)的更加古老的语言派生出来的。
SGML的主要目的是定义使用标签来表示数据的标记语言的语法。
标签由包围在一个小于号(<
)和一个大于号(>
)之间的文本组成,例如<
tag>
。
起始标签(starttag)表示一个特定区域的开始,例如<
start>
;
结束标签(endtag)定义了一个区域的结束,除了在小于号之后紧跟着一个斜线(/)外,和起始标签基本一样,例如<
/end>
SGML还定义了标签的特性(attribute),它们是定义在小于号和大于号之间的值,例如<
imgsrc="
picture.jpg"
>
中的src特性。
如果你觉得它看起来很熟悉的话,应该知道,基于SGML的语言的最著名实现就是原始的HTML。
在XML中,采用了如下的语法:
1.任何的起始标签都必须有一个结束标签。
2.可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。
这种语法是在大于符号之前紧跟一个斜线(/),例如<
tag/>
XML解析器会将其翻译成<
<
/tag>
3.标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如<
b>
thisisa<
i>
sample<
/i>
string<
/b>
这好比是将起始和结束标签看作是数学中的左右括号:
在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
4.所有的特性都必须有值。
5.所有的特性都必须在值的周围加上双引号。
如今,XML已经是世界上发展最快的技术之一。
它的主要目的是使用文本以结构化的方式来表示数据。
在某些方面,XML文件也类似于数据库,提供数据的结构化视图[16]。
2.8多线程
每个正在系统上运行的程序都是一个进程。
每个进程包含一到多个线程。
进程也可能是整个程序或者是部分程序的动态执行。
线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行[17]。
也可以把它理解为代码运行的上下文。
所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。
通常由操作系统负责多个线程的调度和执行。
多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。
线程是在同一时间需要完成多项任务的时候被实现的。
多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立[18]。
线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。
多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”[19]。
如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。
多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此将带来的线程调度,同步等问题[20]。
使用线程的好处有以下几点:
使用线程可以把占据长时间的程序中的任务放到后台去处理。
用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
程序的运行速度可能加快。
在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。
在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
3系统设计
3.1系统设计思想
游戏是