毕业设计(论文)基于java的俄罗斯方块游戏设计_第1页
毕业设计(论文)基于java的俄罗斯方块游戏设计_第2页
毕业设计(论文)基于java的俄罗斯方块游戏设计_第3页
毕业设计(论文)基于java的俄罗斯方块游戏设计_第4页
毕业设计(论文)基于java的俄罗斯方块游戏设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、中北大学2009届毕业设计说明书目录1 引言11.1 问题的提出与研究意义11.2 手机游戏的国内外现状12 游戏的开发环境和相关技术32.1 关于eclipse及eclipseme32.2 关于wirless tool kit32.3 java语言的特点32.4 java me语言42.4.1 什么是java me42.4.2 java me的特点52.4.3 java me的分类及组成53 系统分析83.1 目标任务83.2 本程序中要解决的有关技术问题83.3 midp应用程序93.4 canvas类103.5 graphics类103.6 各功能模块的作用103.6.1 游戏流程控制模

2、块103.6.2 游戏场景绘制模块103.6.3 游戏对象103.6.4 游戏场景状态104 系统设计114.1 系统主要模块流程图114.1.1游戏模块流程图114.1.2得分记录模块流程图114.2 游戏运行效果图125 游戏具体实现135.1 游戏入口类实现135.2 游戏主控和背景类实现145.3 游戏的方块类实现175.4 方块工厂类的实现196 游戏测试216.1软件测试的意义216.2软件测试的重要性216.3软件测试的范围226.4软件测试的方法226.5软件测试的目的和原则226.6俄罗斯方块游戏的测试23结束语25参考文献27致谢28第 ii 页 共 ii 页1 引言1.1

3、 问题的提出与研究意义java me是基于java技术的,java me扩展及深化了java语言的优势和劣势,java语言的跨平台优势,以及java的运行速度劣势,毫无疑问在手机上体现的淋漓尽致。由于手机不同于pc机,所以如果用c开发的程序,要想移植,跨平台是不容易的,尤其在操作系统众多的嵌入式领域。但是很幸运,java给了我们一个跨平台的机会,利用java,我们可以很好的实现跨平台,可以方便简洁地把一个游戏从一个手机移植到另一个游戏,避免重复的编码1。对于手机游戏的跨平台性,也并不是想象中的那么乐观,现在越来越多的手机厂商针对自己的机型制定了一套开发包,这也给移植带来了一些问题。在速度方面,

4、手机又把java语言的劣势暴露无疑,在启动java语言开发的程序时间明显要慢,这主要是因为java对于手机的低配置确实是一个负荷。但是我们也看到了sun公司的努力,java语言的架构师们正在试图改变java语言的僵局,而且我们也看到了效果,在新推出的jdk中,我们发现,它的运行速度已经有所改进了。同时,随着手机处理速度和内存速度的提高,我们有足够的理由相信,速度将不再是java me在手机游戏运用上的瓶颈。由于手机是一种嵌入式产品,所以图形化设计可能比较凌乱,而且各个手机游戏的屏幕大小又不一样,而且,游戏对于图形界面是相当苛刻的,一个良好的图形界面往往是一个好的游戏的评定标准之一。所以,这确实

5、给手机游戏的开发带来了不少的工作量。因此,我们希望通过该课题的研究,能够改进手机游戏的界面设计。同时,我们也希望对手机游戏的联网作一些研究,因为未来社会是一个互联网的时代,我有足够的理由相信,手机游戏也不例外2。1.2 手机游戏的国内外现状游戏作为日常休闲的娱乐活动,历经了电视游戏、电脑单机游戏、电脑网络游戏这几个阶段。现在,游戏作为一个产业,可以看出游戏市场有着非常庞大的需求。而手机游戏的出现,也给游戏市场带来了新的活力,由于娱乐时不受时间和地点的限制,手机游戏在中国的火爆的时刻已经来临。从全球范围来讲,游戏已经走上了高科技的数字路线,电子游戏产品已经深入普通大众,而在这庞大的游戏市场中,手

6、机游戏将凭借着其硬件基础“手机”可移动,方便携带的特性,在与传统电脑游戏与电视游戏竞争中占有一席之地,而在与掌机游戏的竞争中,其又具有可通信,应用范围广的优势又显现了出来。因此随着手机产品的不断更新,以及技术的不断发展,手机游戏的市场将更为光明。中国手机游戏市场在未来几年内在市场收入上有大幅提高,考虑到国内手机互联网环境的影响,预计到2008年时,java me与brew游戏将成为手机游戏市场中收入最多的一个模块,现在收入最多的是手机单机游戏,以及日益火爆的手机网络游戏3。知识库已被广泛应用于金融系统,大型企业系统等领域,而游戏知识库目前正处于发展初期。利用游戏知识库,我们可以很好的实现对游戏

7、规则的处理。一旦开发出一款游戏,对于开发其他同类游戏,我们只需对游戏规则作一些变换就可以完成对整个游戏的开发。利用游戏知识库,我们可以快速地开发多款游戏,大大地缩短了游戏开发周期,游戏知识库的应用在将来很有前景4。在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端:(1)传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。 (2)传统手机访问互联网是通过wap(wireless application protocal),所有网络资

8、源必须接通网络才能在线访问,非常耗时、费用亦很高。 而java技术在无线应用方面的优势非常明显,一方面应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大;另一方面java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(gui)第 29 页 共 28 页2 游戏的开发环境和相关技术2.1 关于eclipse及eclipsemeeclipse是一个开发源代码的、基于java的可扩展开发平台。eclipse相关的许可证是大多数基于common public license (cpl),cpl是一个为open source initiative (osi)所认可的许可

9、证。由于eclipse foundation的建立,eclipse的许可证将逐渐趋向于使用eclipse public license (epl),epl是一个与cpl相类似的许可证,正在进行osi的认证工作。 作为当今最流行的java开发ide之一,java社群使用eclipse以及基于eclipse技术而来的ibm websphere的开发者已经超过了半数。eclipse本身只是一个框架和一组响应的服务,并不能够开发什么程序。在eclipse中几乎每样东西都是插件,实际上正是运行在eclipse平台上的种种插件提供我们开发程序的各种功能。同时各个领域的开发人员通过开发插件,可以构建与ecl

10、ipse环境无缝集成的工具。eclipse的发行版本都已经带有最基本的插件,方便了开发人员。因此,除了搭建移动开发环境之外,也可以下载jsp插件、tomcat插件、jboss插件来进行整合,以用于jsp、java ee的开发。 eclipseme作为eclipse一个插件,致力于帮助开发者开发java me应用程序。eclipseme并不为开发者提供无线设备模拟器,而将各手机厂商的实用模拟器紧密连接到eclipse开发环境中,为开发者提供一种无缝统一的集成开发环境5。2.2 关于wirless tool kit wtk(wireless tool kit)是sun公司针对java me推出的用

11、于手机和palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用 厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他ide需集成采用的必备元素6。2.3 java语言的特点(1) 平台无关性 java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的java接口。java的数据类型与机器无关。 (2) 安全性 java的编程类似c+,但舍弃了c+的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器

12、,防止程序的非法访问。 (3) 面向对象 java吸收了c+面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。 (4) 分布式 java建立在tcp/ip网络平台上,提供了用http和ftp协议传送和接收信息的库函数,使用其相关技术可以十分方便的构建分布式应用系统。 (5) 健壮性 java致力与检查程序在编译和运行时的错误,并自动回收内存,减少了内存出错的可能性。java取消了c语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间7。2.4 java me语言

13、2.4.1 什么是java mejava me是sun公司针对嵌入式、消费类电子产品推出的开发平台,与java se和java ee共同组成java技术的三个重要的分支。java me实际上是一系列规范的集合,由jcp组织制定相关的java specification request(jsr)并发布,各个厂商会按照规范在自己的产品上进行实现,但是必须要通过tck测试,这样确保兼容性。比如midp2.0规范就是在jsr118中制定的。我们在开发中用到了很多例如cldc(connected limited devices configuration)和midp(mobile information

14、 devices profile)等内容。这些就是在相关规范中制定的。java me 使用配置和简表定制 java 运行时环境 (jre)。作为一个完整的 jre,java me 由配置和简表组成,配置决定了使用的 jvm,而简表通过添加特定于域的类来定义应用程序。配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定 jvm。简表定义应用程序;特别地,它向 java me 配置中添加特定于域的类,定义设备的某种功能起很大作用。2.4.2 java me的特点(1) java me遵循为大多数手持设备生产商所支持的工业标准,如今大多数的移动电话都支持java开发。(2) java

15、 me是一个自由的和开放的平台。这使得开发人员投资很少,但却提供给他们必需的灵活性以及大量的支持。(3) 它的高度可移植的特性(书写一次到处运行)保证一部为一个品牌/类型的手持设备开发的游戏应用程序,将可以工作在其它类型的支持java的手持设备品牌/类型上。(4) 它特别为小型设备进行了优化,是轻量级的,高度安全的,因为在其上开发的应用程序不能存取或者影响运行在该手持设备上的其它应用程序。java me包含移动信息设备轮廓(midp)api,它的设计是为专门开发包括手机在内的移动设备应用程序。而且,最新的midp 2.0版自己提供了一套完整的api以用于游戏开发,这使得游戏开发更为简单和快捷8

16、。2.4.3 java me的分类及组成java me把设备分为两类,一种是联接设备(connected device),一种是有限联接设备(connected, limited device)。前一种对应于那些有电源的,电力充裕,较大的设备。例如:电视机,冰箱等,后一种对应于主要使用电池,小型的设备,例如:手机,pda等。sun把java me分为两个部分:configuration 和 profile。configuration包括虚拟机(virtual machine),核心的类库与api。configuration层定义一个java虚拟机的特性与java类库的最小子集。也就是说,con

17、figuration层提供了开发人员一个最基础,最核心的java平台。就像前文提到的,java me把设备分为两类,一种是联接设备(connected device),一种是有限联接设备(connected, limited device)。对应这两种设备就有了两种java me configuration。分别为cdc(connected device con-figuration )和cldc(connected, limited device configuration)。这里请注意,cdc使用经典的java vm,而cldc使用的是kvm(the k virtual machine)

18、9。注:kvm是sun为使用16/32位risc/cisc微处理器或控制器,并其可用内存为160kb512kb 的的设备而开发的。profile层也包含一组api,主要针对于特定的某一族系的设备而定义。profile层在特定的configuration层上实现,程序员则负责在特定的profile上编写应用程序。对于手机,pda等connected, limited device,它们的profile层称为midp(mobile info rmation device profile),于是midp与cldc合在一起就构成了一个完整的java me架构。java me平台被认为是最杰出的手机游戏

19、平台,它为开发者、设备制造商、网络通信公司和消费者广泛接受。它有一些非常重要的特征对所有组织都有益 java me 使用配置和简表定制 java 运行时环境 (jre)。作为一个完整的 jre,java me 由配置和简表组成,配置决定了使用的 jvm,而简表通过添加特定于域的类来定义应用程序。配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定 jvm。简表定义应用程序,特别地,它向 java me 配置中添加特定于域的类,定义设备的某种作用。虽然 java se 虚拟机通常被称为一种jvm,但是 java me 虚拟机、kvm 和 cvm 都是 jvm 的子集。kvm 和

20、cvm 均可被看作是一种 java 虚拟机 - 它们是java se jvm 的压缩版,并特定于java me。移动通信的时代即将来临,通信相关待业变得前景可期,而除了移动通信的主要通信工具手机,其功能越来越强大之外,有更多的厂商相继投入移动通信设备的生产与开发,其平台和操作系统的复杂度比目前混乱的pda有过之而不及,除了symbian 针对手机推出操作系统 symbian os(过去称作epoc)操作系统之外,微软也针对手机推出操作系统 smartphone 2002 (stinger),但是日前市面上的手机仍以使用厂商自行开发的操作系统者居多10。 平台的复杂纷乱对一般用户当然没什么影响,

21、但是对于程序开发人员来说,这么多不同的程序发展平台,光看完头就昏了。如果每个平台都有自己的程序写法以及程序库,那么光是看上面这些平台至少就要学习五种以上程序的写法。当然,只专精一种平台当然是很好的事情。可是程序员不禁要说:“如果我们写出来的软件可以在不经过修改源代码的情况下就能够在这些平台上执行,那不是更完美吗?“对程序开发人员来说,这样的投资报酬率当然是最大的。要在那么多平台上开发程序,对程序员来说的确是很大的挑战,如果要把所有的时间和精力放在软件的可用性上,那么相对而言很多时候我们根本没有那么多时间撰写各种平台的程序。要解决这个问题,一般来说程序员会选用一个可以跨平台的framework来

22、达成至少source code level的跨平台。利用java的“write once, run anywhere”特性,我们可以真正达到程序只要写一次,拿到任何平台上都可以执行。利用java撰写手机上的程序当然有其缺点,最广为人知的可能就是执行效率的问题,java在执行速度这个议题上一直让人诟病。不过笔者认为,随着技术的发达,将会有更快更省电的嵌入系统专用cpu出现,java one中也传出将针对java me开发专用芯片,让java在 手机上的程序可以跑得更快,因此效率上的总是其实是可以忽略的。更何况,当sun在设计java me的时候,也用了很多方式企图加快java 在手机上的执行速度

23、。因此,目前的移动通信设备大厂几乎采用java me平台11。3 系统分析3.1 目标任务本设计是一款java小游戏,由于其运行在手机上,没有pc机上多画面显示和多任务操作,所以要求该游戏易于在用户界面和游戏界面之间切换,它们之间的信息传递通过接口来实现。用户界面是为了让用户较快了解该游戏的模式,所以在用户界面得设计版本信息显示、游戏操作方式说明、游戏运行方式设定等功能,而游戏界面必须实现具体的游戏实现功能,并设计事件监听器监听游戏运行的状态。3.2 本程序中要解决的有关技术问题(1) 手机游戏程序是一个小型的实时系统,每秒钟要运行上千行程序,绘图事件和键盘事件都以很高的频率在后台等待响应。,

24、若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况。由于手机内存小,存贮量低,所以要求代码具有很高的重用性,所以设计的时候就要把各种类尽量分开来写,可以通过继承或接口方法来实现类对象的重新加载。(2) 游戏都有一定的模式,手机游戏也不例外,所以为了增加可玩性,我们设置了相关难度的调节算法。(3) 游戏程序的基本结构应该包括:游戏主流程控制,游戏场景,游戏对象和用户操控。在俄罗斯方块游戏中,游戏场景比较简单,只需要手机屏幕显示的固定矩形区域,游戏对象也比较简单,只是七种方块。用户可以操作游戏对象方块进行旋转,左

25、右,下操作,如果用户不进行任何输入,方块将以一定的速度下落到地面。至于流程控制,初始时游戏场景为空,随着游戏的进行,不断有新的方块落下,分数也增加,当分数增加到一定程度,则方块下落的速度加快12。(4) java是基于虚拟机的半解释型编译系统,其执行效率较c+等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(obfuscator)进行程序打包后的优化。(5) 游戏的开始、结束、动态信息显示画面作为构成一个程序都是必不可少的重要部分。良好易操作的用户界面是吸引用户的硬指标13。3.3 mid

26、p应用程序midlet是midp应用程序运行的基本单位,一个midlet至少直接继承自或者间接继承自一个文件名为javax.microedition.midlet.midlet的java类。midp应用程序是指遵循由应用程序主体(jar文件)和应用程序描述文件(jad文件)组成。jar的文件是midlet套件的具体表现形式,它包含了midlet类,资源文件和清单文件,其中资源文件有可能是文本,图片或多媒体等midlet类用到的文件;清单文件包含在安装midlet套件时所包含的一系列属性和相关定义的列表。jar文件实际上是一个具有压缩和打包性质的独立文件。jad文件用来描述midlet套件的基本

27、信息和运行信息,它并不是套件的一部分。主要功能是向应运程序管理器提供对应的jar文件的信息,该信息提示了此套件是否满足目标硬件的运行要求14。在midp规范中定义了midlet的生命周期,以及可以存在的三种状态,包括paused、active以及destroyed,每一个midlet在任何时刻只可能处于其中的一个状态。这三种状态的转换关系如图3.1所示:midlet有三个状态,分别是pause、active和destroyed。在启动一个midlet的时候,应用管理软件会首先创建一个midlet实例并使得他处于pause状态,当startapp()方法被调用的时候midlet进入active状

28、态。在active状态调用destroyapp(boolean unconditional)或者pauseapp()方法可以使得midlet进入destroyed或者pause状态。值得一提的是destroyapp(boolean unconditional)方法,事实上,当destroyapp()方法被调用的时候,应用程序管理器am通知midlet进入destroyed状态。在destroyed状态的midlet必须释放了所有的资源,并且保存了数据。如果unconditional为false的时 销毁态(destroyed)暂停态(paused)激活态(active)startapp() d

29、estroyapp()jam初试化midletdestroyapp() 调用pauseapp()方法图3.1 midlet状态迁移触发的方法调用候,midlet可以在接到通知后抛出midletstatechangeexception而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态15。3.4 canvas类为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类,尤其在游戏程序中,几乎完全依赖的就是canvas抽象类进行绘图。从程序开发的观点看,canvas类可与高级screen类交互,程序可在需要时在canvas中掺入高级类的组件。canvas提供

30、了键盘事件、指点杆事件(如果设备支持),并定义了允许将键盘按键映射为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏键布局。3.5 graphics类graphics类提供了简单的2d绘图功能。它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。程序只能在paint()函数中使用graphics绘制,gamecanvas可调用getgraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输到前台。其对象会被传给canvas的paint()函

31、数,以便最终显示。3.6 各功能模块的作用本游戏共涉及四个模块,分别为:游戏流程控制和监听模块,游戏场景绘制模块,游戏对象,下面分别进行介绍:3.6.1 游戏流程控制和监听模块负责整个游戏的基本流程控制,接收用户输入,并做出响应,通知场景绘制模块完成游戏场景以及游戏状态的更新。3.6.2 游戏场景绘制模块专门完成游戏场景的绘制,主要是方块的分布,另外也绘制一些和游戏相关的信息,如当前的级别和得分等。3.6.3 游戏对象只要是各种方块的数据表示和在场景中所处的位置信息,以及提供外部操纵的接口,如下,左右,旋转等。3.6.4 游戏场景状态负责存储当前游戏场景中方块的分布状况,以及存储一些同游戏相关

32、的信息,如当前级别和得分。4 系统设计4.1系统主要模块流程图4.1.1游戏模块流程图开始随机生成新的方块监听用户操作并驱动当前方块下落是否可以继续下落是否可以生成新方块是否是游戏结束否分数是否大于排行榜中分数记录得分是结束图4.1 游戏模块流程图4.1.2得分记录模块流程图将当前得分插入到排行榜末尾返回导航界面结束是否否是否是开始游戏结束排行榜中是否有记录小于得分用得分与排行榜中每条记录比较排行榜是否已满替换掉排行榜中比当前得分小的最高得分将当前得分插入到排行榜中比当前得分小的最高得分之前排行榜是否已满图4.2 得分记录模块流程图4.2游戏运行效果图图4.3 游戏运行效果图5 游戏具体实现5

33、.1游戏入口类实现:maincontrol继承自midlet父类。是游戏的入口类,控制所有类的运行和销毁。maincontrol类的构造方法:public maincontrol() this.display = display.getdisplay(this);init(); /初始化入口类menu = new mainmenu(this);/新建主菜单类display.setcurrent(menu);/设置主菜单类为当前的视类,即显示主菜单各个界面切换的方法:public void mangeaction(int event, int source) switch (event) cas

34、e play: / 启动游戏gameplay(source);break;case record: / 启动记录recordrecord(source);break;case option: / 启动设置option(source);break;case help:/ 启动帮助help(source);break;case about:/ 关于游戏about(source);break;case exit:/ 退出游戏exit(source);break;case menu:/ 返回主菜单showmenu(source);break;5.2游戏主控和背景类实现:游戏运行中的背景和方块的容器类负

35、责游戏界面的绘制以及方块的移动和游戏状态和用户操作的监控。ground类继承了canvas类并实现了commandlistener接口。驱动方块下落由于与其他操作异步,所以启用一个独立的线程负责这一功能。ground类的构造方法:public ground(maincontrol maincontrol) this.maincontrol = maincontrol;/持有游戏入口类init();/初始化游戏背景即数据,并开始游戏。ground类重载canvas类的paint方法(负责见面重绘):protected void paint(graphics g) g.drawimage(back

36、ground, 0, 0, 0);/绘制背景deletefullline(g);/扫描并删除满行drawstone(g);/绘制已经变为石头的方块if (currentshapefront.gettop() = 0)/判断当前活动方块是否在容器区域内currentshapefront.drawme(g);/绘制当前活动方块drawgamedata(g);/绘制其他游戏数据,包括等级,得分等驱动当前图形下落的内部类:class shapedriver extends thread public void run() while (true) if (!islive) /判断游戏是否正在进行中,如

37、果游戏结束则终止线程return; synchronized (this) while (!ground.this.currentshapefront.ispause()& ground.this.ismoveable(canvas.down) /判断当前活动方块是否还可以继续下落ground.this.currentshapefront.movedown();/驱动当前活动方块下落try if (flag) thread.sleep(30); elsethread.sleep(ground.this.speed);/控制速度 catch (interruptedexception e) if

38、 (ground.this.islive) while (currentshapefront.ispause() /如果游戏暂停,则暂停线程try thread.sleep(100); catch (interruptedexception e1) continue; else return;ground.this.repaint();if (!ground.this.currentshapefront.ispause() flag = false;accept(currentshapefront);/将当前活动方块变为石头score += 15;currentshapefront = nul

39、l;front = (front + 1) % length_of_queue;rear = (rear + 1) % length_of_queue;currentshaperear = f.getshape();/生成新的方块currentshapefront.setrelativex(relativex);currentshapefront.setrelativey(relativey);updatedata();/更新游戏数据5.3游戏的方块类实现:游戏中的方块是由一个一个的小方格组成的,每个方块保存为一个4*4的int形数组。当数组中对应位置的值为“1”时在这个位置绘制一个小方格,多

40、个小方格组成一个方块。方块类负责维护自己在容器中的位置,是否活动等信息,以及绘制自身等。shape类的构造方法:shape(int body, int status, int color) this.body = body;this.status = status;this.color = color;for (int y = 0; y 4; y+)for (int x = 0; x 4; x+)if (isinme(x, y, false)height = y + 1;init();/初始化方块数据shape类负责绘制自身的方法:public void drawme(graphics g)

41、if (!islive)/如果游戏结束就不再绘制return;g.setcolor(color);for (int x = 0; x 4; x+)for (int y = 0; y 4; y+) /根据数据绘制各个小方格g.setcolor(color);if (getflagbypoint(status, x, y) int x1 = (left + x) * globalutil.cell_width + relativex;int y1 = (top + y) * globalutil.cell_height + relativey;drawunit(g, x1, y1, globalu

42、til.cell_width,globalutil.cell_height);for (int x = 0; x 4; x+)for (int y = 0; y 4; y+) /覆盖各个小方格中间的线条,是各个方块看起来是一个整体g.setcolor(color);if (getflagbypoint(status, x, y) int x1 = (left + x) * globalutil.cell_width + relativex;int y1 = (top + y) * globalutil.cell_height + relativey;if (x + 1 4 & getflagb

43、ypoint(status, x + 1, y) g.fillrect(x1 + globalutil.cell_width - 1, y1 + 1, 3,globalutil.cell_height - 1);if (y + 1 4 & getflagbypoint(status, x, y + 1) g.fillrect(x1 + 1, y1 + globalutil.cell_height - 1,globalutil.cell_width - 1, 3);5.4方块工厂类的实现:程序中方块的生成由shapefactory类来实现,shapefactory使用实例工厂设计模式。shape

44、factory类中各种方块和各个状态的数据:protected static int shapes = new int /* 第一种 */ /* * */ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/* 第二种 */ /* * */ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0,

45、0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ,/* 第三种 */ /* * */ 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 ,/* 第四种 */ /* * */ 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,

46、0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, ,/* 第五种 */ /* * */ 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ,/* 第六种 */ /* * */ 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 1

47、, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ,/* 第七种 */ /* * */ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 ,;shapefactory生成方块的方法:public shape getshape() int type = random.nextint(shapes.length);sha

48、pe shape = new shape(shapestype, random.nextint(shapestype.length), colorstype);return shape; 6 软件测试测试是开发时期最后一个阶段,是保证软件质量的重要手段。软件测试就是在受控制的条件下对系统或应用程序进行操作并评价操作结果的过程,所谓控制条件应包括正常条件与非正常条件。软件测试过程中应该故意地去促使错误的发生,也就是事情在不该出现的时候出现或者在应该出现的时候没有出现。从本质上说,软件测试是探测,在探测中发现软件的毛病。6.1 软件测试的意义软件危机曾经是软件界甚至整个计算机界最热门的话题。为了解

49、决这场危机,软件从业人员、专家和学者做出了大量的努力。现在人们已经逐步认识到所谓的软件危机实际上仅是一种状况,那就是软件中有错误,正是这些错误导致了软件开发在成本、进度和质量上的失控。有错是软件的属性,而且是无法改变的,因为软件是由人来完成的,所有由人做的工作都不会是完美无缺的。问题在于我们如何去避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可能低的程度。6.2 软件测试的重要性软件测试在软件生命周期中占据重要的地位,在传统的瀑布模型中,软件测试学仅处于运行维护阶段之前,是软件产品交付用户使用之前保证软件质量的重要手段。近来,软件工程界趋向于一种新的观点,即认为软件生命周期每一阶

50、段中都应包含测试,从而检验本阶段的成果是否接近预期的目标,尽可能早的发现错误并加以修正,如果不在早期阶段进行测试,错误的延时扩散常常会导致最后成品测试的巨大困难。 事实上,对于软件来讲,不论采用什么技术和什么方法,软件中仍然会有错。采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些引入的错误需要测试来找出,软件中的错误密度也需要测试来进行估计。测试是所有工程学科的基本组成单元,是软件开发的重要部分。自有程序设计的那天起测试就一直伴随着。统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工作量的40以上。而在软件开发的总成本中,用

51、在测试上的开销要占30到50。如果把维护阶段也考虑在内,讨论整个软件生存期时,测试的成本比例也许会有所降低,但实际上维护工作相当于二次开发,乃至多次开发,其中必定还包含有许多测试工作。6.3 软件测试的范围软件测试贯穿于软件定义与开发的整个周期 ,软件的需求规格说明书 ,结构设计及程序编码,都属于软件测试的对象。6.4 软件测试的方法测试在软件开发过程中一直都是备受关注的,即使在传统的软件工程中,也有一个明确、独立的测试阶段。随着软件危机的频频出现以及人们对于软件本质的进一步认识,测试的地位得到了前所未有的提高。测试已经不仅仅局限于软件开发中的一个阶段,它已经开始贯穿于整个软件开发过程,人们已

52、经开始认识到:测试开始的时间越早,测试执行的越频繁,所带来的整个软件开发成本的下降就会越多。extreme programming更是把测试推到了极限的位置,一切软件开发活动都要从首先编写测试代码开始。6.5 软件测试的目的和原则在开发大型软件系统的过程中,需要面对错综复杂的问题,因此,在软件生存周期的每个阶段都不可避免地会产生错误。我们力求在每个阶段结束之前通过严格的技术审查,尽可能早的发现并纠正错误。测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。目前软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审。尽管面向对象技术的基本思想保证了软件应该

53、有更高的质量,但无论采用什么样的编程技术,编程人员的错误都是不可避免的,而且由于面向对象技术开发的软件代码重用率高,更需要严格测试,避免错误的繁衍。因此,软件测试在面向对象编程里更具有它的重要性。与开发过程类似,测试过程也必须分步骤进行,每个步骤在逻辑上是前一个步骤地继续。大型软件系统通常由若干个子系统组成,每个子系统又由许多模块组成。因此,大型软件系统的测试的基本层次如图5.1所示。图6.1 测试的基本层次(1) 单元测试 单元测试的用例从单元详细设计中导出。在单元测试中可以采用功能性测试和结构性测试两种。(2) 集成测试 在这个测试步骤中所发现的往往是概要设计的错误。(3) 系统测试 在这个测试步骤中所发现的往往是需求规格说明的错误。一般来说,系统测试是功能性测试,不是结构性测试。为了使本软件运行更加稳定,我对它进行了全面的测试,测试分为二部分来进行,一是:界面测试;二是功能测试。首先是界面测试,为了使软件在不同的的操作系统平台上运行界面能保持原来的风格。在windows 2000 pro sp4环境

温馨提示

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

评论

0/150

提交评论