基于java的俄罗斯方块小游戏设计(含源文件)

欢迎添加微信互相交流学习哦!

二维码

项目源码:https://gitee.com/oklongmm/biye


题 目          小游戏开发

摘    要
    俄罗斯方块是我们最常见的游戏之一,该游戏出现过在掌上游戏机、家用游戏机、手机游戏和电脑游戏中,因此俄罗斯方块也是一个十分经典的游戏。我们可以在网上下载到各式各样的俄罗斯方块游戏,也可以在各个游戏大厅中见到网络对战形式的俄罗斯方块。一般的俄罗斯方块规则比较简单,游戏中随机出现一些方块,再对这些方块进行变换,下降到游戏界面中的不同位置,如果某一行中都填充了方块,那么该行就消除。它看似简单却变化无穷,俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。
关键词:  俄罗斯方块 编程 游戏开发
 
Abstract
Tetris may be the most common one in the games. You can find the game on handheld game consoles, console, mobile phone and computer games, so the Tetris is a very classic game. We can downloade many kinds of Tetris games from the Internet , also can see netplay forms of tetris in each game hall. General rules of the Tetris game are relatively simple, random some boxes, the box was transformed, down to the game interface in a different location, if a given row are filled of the boxes, so that the line would be eliminated. It seems simple but with countless changes. The game is easy to learn but difficult to master . As a game known to people of all ages, there's no game can be compared with it in history.


Keywords:  Tetris ,Computer programming, Game development
 
目录
摘    要    2
1.绪论    7
1.1 电子游戏及其分类    7
1.2 电子游戏发展现状    8
2. 引言    11
2.1 课题研究的目的意义    11
2.2 课题研究背景    12
2.3 课题研究所用方法技术介绍    13
3.游戏设计可行性分析    19
3.1 设计目的    19
3.2 软件问题定义    20
3.3 可行性分析    21
3.4 需求分析    21
3.5 游戏需求    22
3.6 软硬件需求    22
3.7 接口控制    23
3.8 方案的选择    23
4. 总体设计    25
4.1 游戏总体设计分析    25
4.2 各模块的算法设计    25
4.3 可靠性设计    31
4.4 概要设计评审    31
5. 详细设计与实现    32
5.1 俄罗斯方块形状    32
5.2 随机生成新的方块:    33
5.3 俄罗斯方块的变换    34
5.4 游戏空间    35
5.5. 游戏演示及操作    40
5.6 颜色变换菜单    41
5.7 功能操作    42
6. 游戏测试    43
6.1 测试的意义及注意事项    43
6.2 测试的步骤    44
6.3 测试过程    46
7. 总结    49
8. 致谢    50
附录1:外文文献及翻译    52
附录2:主要代码    63
 
1.绪论
1.1 电子游戏及其分类
电子游戏,也就是运行在家用电脑、家用电子游戏机或是掌中宝游戏机及街机上的电子游戏程序。电子游戏是一种结合剧情故事、美术、音乐、动画、程序等技术于一身的互动型娱乐软件,涉及到多个行业。 
从电子游戏的分类来看,有着多种分类方式。传统的游戏分类是按照游戏类型,将其分为即时战略游戏、第一人称射击游戏、角色扮演游戏、策略型游戏等类别。根据游戏运行平台的不同,可将电子游戏分为游戏机游戏、单机版PC 游戏、互动电视游戏、在线游戏和手机游戏。此外,韩国政府将电子游戏业分为家用游戏机游戏、单机版PC 游戏、网络游戏和街机游戏四大类。考虑到中韩游戏业比较接近,论文采用韩国的分类标准。“网络游戏”也就是人们一般所指的“在线游戏”,是指通过互联网进行的电脑游戏,通过人与人之间的互动达到交流、娱乐和休闲的目的。在互联网(局域网)技术出现之前,电子游戏都可以归于单机版游戏,即“人机对战”游戏,或最多是双人对战游戏。而随着互联网技术的出现,通过连接游戏服务器,上百、上千、乃至上万的游戏玩家同时连线娱乐成为了现实,这就大大增加了游戏的互动性、真实性,丰富了电子游戏的内涵。从网络游戏的分类来看,目前业界还没有一个比较统一规范的分类。随着计算机设备和网络技术的发展,电子游戏在全球得到了迅猛的发展,取得了巨大的成功,已成为当今世界上不可缺少的精神粮食。

1.2 电子游戏发展现状
1.2.1 电子游戏在国外的发展现状
电子游戏是最初产生于美国,1971年,一个还在MIT就读的学生设计了世界上第一个业务用游戏机,这个街机游戏的名字叫《电脑空间》。可以说时至今日,电子游戏仍然是外国的天下。
美国至今仍是世界第一大游戏市场,它遵循的是以发行商为主的产业开发链模式,根据美国市场调查公司NPD Group调查统计,美国2004年游戏总销售金额(包括家用、掌上型主机及软件)为99亿美元,占了全球游戏市场的45%。其中游戏软件销售的具体数字是:视频游戏软件的销售额达52亿美元(1.6亿套),PC游戏软件销售额达11亿美元(4500万套),掌机游戏销售额达10亿美元(4230万套)。2004年一共大约有2.48亿套游戏售出。据估计,美国每个家庭平均购买过2部游戏[3]。
日本近20年来疯狂赚电子游戏的钱。从上世纪60年代初的街机,到六七十年代之间的家用游戏机,再到八九十年代的掌上游戏机,日本经过30多年的耕耘,终于把电子游戏这棵“摇钱树”,培育成第一时尚娱乐产业,垄断全球业界长达10余年。对于日本来说,电玩业已是国家经济的重要支柱之一,在GDP中占有1/5的举足轻重地位。日本游戏业在最辉煌的1998年,曾经占领全球电子游戏市场硬件90%以上,软件50%以上。
韩国号称世界上网络游戏产业最发达国家之一。迄今为止,国内网络游戏市场有超过60%的产品来自韩国游戏软件开发商,韩国网络游戏使国内很多游戏运营公司在游戏营销市场或股票资本市场上获得了巨大的成功。 韩国游戏市场的发展不是偶然,韩国政府不仅给游戏产业以正确的定位和引导,更是将其和本国经济发展紧密地联系到一起,做了很多市场培育方面的工作。韩国政府认识到,靠重型工业来支撑全国经济的做法是片面的,于是将IT、娱乐产业视为新的经济增长点,开始大力扶持。从那时起,科技含量极高而能源消耗极低的游戏制作及相关产业担负起了“富国兴邦”的重担。由文化观光部出面组建韩国游戏支援中心,向韩国游戏产业提供从资金到技术上的多方面支援;成立游戏投资联盟,政府每年向游戏产业投入的资金多达500亿韩元,并为游戏企业提供长期的低息贷款;设立信息化基金和文化产业基金,为游戏产业服务;对指定的风险企业实行各种税制优惠政策,减少甚至免除游戏企业的税务负担;建设游戏产业基地以扶持中小游戏企业的发展;对从事游戏产业的高科技人才免除两年的兵役。 在韩国,从制作到运营,一个网络游戏公司起步门槛较低,主要得益于政府实行的援助计划。此外,在有利的政策形势下,韩国出现了众多的游戏院校,一些原本不涉足此领域的大学也开设了游戏相关专业课程,以大力培养游戏专业人才,从而为游戏生产提供了基础保障。【1】
1.2.2 电子游戏在国内的发展现状
与电子游戏发达的国家相比,我国在电子游戏方面还存在比较大的差距。目前,我国游戏市场正处于发展阶段,但市场上的游戏软件主要来自日本、美国、韩国等地,但由本土游戏制作人开发创作的游戏正在高速增加,国产原创的游戏即将成为游戏的主流。
中国的游戏产业经过80年代初期台湾厂商的探索至90年代,开始了自己的研发、发行的历程,直至网络游戏的风行,让中国的网络游戏开始有了飞速的发展。 1983年,智冠科技有限公司在中国台湾成立,为全球第一家签订授权重制中文版产品代理销售合约的公司,2000年智冠在台湾股票上市, 2002年其控股的中华网龙在台湾上市。
1996年底,UBI SOFT上海分公司暨上海育碧电脑软件有限公司成立。同年,全球游戏软件领军企业EA在中国上海成立办事处。1997年,由尚洋公司制作的《血狮》正式上市。 1997年,北京新天地互动多媒体技术有限公司成立,该公司引进了《古墓丽影III》(TombRaider III)、《盟军敢死队》等著名欧美游戏,并在1999年在中国率先掀起“游戏软件价格革命”,全面推行50元的价格体系,从此正版游戏价格开始贴近大众消费者。 1999年,业内估算中国电脑游戏市场(正版)约1.5亿元人民币。 2000年,大陆华彩软件代理发行第一款中文MMORPG《万王之王》正式推出,该游戏于1999年在台湾发行,由台湾雷爵资讯(Lager)开发。也在2000年,继《万王之王》、《石器时代》、《网络三国》在台湾上市之后,游戏桔子推出了《天堂》,游戏桔子成立于1995年,1999年以《便利店》在台湾奠定了地位。《天堂》这款由韩国著名游戏公司Ncsoft研发的网络游戏不但在本国大获成功,也在台湾再次夺冠。 2001年初,北京华义在中国大陆地区正式推出了《石器时代》,华义国际股份有限公司于1993年在台北成立,2001年在台湾股票上市。《石器时代》成为大陆当时最流行的网络游戏。2001年,天人互动软件技术有限公司在北京成立。当年与SEGA结成PC游戏业务的战略合作关系,发行了《樱花大战Ⅱ》《文明Ⅲ》《无冬之夜》等经典游戏,2002年,引进在欧美网络游戏《魔剑》(Shadow Bane),这是首款在中国测试的欧美网络游戏。 2001年5月,“联众世界”经过3年多的迅速成长,以同时在线17万人、注册用户约1800万的规模,成为当时世界用户数量第一的在线游戏网站。
2005年1月21日,中央电视台报道:我国网络游戏产业当年增加了50%,今后几年都将以50%以上的速度增长;第一届中国网络游戏年会报道:中国国内网络游戏2004年规模达24.7亿元,2009年规模将达到109.6亿元。【2】
 
2. 引言
2.1 课题研究的目的意义
在工作压力及其巨大的今天,游戏成了众多上班一族和学生朋友学习放松的工具,所以设计了一个俄罗斯方块的游戏程序,游戏功能齐全,随进随出,根据自己的能力设置游戏的难度系数。这个课题的研究开发,巩固了所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、Eclipse等开发工具的运用,拓宽常用类库的应用。通过该课题的研究开发,把所学课程及相关知识加以融会贯通,理论与实际的结合,全面掌握Java语言的编程思想及面向对象程序设计的方法。将传统的俄罗斯方块游戏,通过java编程实现基本的游戏功能,同时添加分数、窗体选择等新的功能,美化游戏的界面外观,增加了游戏的好玩性。
    本论文就是为了实现这些想法而设计的。其研究意义有以下几点:
(1) 可以通过此俄罗斯方块游戏的开发,对java编程语言的开发技术有一个全新的了解,各方面应用比较到位,使理论用于了实践,掌握了java开发程序的全过程(包括系统分析,程序设计,程序开发)。
(2) 利用以前传统的俄罗斯方块游戏(单人游戏)通过java技术将其设计为基本的电脑控制游戏,使自己对游戏的开发有了一个比较全面的了解。
(3) 用户可以对游戏的难度和状态进行灵活的设置,这点可以方便游戏玩家的操作,同时也为游戏界面提供了丰富的内容。
    总之,本课题的研究实现了俄罗斯方块游戏的基本功能,使自己所学的java编程技术得到了复习和应用,对软件的开发有了进一步的了解。 
该课题的研究开发目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力。利用以前传统的俄罗斯方块游戏(单人游戏)通过java技术将其设计为基本的电脑控制游戏,使自己对游戏的开发有了一个比较全面的了解。 培养独立思考能力,检验学习效果和动手能力,提高工程实践能力,为将来实际工作打下坚实的基础。【3】
2.2 课题研究背景
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值在游戏史上是非常巨大的。这款游戏最初是由苏联的游戏制作人 Alex Pajitnov 制作的。 最终经过各种改良,俄罗斯方块的第一个PC版本诞生了,他们给这个游戏取了一个源于希腊文字的名字“四”(tetra)——Tetris,即现在的“俄罗斯方块”。 这种将不断掉落的各种形状的方块摆满一行将之消除的游戏,不仅风靡了当时的俄罗斯, 甚至到现在依然以其不退的热度席卷着全球。
众多的游戏开发者也纷纷效仿制作出了各种新版本, 因此也使“俄罗斯方块”这款老少皆宜的游戏变得越来越趣味横生。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在一些联众网络游戏中,更有一些独有的魅力 ―― 有单机作战、双人单机对战和双人网络对战三种游戏模式,三种模式都是在一行堆满后就可以消掉,最后方块堆积至窗口顶端,即告负,用户可任选一种模式进行游戏。其中单人模式是一种玩积分的游戏,如果积分高的话,还可以存入高分榜上。而双人单机对战模式则是两个人在同一台机器上进行对战游戏,双人网络对战模式则需要两人首先进行网络连接,然后才能进行对战游戏,后两种模式在游戏过程中如果自己一次消去两行以上的话,就可以送给对方使对方的行数增长,让你尽情体会对战的趣味。另外,网络对战模式还具备网络聊天功能,让你在游戏过程中还能体验到聊天的乐趣,同时也给用户提供了一个展现自己高超技艺的场所。
现在我国的网络迅速普及,以往的只限于单机版的游戏已远远不能满足广大的游戏玩家,这便促使我们向着一个更高层次的水平去迈进,所以要求我们设计游戏时,要出于吸引玩家的目的,应该提高游戏的好玩度。但可玩度是好玩度的基础。好玩度在上升到一个阶段后将由于可玩度的限制而不能再继续上升。以俄罗斯方块为例,通过对每个方块添加意义,增加关数并为每关赋上不同的意义(也就是情节),增加画面效果(如三维立体效果且在水下玩的)和音效(如方块落地时发出机械的焊接声音)。即使这样,其好玩度也不能超过RPG类游戏。所以,要提高可玩度,就要在游戏的组成上下工夫;要提高好玩度,就要在游戏的外衣上下工夫。
    国内有人专门将俄罗斯方块游戏做为经典教材来学习IT。改造后的版本,有的仿制程序中方块的形状和颜色等又新添加了许多美化功能,甚至连方格也可以放大缩小。【4】

2.3 课题研究所用方法技术介绍
2.3.1  Java语言基础
Java语言特点
1.简单性  Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。
2.面向对象  Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。
3.健壮性   Java在编译和运行程序时都要对可能出现的问题进行检查。类型检查可以帮助检查出许多开发早期出现的错误。Java提供自动垃圾收集机制来进行内存管理,减少了内存出错的可能性
4.分布性   Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。
5.体系结构中立   Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。
6.安全性   用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
7.可移植性   同体系结构无关的特性使得Java应用程序可以在配备了Java解释器和运行环境的任何市场计算机系统上运行,这成为Java应用软件便于移植的良好基础。通过定义独立于平台的基本数据类型及运算,Java数据得于在任何硬件平台上保持一致。另外,Java的编译器由Java语言实现,解释器由标准C实现,因此Java本身也具有可移植性。
8.解释性   Java编译器将Java源文件生成类文件,扩展名为.class,类文件可通过Java命令加载,解释和执行,将Java字节码转换为机器可执行代码。Java解释器能直接运行目标代码指令。
9.高性能性   如果解释器速度大慢,Java可以在运行时直接将目标代码翻译成机器指令。Sun用直接解释器一秒钟可以调用300000个过程,翻译目标代码的速度与C/C++的性能没什么区别。
10.多线程性   Java语言内置支持多线程的功能,使得在一个程序里可同时执行多个小任务。多线程带来的更大好处是更好的交互性能和实时控制性能。
11.动态性   Java的动态性是其面向对象设计方法的发展。它允许动态地装入运行时所需要的类,这是C++语言所无法实现的。【5】

Java的优点
(1) 安全性 
Java是一种安全的网络编程语言,不支持指针类型,一切对内存的访问都必须通过对象的实例来实现。这样能够防止他人使用欺骗手段访问对象的私有成员,也能够避免在指针操作中易产生的错误。
此外,Java的安全性体现在多个层次上:在编译层,有语法检查;在解释层,有字节码校验器,可进行代码段格式测试和规则检查、访问权限和类型转换合法性检查、操作数堆栈的上溢和下溢检测、代码参数类型合法性检查等;在平台层上,通过配置策略,可设定访问资源域,无须区分本地或远程。
(2)  可移植性 
Java具备有很好的移植性,这主要得益于它与平台无关的特性。同时,Java的类库中也实现了与平台无关的接口,这使得这些类库也能移植。同时,Java编译器主要是由Java本身来实现的,Java的运行系统(解释器)由标准C语言实现,因而整个Java系统都具有可移植性。 
(3)  多线程机制 
Java具有多线程机制,这使得应用程序能够并行地执行。它的同步机制也保证了对共享数据的共享操作,而且线程具有优先级的机制,有助于分别使用不同线程完成特定行为,也提高了交互的实时响应能力。Java的多线程技术使网上实时交互实现很容易,从而为解决网上大数量的客户访问提供了技术基础。
(4)  跨平台
通常,在Windows下编写的程序是不能直接拿到UNIX上运行的,因为程序的执行最终必须转换成为计算机硬件的机器指令来执行,专门为某种计算机硬件和操作系统编写的程序是不能够直接放到其他类型的计算机硬件上执行的,至少要做移植工作。要想让程序能够在不同的计算机上运行,就要求程序设计语言能够跨越各种软件和硬件平台,而Java恰恰满足了这一需求。Java编译器能够产生一种与计算机体系结构无关的字节指令,只要安装了Java虚拟机,Java就可以在相应的处理机上执行。【6】

Java语言基础
Java数据类型分为基本数据类型、空类型和复合数据类型。基本数据类型包括:char、byte、short、int、long、float、double、boolean;
基本运算符:算术运算符、关系运算符、逻辑运算符、条件运算符、位运算符、赋值运算符和复合赋值运算符。
在程序中使用各种数据时,其表现形式有两种:常量和变量。
结构化程序设计有三种基本数据结构:顺序结构、选择或条件结构、循环或重复结构。                                        
If语句是选择结构最基本的语句。If语句有选择地执行语句,只有当表达式条件为真时执行程序。
for语句是使用最灵活,最广泛的循环语句。for语句的一船语法格式为:
for([表达式1];[表达式2];[表达式3])
{
   循环体部分
   }
数组是具有相同数据类型的一系列数据元素的集合,按顺序组成线性表。在使用数组前必须先进行声明。
数组按照维数可以分为一维数组和多维数组。二维数组的定义格式为:
数组类型 数组名[][]
对于二维数组中的元素,其引用格式为:
数组名[下标2][下标1]
对象和消息传递分别表现事物以及事物之间的相互关系。类和继承是按照人们一般思维方式的描述准则。
面向对象编程有三个特性:封装性、继承和多态。
类是创建对象的模板,所有对象都是类的实例。类包括成员变量和方法。成员变量保持对象的属性,而方法提供对象的行为。类的继承性使代码复用性增强。类的构造方法是与类名相同的方法。this和super变量分别代表当前对象和直接基类对象。接口是一个完整的抽象类,接口声明的所有方法必须由其子类实现。
通过图形用户界面(GUI:Graphics User Interface),用户和程序之间可以方便地进行交互。Frame类是否Containet类的间接子类。当需要一个窗口时,可使用Frame或其子类创建一个对象。java.awt包中的MenuBar类是负责创建菜单条的。java.awt包中的Menu类是负责创建菜单的。java.awt包中的MenuItem类是负责创建菜单项的。 要在菜单项之间增加分隔线,只需使用Menu类中的addSeparator() 方法。
对话框是一种特殊的窗口,用于显示一些提示信息,并获得程序继续运行下去所需要的数据。对话框不能作为应用程序的主窗口,它没有最大化、最小化按钮,不能设置菜单条。【7】

2.3.2  Java开发工具
Java开发工具有很多种,我开发这个程序用的是MyEclipse,MyEclipse企业级工作平台(MyEclipseEnterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,JSP,CSS,Javascript,Spring,SQL,Hibernate[1]。
MyEclipse 是一个十分优秀的用于开发Java, J2EE的 Eclipse 插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。MyEclipse目前支持Java Servlet,AJAX, JSP, JSF, Struts,Spring, Hibernate,EJB3,JDBC数据库链接工具等多项功能。可以说MyEclipse是几乎囊括了目前所有主流开源产品的专属eclipse开发工具。[1]
根据官方最新消息,MyEclipse 2013已经正式发布!MyEclipse 2013[2]支持HTML5、JQuery和主流的Javascript 库。随着MyEclipse 2013支持Html5,你可以添加音频、视频和API元素到你的项目,从而为移动设备创建复杂的Web应用程序。你甚至还可以通过HTML5 可视化设计器设计令人难以置信的用户界面。同时,随着MyEclipse 2013支持JQuery,你可以通过插件提升性能,并添加动画效果到设计中。

JDK
1) Java编译器
Java编译器将Java源代码文件编译成可执行的Java字节码。Java源代码文件的扩展名为 .java,Java编译器把这种扩展名的文件编译成扩展名为.class的文件。源文件中的每个类在编译后都将产生一个class文件,这意味一个Java源代码文件可能编译生成多个class文件。
2) Java解释器
Java解释器对编译生成的字节码格式的可执行程序的运行提供支持,它是运行非图形Java程序的命令行工具。
 
3.游戏设计可行性分析
3.1 设计目的
通过本游戏的设计,综合自己在校期间所学的理论知识,设计开发俄罗斯方块游戏,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,初步掌握这种设计模式,进一步巩固和加强自身对java基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。
1)了解Java的基本使用方法。
2)熟悉eclipse的运行环境。
3)用JAVA面向对象的方法来设计一个俄罗斯方块的小游戏。
4)基本实现俄罗斯方块的应用功能。


3.2 软件问题定义
基本要求:本游戏开发的总体任务是实现游戏的可操作性,以及界面的美观性。整个开发过程遵循软件工程规范,采用JAVA GUI编程来实现界面以及事件的控制,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,通过菜单栏中的相应菜单选项实现游戏的开始、结束、变换方块、积分以及等级的功能。
目标:通过本游戏的开发,主要实现游戏的可操作性以及美观性,同时使自己对JAVA语言的了解更进一层,为将来的实际工作打下坚实的基础。
条件、假定和限制:由于知识以及能力的限制,本游戏所实现的功能不够强大,可对本游戏进行改善,从而增强游戏的功能。
可行性研究的方法:通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个初级游戏软件。
评价尺度:由于本软件是一个初级产品,对其要求不是太苛刻,所以能够达到俄罗斯游戏的一般功能即可。

3.3 可行性分析
 技术可行性:开发本游戏的编程语言有多种,考虑到自身对语言的掌握程度,选择JAVA语言进行游戏的开发,采用JAVA GUI编程来实现界面以及事件的控制。
经济可行性:本游戏的开发旨在完成毕业设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高,对自身的经济要求也不高,只要有一台能运行相应JAVA程序的电脑便可,所以不用考虑到经济问题。
社会可行性:本游戏的开发主要为了完成毕业设计,开发的主体是个人,不存在法律上的侵权行为,也不会为社会造成影响,这方面是完全可行的。
3.4 需求分析
对软件需求分析就是通过调查研究,建立系统的数据模型、功能模型、行为模型,用户和开发人员在“系统必须做什么”这个问题上实现相互理解,达到共识,从而形成双方认可的软件产品的需求规格说明书。这样有益于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,便于采用工程方法开发软件,提高软件的质量,便于开发人员、维护人员、管理人员之间的交流、协作,并作为工作成果的原始依据,并且在向潜在用户传递软件功能、性能需求,使其能够判断该软件是否与自己的需求相关。
3.5 游戏需求
 28种状态的方块随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动,以便以玩家所需要的形态和位置落下。如果落下时,方块的方格能填满某一行,则这一行可消去。消去一行后,游戏可给玩家加分,若由存在空格的方块填满整个窗口,则游戏失败。游戏功能需求如下:
 游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的背景色是黑色,方块用蓝色颜色,在一定的区域内运动和变形,落下后的障碍物用黄色显示,这样看起来会有一定的美感。
 游戏形状需求:用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
 键盘处理事件需求:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。
 鼠标处理事件需求:通过点击菜单栏中相应的菜单项,可以实现游戏的开始、结束,方块形状的变换,分数、等级的显示,以及游戏帮助等功能。
 显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。【8】
3.6 软硬件需求
操作系统:Microsoft Windows XP Professional Service Pack 2
内存:512M
硬盘:80G
CPU:赛扬2.8
交互工具:键盘/鼠标
显示器:VGA显示器
JDK版本:jdk1.6.0.02
Eclipse版本:eclipse-SDK-3.4-win32

3.7 接口控制
本游戏通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对方块进行移动变形,要使用键盘的接口事件。

3.8 方案的选择
面向对象的程序设计吸取了结构化程序设计的先进思想,并把它们同几个支持用户用新方法进行程序设计的有力概念结合在一起。
所有面向对象的程序设计语言一般都包含三个概念:封装、多态性和继承性。
这种方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。
面向对象的程序设计,是通过数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法,这些模块可以被用作样板,在需要时再建立其副本。
C++和Java在面向对象这方面比VB要强,所以我排除了用VB做的可能性。但是C++为了与C语言兼容,其是包含了些面向过程的成分;Java除了C++中非面向过程的部分,其程序编写过程就是设计、实现类,定义其属性、行为的过程。还有Java特有的“沙箱”机制是其安全性的保障,同时它去除了C++中易造成的错误指针,增加了自动内存管理等措施,保证了Java程序运行的可靠性。
所以经过再三比较了三种语言后,决定采用Java语言编写俄罗斯方块。
 
4. 总体设计
4.1 游戏总体设计分析
Java为纯面向对象(Object-Oriented,OO)的程序语言,它的诸多优点在此就不作论述了。从面向对象的观念出发,本程序主要可分为以下几个模块:
客户端GUI模块
方块及地图数据模块
分析对象的技巧在于它的功能的扩展性及维护效率。试想,如果因为外部环境或者用户需求的变化需要对程序进行功能扩展或者维护,就要对代码作大幅度的更动甚至重写,这样就失去了面向对象的优势,所以在本程序分析时将独立性高的模块作为一个对象,以提高程序的可扩展性和可维护性。

4.2 各模块的算法设计
4.2.1客户端接口的设计
 “客户端控制器”是指游戏界面上显示游戏相关信息及排布游戏控件的面板。游戏客户端控制器上集合了游戏的各种事件处理,包括游戏定时控制,键盘控制,道具控制,选择网络对战等各种控制命令。本模块是程序的主模块,其它四个模块都由本模块进行控制。
1 客户端接口的结构,如图5.1所示:

 
图5.1 客户端结构图

2 客户端接口的实现
一个程序,在追求程序性能的同时,应该同时注重GUI的美观度,基于此,本游戏应该采用JAVA中swing组件包,swing组件是一组完全由JAVA语言编写的轻量级组件,没有本地代码,不依赖本机操作系统的支持,所以swing比AWI具有更强的实用性,比起AWI组件,swing组件在美观度和控制性能方面具有如下几方面的优点:
•可插入的外观感觉
在AWI组件中,犹豫控制组件外形恶对等类与具体平台相关,使得AWI组件总是只有与本机相关的单一的L&F。swing对PL&F的支持改变了单一图形界面的观感,即实现了在任意平台上运行同一个swing程序能有不同恶L&F。变成人员可以在GUI程序设计中加入相应的开关,使得程序运行时可以根据喜好选择不同的L&F,呈现不同个性化界面。
•设置边框
可以使用相应的方法为swing组件设置一个或多个边框。Swing中提供了各种各样的边框供用户选用,也能够给通过变成人员的组合来设计个性边框。充分利用边框设计,可以协助布局管理器对组件进行合理的布局。
•使用图标
此特性使得swing组件较之AWI组件具有更强的外观感受。与AWT组件不同,许多swing组件如按钮、标签,不仅可以使用文字,还可以使用图标来加强外观效果。
•支持键盘操作
在swing组件中,使用Jcomponent类的registerKeyboardAction方法,能使用户通过键盘操作来替代鼠标驱动GUI上swing组件的相应动作。
•可存取性支持
所有swing组件都实现了可存取性接口,提供对可存取性的支持,使得辅助功能如屏幕阅读器、语音识别系统,能十分方便地从swing组件中得到信息。
•MVC体系结构
Swing组件设置三个通讯对象:模型、视图和控件,并将模型与视图奋力开来,这样可以方便用户直接通过模型管理数据,实现基于一种模型的多种视图处理。
基于swing组件的优点,结合本程序的设计目标,程序的界面将使用swing组件实现。

4.2.2方块及地图数据模块的设计
这是俄罗斯方块游戏最基本的功能模块,本游戏的设计思想是只要有客户端控制器及方块地图数据模块,就能实现游戏的基本功能。本模块其实可以分开为方块和地图两个模块,但考虑到二者联系紧密,需要共享数据结构,属于公共耦合,耦合性过高,将二者分开也有悖于作者设计的游戏算法,增加了程序的编写难度,故把它们并作了一个对象。
1.方块数据
方块数据存储了七种不同形态的方块,以及每个方块的四种形态,可用一个7x4x4x4的四维数组表示,例如,定义一个四维数组block[7][4][4][4],数组block的第一维表示七种不同形态的方块,第二维代表方块的四种不同翻转状态。数组的第三维和第四维代表某一种形态的方块的某一状态。
假定,block[0][0][i][j]的值如以下:
1,1,0,0
    0,1,0,0
    0,1,0,0
    0,0,0,0
block[0][0][i][j]代表“7”字型的方块。当方块翻转时,只需改变第二维的下标即可,即,block[0][0][i][j]变为block[0][1][i][j]。而如果更改方块形态,就改变数组第一维坐标。 
2.地图数据
本游戏的游戏地图为25x15格,故应当用一个25行15列的二维数组存储游戏地图数据,但是考虑到本游戏嵌入了方块越界自动纠正功能,而方块越界,实际上就是游戏地图数组越界。假定,方块数据有以下数据模式,代表长条形的一种方块:
0,0,0,1
0,0,0,1
0,0,0,1
0,0,0,1
当以上数据模式所代表的方块处在游戏的左边界区,并且发生翻转时,方块可能翻出游戏地图外,在这种情况下,就发生了游戏地图数组越界,JAVA异常处理系统会抛出ArrayIndexOutOfBoundsException,为避免这种情况的发生,游戏地图数组应当适当增大,故本游戏将地图数组长度和宽度各扩大了三个单位,定义成为28x18模式的数组。
3.建立游戏的坐标系统
俄罗斯方块,最终是要将方块绘到游戏地图中,如何确定方块在地图上的位置,就需要一个方块数组与游戏地图数组的映射关系。建立一个合理的坐标系统,对于游戏的设计有莫大的方便。结合JAVA的坐标系统,综合游戏设计上的考虑,本程序最终确定了将游戏地图的左上角坐标表示为(0,0),同样,方块在游戏地图中表示为记录方块左上角在游戏地图中的坐标。
4.对方块数据和游戏数据的操作
确定了方块数据与地图数据的映射关系,对方块和游戏数据的操作就变得简便了。对方块的操作包括方块的左移、右移、下移等,当方块左移时,只需将方块数组左上角的坐标往左方向移动一个单位即可,同理,方块右移、下移时,只需将坐标往右、往下移动一个单位。
如果以X代表方块左上角的横坐标,以Y代表纵坐标,方块左移,执行的操作是X--,方块右移,执行的操作是X++,方块下落,执行的操作是Y++。
5.游戏绘图
俄罗斯方块具有七种不同形态的方块,而方块又分别有正在下落和已经落下固定两种不同状态,如何在游戏地图中实现静态和动态地绘制出七种不同形态的方块,具有一定的挑战性。经过反复思考论证,本游戏决定采用不同的绘制模式来分别实现绘制动态和静态方块。
•遍历方块数组绘制动态方块
假定调用Graphics类中的fill3DRect(int x,int y,int width,int height,Boolean  raised)方法绘制方块,再假定方块数组左上角在地图中的坐标为x和y,则绘制动态方块可采用如下方式实现。
for(int i=0;i<=3;i++)
  for(int j=0;j<=3;j++)
   if(Block[blocktype][turnstate][i][j]==1)
g.fill3DRect((y+j)*width,(x+i)*width,width,width,raised);
这种绘制方式的原理是每一次绘制一个单位长度的正方形格子,在将这些格子组合成某一种的形态方块。这里面,某一种形态的方块是由方块数组中的参数i和j决定的,具体是哪种形态的方块,方块的哪一种翻转状态,是由参数blocktype和turnstate决定的。而参数y+j表示的当前格子的左上角在游戏地图中的横坐标,x+i表示的是小格子的纵坐标。
•遍历游戏地图数组实现坠下方块的消行绘制
当坠下的方块有满行需要重新绘制时,需要进行消行绘制。首先,可用一个数值代表游戏地图数组的某一个区域是否有方块填充,假定这个数值是2,即如果地图数组中某一个元素的值为2,则表示这个元素所代表的地图区域存在方块。进行消行绘制时需要判断地图数组的某一行是否全为2,如果全为2,则可以认为这行被方块填满,需要进行消行,然后再继续往下判断下一行,直到所有满行被消除为止。
 
             图5.2 消行流程图
4.3 可靠性设计
游戏在设计时应当尽量注意降低各个模块之间的耦合性,增强模块的独立性,以便将来需求时进行游戏版本的提升以及相关维护。

4.4 概要设计评审
经过反复论证,上面提出的设计方案,尤其是游戏设计的各个功能模块间的算法确实可行,因此,本游戏可进入详细设计阶段。
 
5. 详细设计与实现
5.1 俄罗斯方块形状
方块总共有四种基本形,其它形状可由这四种基本形通过旋转得到,如下图:
 图5.1四种基本形

在程序中,我们是可以用下面变量来描述它们,如下:
final  int boxtypes[4][4][2]={
    { {-1,0},{0,0},{1,0},{2,0}},
    { {-1,0},{0,0},{1,0},{1,-1}},
    { {-1,0},{0,0},{1,0},{0,-1}},
    { {-1,0},{0,0},{1,0},{-1,-1}}
};/*四种基本方块的相对坐标*/
        
int  box[4][2];  /*四个正方形的坐标(相对方块中心点)*/
  int cx, cy; /*方块中心点在游戏空间中位置的坐标(相对游戏空间左上角点)*/
  int type; /*方块类属(上图中四种分别为0,1,2,3)*/

5.2 随机生成新的方块:
void makenewblock()//随机生成新的方块数据
    {
    block_type = (int)(Math.random()*100)%4;//产生一个1-4的随机数
        for(int i=0; i<4;i++) 
           block_box[i] = types[block_type][i];
        block_cx=sp_WIDTH/2; block_cy=0;
}
5.3 俄罗斯方块的变换
 
图5.2 四种图形变化方式
用户使用← → ↓箭头键来移动方块,移动方式有3种:左移一格、右移一格、下移一格, 对应的俄罗斯方块坐标变换公式如下:
左移一格:cx1=cx0-1,  cy1=cy0 右移一格:cx1=cx0+1,  cy1=cy0 
下移一格:cx1=cx0,  cy1=cy0+1
方块变换程序流程: 用变换公式计算变换后的方块中心坐标、各正方正形相对坐标,调用IsCanChangeTo(),判断是否能移到此位置,如能则更新方块坐标。如下右转90度(顺时针):
void turnright()/*右转动方块(顺时针)*/

   int  box[][] = new int[4][2];  /*四个正方形的坐标(相对方块中心点)
    cx = block_cx;  cy=block_cy;  //中心位置不变
    for (int i=0; i<4; i++) //计算变换后的各正方形坐标
    {
        box[i][0] = block_box[i][1]; //用公式x1=y0计算正方形的x 坐标
        box[i][1] = -block_box[i][0]; //用公式y1=-x0计算正方形的y 坐标
    }
    if ( IsCanChangeTo( cx, cy , box ) ) {//如果能变换到些位置,则更新方块的坐标数据
        block_cx = cx ;  block_cy = cy;  //中心位置不变
        block_box = box ;
    }
}

5.4 游戏空间
游戏空间图如下:
 图5.3 游戏空间
游戏空间可以看成由sp_WIDTH × sp_HIGHT个正方形小格子构成,每格子都有一个相对于左上角的坐标。可以用一个sp_WIDTH × sp_HIGHT的二维数组表示游戏空间。如下:
int gamespace[sp_WIDTH][sp_HIGHT];
某格子对应的数组元素的值为1,表示此格子已被方块填充,为0表示未被填充。
在游戏空间中,被方块填充了的格子为深灰色,未被填充的格子为白色(底色),灰色格子触及空间顶部时,游戏结束。即gamespace[0](二维数组第一排)中有元素的值为1时,游戏结束。

下面是判断游戏是否结束的程序:
boolean IsGameOver() /* true---结束  false-- 没有结束*/
{  boolean flag=false;
   for(int i=0; i<sp_WIDTH; i++)
   {
      if (gamespace[0][i]==1) {flag=true; break;}
   }
   return flag;
}
判断俄罗斯方块是否能进行指定的变换(移动、旋转)
俄罗斯方块中心点在游戏空间中的坐标由方块结构体变量中的cx, cy指定,各小正方形在空间中的坐标等于小正方形相对坐标加上方块中心点坐标,即:
  [cx + box[i].x , cy + box[i].y ]
能否进行下一步指定变换的判断方法是:执行指定的变换坐标计算程序(函数),返回(得到)变换后俄罗斯方块的信息体,判断变换后方块中各小正方形格(设坐标为[a, b])是否有超出边界,小正方形所在的位置是否已被填充。即:
  0<= a <= sp_WIDTH   b <= sp_HIGHT
  且 gamespace[a][b] = = 0 成立

程序段如下:
boolean IsCanChangeTo(int cx, int cy , int box[][])//判断方块能否走到这位置
{  
   boolean IsCan =true ; /*标志变量,假设为能进行指定变换*/
   int x, y;
     for (int i=0; i<4; i++)
   {  
     x = cx + box[i][0];
     y = cy + box[i][1];
     if (  x <0 || x >=sp_WIDTH || y>=sp_HIGHT|| (y>0 && gamespace[y][x]==1))
        { IsCan = false; break;} /*设置为不能进行指定变换*/
   }
   return  IsCan;
}

判断方块是否已落到底, 停止下落
判断方块是否已落到底,就是判断方块中每个小正方形格的正下方位置是否已被填充或出下界。
如已到底,把方块所在的位置(格子)填充(对应gamespace元素值设为1),还要查看是否有某行已被全填充,把被全填充的行消掉,并给用户加分,程序片段如下:
boolean IsHitBottom( ) //判断当前方块是否已触底,并处理 

 boolean flag =false ; /*标志变量,假设为还没有触底*/
   int i, x, y;  /*方块中小正方形格的正下方格式的坐标*/
   for (i=0; i<4; i++)  /*逐个判断各小正方形格是否已触底*/
   {  
      x= block_cx + block_box[i][0];
      y= block_cy + block_box[i][1] + 1 ;
      if ( y>=sp_HIGHT|| gamespace[y][x]==1)
      { flag = true; break; } /*设置为触底*/
   }
   if( flag )/*已触底*/
   {   
      for (i=0; i<4; i++)  /*逐个填充方块所占格子*/
      {
         x= block_cx + block_box[i][0] ;
         y= block_cy + block_box[i][1] ; 
     if(y>=0) { gamespace[y][x]=1;}
      }
      for (i=0; i<4; i++)  /*逐个检查方块所在行是否全填充*/
      {
           y= block_cy + block_box[i][1] ; 
         while(y>=0 && CheckAndCutLine(y))//检查此行是否全填充
             m_score += 100; //加分
      }
      isplaying = ! IsGameOver();/*判断游戏是否结束*/
   }
   return flag;
}

    boolean CheckAndCutLine(int Ln )/*检查某一行是否为全填充,如是,消掉并返回1*/
    {
        boolean IsFilled = true ;/*假设为全填充*/
        for (int i=0; i<sp_WIDTH; i++)  /*逐个判断各格是否有没填充的*/
        {
            if ( gamespace[Ln][i]==0){ IsFilled = false; break;} /*设置为没有全填充*/
        }
            if (IsFilled) //全填充时,消掉此行,把上面的格子值往下移一格
        {
            int  j, k ;
            for(j=Ln; j>0; j--)
                for( k=0;k<sp_WIDTH; k++)//逐个把全填充行上的所有行向下移动一行
                    gamespace[j][k] = gamespace[j-1][k];
            for( k=0;k<sp_WIDTH; k++)  gamespace[0][k] = 0;//顶行
        }
        return  IsFilled;
}
5.5. 游戏演示及操作
游戏开始以及结束界面如下:
                  
图5.4游戏开始界面
                  
图5.5游戏结束界面
5.6 颜色变换菜单
颜色变更界面如下:
  
图5.6游戏颜色变更图案
5.7 功能操作
5.7.1 游戏界面菜单选项的功能操作
(1) “Game”菜单操作
①点击“Game” “Newgame”开始新游戏界面
②点击“Game” “Exit”弹出游戏结束提示框
③点击“Game” “Set Block Color”弹出下落方块颜色选择提示框
④点击“Game” “Set BaGround Color”弹出界面背景颜色选择提示框
⑤点击“Game” “Turn Harder”“Turn Easily”用来改变游戏难度系数,Level会相应变化
 (2) “Control”菜单测试
①点击“Control” “Play”游戏面板开始落方块,游戏开始
②点击“Control” “Pause”正在下落的方块停止,再点击“Resume“游戏继续
③点击“Control” “Stop” 正在下落的方块停止,点击“Play“游戏重新开始
(3) “WindowStyle”菜单操作
点击“WindowStyle” “Windows”“Motif”“Mentel” 任意选项,游戏界面会相应变换
5.7.2 按键事件的功能操作
(1) 方块移动操作,游戏过程中,点击“左、右、下”方向键,实现方块正常移动
(2) 方块反转操作,游戏过程中,点击向上方向键,方块实现反转
 
6. 游戏测试
6.1 测试的意义及注意事项
软件测试是软件工程中及其重要的一个环节,目的是保证软件的质量。测试的好坏将直接影响软件的好坏,进行测试可以找出其中的错误及不足加以改进,从而得到一个高效、可靠的系统。进行软件测试主要作用有以下几点:
1.软件测试是为了发现程序中的错误而执行程序的过程。
2.好的软件测试方案是极可能发现尚未发生错误的方法。
3.程序的测试是发现了至今尚未发现的错误。
软件应从多角度进行测试和分析,这样才能找出其中错误的地方。测试的时间最好找一些与设计系统无关的人员,或者分析人员。因为在开发软件的时候,开发人员已经形成了自己的思维定势,在测试的时候始终受到这种思想的束缚,很难找出其中的错误而与设计无关的人员和那些分析人员很容易找出错误所在。
在程序调试过程中一定要耐心仔细,一个细微的错误将会导致整个功能不能实现会浪费很多的时间来修改。应在以下几方面加以注意:
•语法错误
语法错误是经常碰到的错误。例如,命令拼写错误或传递给函数的参数不正确都将产生错误。语法错误可能导致不能继续编写代码。 
•逻辑错误 
逻辑错误通常可能是潜在和难以检测的。当有因键入错误或程序逻辑流程引起的逻辑错误,可能会成功运行,但产生的结果却是错的。例如,当本应使用小于符号比较数值,但却使用了大于符号时,那么将返回不正确的结果。
•运行时错误
运行时错误是在执行过程中指令试图执行不可能的动作而导致的,必须纠正运行时产生的错误,这样才能保证软件运行的可靠性。
本游戏在开发过程中采用了多种有效的措施保证软件质量,例如,边界处旋转、游戏翻转越界纠,等等,极大地方便了用户操作,但是系统中通常可能还存在着一些错误和缺陷,因此,游戏必须要经过反复的运行测试,尽最大量将bug减到最少。
6.2 测试的步骤
通常,软件测试的过程可以划分为单元测试、集成测试、确认测试和系统测试,本游戏将以这四个步骤进行测试。
1.单元测试
单元测试又称为模块测试,是针对软件设计的最小单位——程序模块进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。可以应用人工测试和计算机测试两种不同类型的测试方法。
单元测试需要从程序的内部结构出发设计测试用例,即采用白盒测试技术。多个模块可以平行独立地进行测试。
在这个测试过程中所发现的往往是编码和详细设计中的错误。传统的最小可编译单元通常指模块、函数或子程序等,而在面向对象技术中通常是指类。
单元测试的重点是模块接口测试、局部数据结构测试、重要的执行通路测试、出错处理通路测试、边界条件测试。
2.集成测试
集成测试分为子系统测试和系统测试。
子系统测试是把经过测试运行正常的模块放在一起形成子系统后再测试。这个步骤着重测试模块的接口,测试模块之间能否相互斜体哦以及通信时有无问题。
系统测试就是把经过测试运行正常的子系统组装成完整的系统后再进行测试。系统测试是测试整个软件和硬件系统,验证系统是否满足规定的要求。这个阶段发现的问题往往是需求说明和软件系统设计时产生的错误。
一般,集成测试采用渐增式组装方法组装系统,渐增式组装方式有自顶向下和自底向上两种继承策略。
自顶向下集成是从主模块开始,沿着程序的控制层次向下移动,逐渐把哥哥模块结合起来。在把附属于主模块的那些模块组装到程序结构中去时,或者使用深度优先的策略,或者使用宽度优先策略。
深度优先策略是先组装在软件结构的一条主控制通路上的所有模块。选取一条主控制通路取决于应用的特点,并且有很大的任意性。而宽度优先的结合方法是沿软件结构水平地移动,把处于同一个控制层次上的所有模块组装起来。
自底向上集成从原子模块开始组装和测试。因为是从底部向上结合模块,总能得到所需的下层模块处理功能,所有不需要存根模块。
3.确认测试
确认测试是在软件开发过程结束时对软件进行评价,以确认它和软件需求是否一致的过程。确认测试也称验收测试,其目标是验证软件的有效性。
4.系统测试
系统测试,是将通过确认测试的软件作为真个基于计算机系统的一个元素,与计算硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。
系统测试的目的在于与系统的需求定义进行比较,发现软件与系统定义不符合或与之矛盾的地方。系统测试的测试用例应根据需求分析规格说明来设计,并在实际使用环境下运行。
6.3 测试过程
6.3.1 游戏界面菜单选项的功能测试
(1) “控制”菜单测试
①点击“游戏” “开始”
输出:游戏开始
结果:正常
②点击“游戏” “结束”
输出:弹出游戏结束提示框
结果:正常
(2) “查看”菜单测试
①点击“查看” “分数”
输出:在游戏面板中间跳出分数显示框
结果:正常
②点击“查看” “级别”
输出:在游戏面板中间跳出级别显示框
结果:正常
(3) “变换”菜单测试
①点击“变换” “改变方块”
输出:在游戏面板中显示随机产生的某种方块
结果:正常

6.3.2 按键事件的功能测试
  (1) 方块移动测试
    游戏过程中,点击“左、右、下”方向键
输出:方块正常移动,不会移出边界
结果:正常
  (2) 方块反转测试
    游戏过程中,点击向上方向键
输出:方块无边界和障碍物阻挡的情况下可反转
结果:正常

6.3.3 方块堆砌与消行测试
(1) 当方块下落到最底面或与障碍物接触时
输出:方块成功堆砌在底部
结果:正常
  (2) 当出现满行现象时
输出:所有满行被消除,方块依次下移
结果:正常

6.3.4 测试结果分析
   经过测试,本游戏实现了基本的功能,不过整体功能还不是很强大,作为开发的第一个版本,游戏在很多方面还需要进一步完善。
 
7. 总结
经过两个月的努力,本游戏的开发工作至此告一段落,游戏能够正确运行,虽然说本游戏还只是一个初级产品,但是比起很多俄罗斯方块游戏,它的功能算是比非常丰富的,界面也具有一定的美观度,可以说取得了初步性的成功。
这两个月来,我学到了很多东西。先前,对于JAVA,基本上还停留在理论阶段,但是通过这一个月的努力,完成了代码超过数千行的俄罗斯方块游戏,在JAVA学习方面,我能够感觉到自己的进步。
例如,JAVA是纯面向对象的语言,通过这次的JAVA游戏开发,我深刻体会到了面向对象的编程思想,本游戏中设计的各个模块的独立性比较高,这就是我对面向对象编程思想体会的一个应用。
还有,JAVA这门技术,很多要用到的应用程序接口,都被封装在了某个类里边,所以,学习JAVA,就是学会如何去用它已经存在的某个接口,而不是去研究如何实现这个接口。这也造成了JAVA的类库非常庞大,即使是娴熟的JAVA开发人员要记全它的API也是不可能的,而初学者乍看下去总会产生一种望而生畏的心理。这一个月的开发工作,让我对JAVA的类库有了个基本的了解,使我在以后的JAVA开发工作中知道如何去查找自己所需要的API。
当然,在这期间,我也遇到了不少问题,如方块的绘制上,曾出现过太闪烁,刷新不彻底等问题。还有,图像截屏传输时编译器总是提示端口号已经被占用,经过检查,原来是我每次截屏发送图像数据时,都重新构造端口号,这是因为变量定义的错误,将变量定义成全局变量,问题就解决了。
总得来说,大的问题没有遇到,遇到的都是一些逻辑、算法上以及变量定义的错误问题,通过程序测试,这些问题都很容易地解决了。
8. 致谢
毕业设计是大学里的最后一堂课,从开始进入课题研究到论文顺利完成的两个月的时间里,我经历了大学期间最为难忘的一段时光。在这段时间里,我学到了很多以前不曾接触的东西,这两个月经历对我未来的人生都会有很大的帮助和影响。
首先衷心感谢我的指导老师给予我的无微不至的关怀和细心的指导。在设计过程中路老师为我们提出了许多宝贵的意见和建议,在此我要由衷的向路老师致以最衷心的感谢和深深的敬意。
在此过程中同学们也给予我很大帮助,感谢我的同学们。在我遇到的一个又一个问题时同学们都热心的帮助我,帮我分析和我探讨,提出了许多解决问题的好方法和建议,使我最终解决了一个又一个问题,感谢我的同学们。
由于我的学识有限,加之时间仓促,文中不免有错误和待改,不足之处,真诚欢迎各位师长、同学提出宝贵意见。最后,祝愿所有的教师和同学们,愿你们身体健康,工作顺利!
 
参考文献 
[1]  Y.J. Lin , H. Xu A framework for web-based product data management using J2EE The International Journal of Advanced Manufacturing Technology, 2004, Vol.24 (11)
[2] George Semeczko A J2EE Reference for Your Library (A review of J2EE: The Complete Reference by Jim Keogh). IEEE Distributed Systems Online, 2003, Vol.4
[3] 官全龙, 姚国祥. 基于Struts的应用架构的研究[J]. 计算机工程与设计, 2005, 26(12): 3225-3227.
[4] 张桂元, 贾燕枫. Struts开发入门与项目实践[M]. 人民邮电出版社, 2005 
[5] 李秀芳,张福增,贾世祥. 软件复用与Framework框架技术[J]. 科学技术与工程, 2006, 6(1): 80-83.
[6] 孙卫琴. 精通Struts:基于MVC的Java Web设计与开发.北京:电子工业出版社,2004.08
[7] 夏昕. 深入浅出Hibernate 电子工业出版社2005-06-01
[8] 耿祥义。JAVA课程设计。北京。清华大学出版社。2004

附录1:外文文献及翻译
The java programming plan analyzes
一  Java synopsis
     Java is Corporation the Java programming language which promoted in May, 1995 (hereafter refers to as the Java language) by Sun Microsystems and the Java platform always called.The HotJava browser realizes which with Java (supported Java applet) to demonstrate the Java charm: Cross platform, person or household who refuses to move and bargains for unreasonably high compensation when the land is requisitioned for a construction project Web, Internet computation. Henceforth, Java widely is accepted and impelled the Web rapid development, the commonly used browser supports Java applet now.On the other hand, the Java technology also unceasingly renews.
      The Java platform by the Java virtual machine (Java Virtual Machine) and the Java application programming interface (Application Programming Interface, is called API) to constitute.The Java application programming interface was the Java application has provided an independence in the operating system standard connection, might divide into the major component and the expansion part. Installs a Java platform after the hardware 'OR' operation system platform, the Java application procedure may move.Now the Java platform already has inserted the nearly all operating system.Such Java procedure may only translate one time, may move in each kind of system.The Java application programming interface already developed from the 1.1x version to 1.2 edition.At present the commonly used Java platform based on Java1.4, the recent edition is Java1.6.
       Java divides into three system JavaSE, JavaEE, JavaME.
二  Java language
      The Java language is a support network computation object-oriented programming language.The Java language has absorbed the Smalltalk language and the C language merit, and increased other characteristics, like support concurrent programming, network correspondence, and multimedia data management and so on.The principal characteristic is as follows:
      1st, the Java language is simple.The Java language grammar and the C language and the C language are very close, make the majority programmers to be very easy to study and to use Java.On the other hand, Java has discarded C   Very little uses, very difficultly to understand, the misleading these characteristics, like instruction character heavy load, multi-inheritances, automatic compulsion type transformation. The Java language does not use the indicator specially, and has provided the automatic waste material collection, causes the programmer not to need to worry for the memory management.
      2nd, the Java language is one object-oriented.The Java language provides kind of, primitive and so on connection and inheritance, for simplicity, only supports class the between list inheritance, but between the support connection multi-inheritances, and support class and between the connection realization mechanism (key words are implements).Java language comprehensive support dynamic binding, but C   Language only to empty function use dynamic binding. In brief, the Java language is a pure object-oriented programming language.
      3rd, the Java language is distributional.The Java language supports the Internet application the development, has a network application programming interface in the basic Java application programming interface (java.net), it provided has used in the network application programming a kind of storehouse, including URL, URLConnection, Socket, ServerSocket and so on. Java RMI (long-distance method activates) the mechanism also is develops the distributional application the important method.
       4th, the Java language is vigorous and healthy.The Java strong type machine-made, the exception handling, the waste material automatic collection and so on is the Java procedure toughness important guarantee.To indicator discarding is the Java unwise choice.The Java security check mechanism causes Java to have the toughness.
       5th, the Java language is safe.Java is usually used in the network environment, for this, Java provided a safety mechanism to guard against the malicious code the attack. Many security features has which besides the Java language, Java to has a safe guard mechanism through the network downloading kind (kind of ClassLoader), like the assignment different name space guards against the substitution locally of the same name kind of, the syllabified code inspection, and provides the safety control mechanism (kind of SecurityManager) to let Java apply the establishment security sentry.
       6th, the Java language is the architecture neutrality.The Java procedure (suffix is the java document) is translated in the Java platform for the architecture neutrality byte code form (suffix is the class document), then may in realize in this Java platform any system to move.This way suits in isomerism network environment and the software distribution.
       7th, the Java language is may transplant.This kind of probability originates from the architecture neutrality, moreover, Java strictly has also stipulated each master data type length.Java system itself also has the very strong probability, the Java compiler is realizes with Java, the Java movement environment is realizes with ANSI C.
 8th, the Java language is the explanation.As mentioned above, the Java procedure is translated in the Java platform for the byte code form, then may in realize in this Java platform any system to move.When movement, Java in the platform Java interpreter carries on the explanation execution to these bytes codes, the kind which in the implementation needs is written down in the joint stage in the movement environment.
 9th, Java is a high performance.Compares with these explanation high-level script language, Java indeed is a high performance.In fact, the Java running rate more and more approaches along with the JIT(Just-In-Time) compiler technology development in C.
 10th, the Java language is a multithreading.In the Java language, the thread is one kind of special object, it must or its sub-(grandson) the kind founds by the Thread kind. Usually has two methods to found the thread: First, the operational construction was the Thread(Runnable) structure realizes one the Runnable connection object packing to become a thread, its two, derived the subclass from the Thread kind and rewrites the run method, uses the object which this subclass founded is the thread. It is noteworthy that the Thread kind has already realized the Runnable connection, therefore, any thread had its run method, but in the run method has contained the code which the thread had to move.The thread activity controls by group of methods. The Java language supports many threads at the same time execution, and provides between multi-thread the synchronized mechanism (key words is synchronized).
 11th, the Java language is dynamic.One of Java language design goals is adapts in the dynamic change environment.The Java procedure needs the kind can dynamic write down the movement environment, also may write down the kind through the network which needs.This is also advantageous to the software promotion.Moreover, in the Java kind has a movement time expression, can carry on the movement time the type inspection.
 The Java language fine characteristic causes Java to apply has the incomparable toughness and the reliability, this also reduced the application system maintenance cost.Java API which inlays to the object technology comprehensive support and in the Java platform can reduce the application system the development time and reduces the cost.The Java translation one time, everywhere may move the characteristic enables it to be able to provide a everywhere available open structure and transmits the information between the multi-platforms the low cost way.
 In the Java technology, is worth paying attention also has JavaBeans, it is an open standard module architecture, it is independent in the platform, but uses the Java language.JavaBean is one satisfies JavaBeans the standard the Java kind, usually has defined a real world thing or the concept.
A JavaBean main characteristic including attribute, method and event. Usually has defined a real world thing or the concept.A JavaBean main characteristic including attribute, method and event.Usually, supports the JavaBeans standard in one the development environment (for example Sun Java Studio and IBM VisualAge for Java), may visible operate JavaBean, also may use JavaBean which the JavaBean structure new goods come into the market. The JavaBean superiority also lies in the probability which Java brings.Now, EJB (Enterprise JavaBeans) expands the JavaBean concept to the Java service end module architecture, this model support multi-layer distributional object application.
三  Java tool bags introduced that:
1. AWT: It is Abstract Window ToolKit (abstract window tool bag) the abbreviation, this tool bag provided a set to carry on the interactive connection with the local graphical interface.In the AWT graph function and the operating system provide between the graph function has 11 corresponding relations, we are called it peers. In other words, when we use AWT comes the component graphical user interface time, we in fact are the graph storehouse which provides in the use operating system.Because the different operating system graph storehouse provides the function is dissimilar, has the function in a platform in other platform then possibly does not exist. In order to realize a " translation which the Java language declared, everywhere moves the " concept, AWT can not but realize its platform independency through the sacrifice function, in other words, AWT provides the graph function is graph function occurring together which each kind of general operating system provides.Because AWT is the dependence local method realizes its function, we usually control AWT to be called heavyweight control.
2. Swing: It is a set of new graphical interface system which constructs in the AWT foundation, it has provided all functions which AWT can provide, and has carried on the large scale expansion with the pure Java code to the AWT function.For example said was not all operating system all provides has controlled a support to the shape of tree, Swing uses the basic mapping method which in AWT provided to control to the shape of tree to carry on the simulation. Swing 100Because has not used the local method in Swing to realize the graph function, we usually control Swing to be called the lightweight to control.
 
译文:
java编程方案分析
一 Java简介
Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动感的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。另一方面,Java技术也不断更新。
  Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。目前常用的Java平台基于Java1.4,最近版本为Java1.6。
    Java分为三个体系JavaSE,JavaEE,JavaME。
二   Java语言
    Java语言是一个支持网络计算的面向对象程序设计语言。Java语言吸收了Smalltalk语言和C++语言的优点,并增加了其它特性,如支持并发程序设计、网络通信、和多媒体数据控制等。主要特性如下:
  1、Java语言是简单的。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
  2、Java语言是一个面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++ 语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
  3、Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java.net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、 ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
  4、Java语言是健壮的。Java的强类型机制、异常处理、废料的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
  5、Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。 
  6、Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件), 然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。 
  7、Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。
  8、Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式, 然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
  9、Java是高性能的。与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。 
  10、Java语言是多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。 Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
  11、Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
    Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。
    在Java技术中,值得关注的还有JavaBeans,它是一个开放的标准的组件体系结构,它独立于平台,但使用Java语言。一个JavaBean是一个满足JavaBeans规范的Java类,通常定义了一个现实世界的事物或概念。一个JavaBean的主要特征包括属性、方法和事件。通常,在一个支持JavaBeans规范的开发环境(如Sun Java Studio 和IBM VisualAge for Java)中,可以可视地操作JavaBean,也可以使用JavaBean构造出新的JavaBean。JavaBean的优势还在于Java带来的可移植性。现在,EJB (Enterprise JavaBeans) 将JavaBean概念扩展到Java服务端组件体系结构,这个模型支持多层的分布式对象应用。
三 Java工具包介绍:
    1. AWT:它是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers。 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT 不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。
    2. Swing:它是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持, Swing 利用了AWT 中所提供的基本作图方法对树形控件进行模拟。由于 Swing 控件是用100%的Java代码来实现的,因此在一个平台上设计的树形控件可以在其他平台上使用。由于在Swing 中没有使用本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。

 
附录2:主要代码
 private void reportGameOver()   
       {   
        JOptionPane.showMessageDialog(this,"Game over!");   
       }   
        
       private void createMenu()   
      {   
       gameMenu = new JMenu("Game");   
       newGameItem = new JMenuItem("New Game");   
       setBlockColorItem = new JMenuItem("Set Block Color...");   
       setBgColorItem = new JMenuItem("Set BackGround Color...");   
       turnHardItem = new JMenuItem("Turn Harder");   
       turnEasyItem = new JMenuItem("Turn Easily");   
       exitItem = new JMenuItem("Exit");   
       gameMenu.add(newGameItem);   
        gameMenu.add(setBlockColorItem);   
        gameMenu.add(setBgColorItem);   
        gameMenu.add(turnHardItem);   
        gameMenu.add(turnEasyItem);   
        gameMenu.add(exitItem);      
           
       controlMenu =  new JMenu("Control");   
        playItem = new JMenuItem("Play");   
        pauseItem = new JMenuItem("Pause");   
        resumeItem = new JMenuItem("Resume");   
        stopItem = new JMenuItem("Stop");   
        controlMenu.add(playItem);   
        controlMenu.add(pauseItem);   
        controlMenu.add(resumeItem);   
        controlMenu.add(stopItem);   
           
       
        buttonGroup = new ButtonGroup();   
        windowsRadioItem = new JRadioButtonMenuItem("Windows");   
        motifRadioItem = new JRadioButtonMenuItem("Motif");   
        metalRadioItem = new JRadioButtonMenuItem("Mentel",true);   
        buttonGroup.add(windowsRadioItem);   
        buttonGroup.add(motifRadioItem);   
        buttonGroup.add(metalRadioItem);   
           
        informationMenu = new JMenu("Information");   
        authorItem = new JMenuItem("Author:张培杰");   
        helpItem = new JMenuItem("Help");   
        informationMenu.add(authorItem);   
        informationMenu.add(helpItem);   
           
        bar = new JMenuBar();   
        bar.add(gameMenu);   
       bar.add(controlMenu);   
       bar.add(informationMenu);   
          
       addActionListenerToMenu();   
       setJMenuBar(bar);   
      }  
        
      
      private void addActionListenerToMenu()   
      {   
       newGameItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        stopGame();   
        reset();   
        setLevel(DEFAULT_LEVEL);   
       }   
      });   
         
      setBlockColorItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        Color newBlockColor =   
                JColorChooser.showDialog(RussiaBlocksGame.this,   
                        "Set color for block", canvas.getBlockColor());   
        if (newBlockColor != null)   
         canvas.setBlockColor(newBlockColor);   
       }   
      });   
         
      setBgColorItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        Color newBgColor =   
                JColorChooser.showDialog(RussiaBlocksGame.this,"Set color for block",    
                                   canvas.getBgColor());   
        if (newBgColor != null)   
         canvas.setBgColor(newBgColor);   
       }   
      });   
         
      turnHardItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        int curLevel = getLevel();   
        if (curLevel < MAX_LEVEL) setLevel(curLevel + 1);   
       }   
      });   
         
      turnEasyItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        int curLevel = getLevel();   
        if (curLevel > 1) setLevel(curLevel - 1);   
       }   
      });   
         
      exitItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        System.exit(0);   
       }   
      });   
      playItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        playGame();   
       }   
      });   
         
      pauseItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        pauseGame();   
       }   
      });   
         
      resumeItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        resumeGame();   
       }   
      });   
         
      stopItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        stopGame();   
       }   
      });   
         
      windowsRadioItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        String plaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";   
        canvas.fanning();   
        controlPanel.fanning();   
       }   
      });   
         
      motifRadioItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        String plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";   
        canvas.fanning();   
        controlPanel.fanning();;   
       }   
      });   
         
       metalRadioItem.addActionListener(new ActionListener() {   
       public void actionPerformed(ActionEvent ae) {   
        String plaf = "javax.swing.plaf.metal.MetalLookAndFeel";   
        canvas.fanning();   
        controlPanel.fanning();   
       }   
      });   
         
       }   
      
          
     private class Game implements Runnable   
     {   
      
      public void run()   
      {   
       int col=(int)(Math.random()*(canvas.getCols()-3));   
       style=RussiaBlock.STYLES[(int)(Math.random()*RussiaBlock.BLOCK_KIND_NUMBER)][(int)(Math.random()*RussiaBlock.BLOCK_STATUS_NUMBER)];   
           
             while (playing) {   
        if (block != null) {    
         if (block.isAlive()) {   
          try {   
           Thread.sleep(100);   
          } catch (InterruptedException ie) {   
           ie.printStackTrace();   
          }   
          continue;   
         }   
        }   
           
        checkFullLine();   
           
        if (isGameOver()) {     
         playItem.setEnabled(true);   
         pauseItem.setEnabled(true);   
         resumeItem.setEnabled(false);   
         controlPanel.setPlayButtonEnabled(true);   
         controlPanel.setPauseButtonLabel(true);   
      
         reportGameOver();   
         return;   
      }   
      block = new RussiaBlock(-1, col, getLevel(),style);   
      block.start();   
         
      col=(int)(Math.random()*(canvas.getCols()-3));   
       style=RussiaBlock.STYLES[(int)(Math.random()*RussiaBlock.BLOCK_KIND_NUMBER)][(int)(Math.random()*RussiaBlock.BLOCK_STATUS_NUMBER)];   
        controlPanel.setBlockStyle(style);   
     }   
     }   
     
      public void checkFullLine()    
      {   
       for (int i = 0; i < canvas.getRows(); i++) {   
        int row = -1;   
        boolean fullLineColorBox = true;   
        for (int j = 0; j < canvas.getCols(); j++) {   
         if (!canvas.getBox(i, j).isColorBox()) {   
          fullLineColorBox = false;   
          break;   
         }   
        }   
        if (fullLineColorBox) {   
         curLevelScore += PER_LINE_SCORE;   
         score += PER_LINE_SCORE;   
         row = i--;   
         canvas.removeLine(row);   
        }   
       }   
      }   
      
      private boolean isGameOver() {   
       for (int i = 0; i < canvas.getCols(); i++) {   
        RussiaBox box = canvas.getBox(0, i);   
        if (box.isColorBox()) return true;   
       }   
       return false;   
      }   
     }   
     public static void main(String[] args)    
     {   
      new RussiaBlocksGame("Russia Blocks Game");   
     }   

猜你喜欢

转载自blog.csdn.net/weixin_55459367/article/details/114379740