资源描述
河北农业大学
本科毕业论文
题 目:基于Java的俄罗斯方块的设计与实现
摘要
俄罗斯方块作为一款风靡全球的多样化终端游戏,经久不衰。俄罗斯方块简单的基本游戏规则是旋转、移动,游戏自动随机输出7种形状的方块,经旋转后可形成28种形状,方块堆叠在一起,排列成完整的一行或多行消除得分,积分达到一定程度会自动提升级别。该游戏上手简单、老少皆宜、家喻户晓。
本论文在详尽分析传统俄罗斯实现的基本原理、基本规则基础上,更深一步地研究俄罗斯方块的创新模式,在经典模式基础上开发出等级可变的模式,本文对以上功能给出了实现流程、详尽描述、和部分源代码。程序是在Microsoft Windows 7系统下,以Java为开发语言,在MyEclipse开发平台上进行游戏的设计与实现。
关键词:游戏;软件工程;MyEclipse
Abstract
Tetris is a popular global diversification terminal game, enduring. The basic rules of the game Tetris simple is rotating, moving, the game automatically random output 7 shape box, the rotation can be formed after the 28 square shape, stacked together, arranged to complete one or more rows to eliminate the score, the integral to a certain extent will automatically upgrade the level of. The game started simple, suitable for all ages, make known to every family.
In this paper a detailed analysis of the basic rules of traditional Russian basic principle, on the basis of the realization of innovation mode, further study of Tetris, developed a class variable model in the classical model, the above function gives the implementation process, detailed description, and part of the source code.This design is in the Microsoft Windows 7 system, taking Java as the development language, for game design and Implementation on MyEclipse platform.关键词:游戏;俄罗斯方块;软件工程;MyEclipse
Keywords: Game; software engineering; MyEclipse
目录
1 绪论 1
1.1 俄罗斯方块游戏的背景 1
1.2 俄罗斯方块游戏的规则 1
1.3 研究俄罗斯方块游戏的意义 1
1.4 论文组织 2
2 相关技术分析 3
2.1 JAVA语言概述 3
2.2 Eclipse简介 4
3 需求分析 6
3.1 系统需求 6
3.2 接口控制 6
4 系统设计 7
4.1 软件运行和开发工具 7
4.2 系统功能设计 7
4.2.1 手工处理业务的基本流程 7
4.2.2 基本流程的功能模块 9
5 系统实现 11
5.1 游戏主界面显示模块 11
5.2 画布、方块显示模块 12
5.2.1 背景画布模块设计 12
5.2.2 预览方块模块设计 14
5.2.3方块移动、旋转设计 16
5.3 控制面板模块 20
5.3.1菜单栏模块设计 20
5.3.2控制面板按钮设计 22
6 总结 23
参考文献 24
致谢 25
1 绪论
1.1 俄罗斯方块游戏的背景
俄罗斯方块是俄罗斯人阿列克谢•帕基特诺夫(Alexey Pazhitnov)发明。1985年6月 工作于莫斯科科学计算机中心的阿列克谢·帕基特诺夫在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica 60(一种计算机)为平台的俄罗斯方块的游戏。后来经瓦丁·格拉西莫夫(Vadim Gerasimov)移植到PC上,并且在莫斯科的电脑界传播。人们一开始并没预料到它将会有如此广泛的吸引力。实际上,在游戏发明后的数年间,俄罗斯方块成了无数场专利官司和法律纠纷的目标,而许多公司也不遗余力地上阵厮杀,想要将游戏的创意据为己有。一个最初的版本是Spectrum Holobyte为IBM兼容机开发的游戏。1988年,俄罗斯方块在街机上也变得非常流行,这归功于Atari,因为他们发布了一个能让两名玩家同时游戏的版本。
俄罗斯方块经常被称为拼图游戏。玩家需要找出如何能把各块积木最好的拼在一起的方法。俄罗斯方块相当于直角的智力拼图游戏,或者其它一种“在这有限空间内组织几何体”的拼图。俄罗斯方块为了创造真正引人入胜的游戏,它巧妙的平衡了拼图游戏与动作游戏的机制。因而每个人玩这个游戏都会有一次不同的体验。俄罗斯方块所用到的一种动作游戏机制是越来越逼近的威胁感,留给玩家的时间总是非常有限。俄罗斯方块中积木是从上面落下来。如果玩家不在积木落到屏幕底下或翻转它,不能给它找一个最有利的位置,这块积木就可能会堵住某处,而它下面的几行也就没有办法拼接完整,玩家也就离游戏结束又靠近了一行或几行。在游戏进程中,积木落下来的速度越来越快,这样对玩家的挑战也就越来越大,游戏的难度也逐步增加。
2014年2月22日,英国心理学家发现,减肥者通过玩俄罗斯方块,可以降低对富含脂肪的食物和零食的心理需求;尝试戒烟者的烟瘾也能得到遏制[1]。
1.2 俄罗斯方块游戏的规则
由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束[2]。
1.3 研究俄罗斯方块游戏的意义
在成为一个真正的游戏开发者的路上,俄罗斯方块是一个完美开始。并且,不需要艺术家般的才能就能做出非常好看的俄罗斯方块游戏。任何一个能画出方块的人每个作图形程序的人都会的就能做出商业品质的俄罗斯方块游戏。
以俄罗斯方块开始还有另外一个好处,不仅能做出一个完整的既好玩又容易上瘾游戏,而且它看上来和那些商业版本没什么区别。方块就是方块,不管是谁画出它们的,而且 tetraminos(俄罗斯方块中使用的形状)也不过是一些方块的组合。
俄罗斯方块拥有所有游戏共通的独立成份。它有一个游戏循环(这个过程被反复执行直到游戏退出)。这个游戏循环读取玩家的输入,处理这个输入,然后更新游戏的元素(下落的 tetraminos),并且检查是输还是赢[3]。
以后要做的所有的简单的游戏都要用到这些东西,所以学习这个过程并且实现它是非常重要的。当第一次完成它之后,以后再做游戏时就能看出那个游戏有多难以及要花多长时间。如果没有完整的完成过这些,哪怕一次,就永远不能完整地正确领会其中的每个元素。当做大的项目时,就更不能确定其复杂性及所要的时间。如果甚至不能正确地领会这整个过程(因为你没能完成它),可能是没能建立一个合适的时间表或估计合适的时间,更有可能的是不够努力。
还有,玩俄罗斯方块可以练习人的反映能力,开始时快速的下降会让人手无足措,但适应了之后就会发现自己的反应力变的很快了。
其次长时间的手指活动可以让人血液流通加快有利健康。
还有俄罗斯方块高手都知道要想赢,就要有远大的布局,决不能只局限于一点一点的减,这在无形中就提高了人的智慧。
1.4 论文组织
论文全文共分为六章:
第一章绪论:主要介绍了游戏的背景、规则及研究此游戏的意义。
第二章相关技术分析:介绍了Java语言和开发环境Eclipse的相关知识。
第三章需求分析:主要介绍了系统设计思想、功能和性能需求。
第四章系统设计:主要介绍了系统的功能设计。
第五章系统实现:介绍了系统的所有模块和它的功能。
第六章总结:回顾开发此游戏的艰辛过程与人生感悟。
2 相关技术分析
2.1 JAVA语言概述
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言[4],是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
Java语言是易学的。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
Java语言是强制面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。
Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。
Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
Java是性能略高的。与那些解释型的高级脚本语言相比,Java的性能还是较优的。
Java语言是原生支持多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用[5]。Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。特别是Java企业应用编程接口(Java Enterprise APIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库[6-7]。
2.2 Eclipse简介
Eclipse是著名的跨平台的自由集成开发环境(IDE)[8]。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。
Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。
Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。 2003年,Eclipse 3.0选择OSGi服务平台规范为运行时架构。 2007年6月,稳定版3.3发布。2008年6月发布代号为Ganymede的3.4版[9]。
Eclipse的基础是富客户机平台(Rich Client Platform, 即RCP)。RCP包括下列组件:
(1)核心平台(启动Eclipse,运行插件)
(2)OSGi(标准集束框架)
(3)SWT(可移植构件工具包)
(4)JFace(文件缓冲,文本处理,文本编辑器)
(5)Eclipse工作台(即Workbench ,包含视图(views)、编辑器(editors)、视角(perspectives)、和向导(wizards))
Eclipse采用的技术是IBM公司开发的(SWT),这是一种基于Java的窗口组件,类似Java本身提供的AWT和Swing窗口组件;不过IBM声称SWT比其他Java窗口组件更有效率。Eclipse的用户界面还使用了GUI中间层JFace,从而简化了基于SWT的应用程序的构建。
Eclipse的插件机制是轻型软件组件化架构。在富客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java以外的其他语言。 已有的分离的插件已经能够支持C/C++(CDT)、Perl、Ruby,Python、telnet和数据库开发。插件架构能够支持将任意的扩展加入到 现有环境中,例如配置管理,而决不仅仅限于支持各种编程语言。
Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。Eclipse基本内核包括:图形API (SWT/Jface), Java开发环境插件(JDT ),插件开发环境(PDE)等。
Eclipse由各种不同的计划组成。以下列出了部分计划。
(1)Eclipse计划:本身包括Eclipse平台,Eclipse富客户端平台(RCP)和Java开发工具(JDT)。
(2)Eclipse测试和性能工具平台(TPTP):提供一个允许软件开发者构建诸如测试调试、概况分析、基准评测等测试和性能工具的平台。
(3)Eclipse Web工具平台计划(WTP):用Java企业版Web应用程序开发工具来扩展Eclipse平台。它由以下部分组成:HTML、JavaScript、CSS、JSP、SQL、XML、DTD、XSD和WSDL的 源代码编辑器;XSD和WSDL的图形界面编辑器;Java企业版的“项目性质”(project nature)、建构器(builder)和模型(model),与一个Java企业版的导航(navigator);一个Web服务(Web service)向导和浏览器,还有一个WS-I测试工具;最后是数据库访问查询的工具与模型。
(4)Eclipse商业智能和报表工具计划(BIRT):提供Web应用程序(特别是基于Java企业版的)的报表开发工具。
(5)Eclipse可视化界面编辑器计划(VEP):一个Eclipse下创建图形用户界面代码生成器的框架。
(6)Eclipse建模框架(EMF):依据使用XMI描述的建模规格,生成结构化数据模型的工具和其他应用程序的代码。
(7)图形化编辑器框架(GEF):能让开发者采用一个现成的应用程序模型来轻松地创建富图形化编辑器。
(8)UML2:Eclipse平台下的一个UML 2.0元模型的实现,用以支持建模工具的开发。
(9)AspectJ:一种针对Java的面向侧面语言扩展。
(10)Eclipse通讯框架(ECF):专注于在Eclipse平台上创建通讯应用程序的工作。
(11)Eclipse数据工具平台计划(DTP)
(12)Eclipse设备驱动软件开发计划(DSDP)
(13)C/C++开发工具计划(CDT):努力为Eclipse平台提供一个全功能C和C++的集成开发环境(IDE),它使用GCC作为编译器。
(14)Eclipse平台COBOL集成开发环境子计划(COBOL):将构建一个Eclipse平台上的全功能COBOL集成开发环境。
(15)并行工具平台(PTP):将开发一个对并行计算机架构下的一组工具进行集成的平行工具平台,而且这个平台是可移植的,可伸缩的并基于标准的。
(16)嵌入式富客户端平台(eRCP):计划将Eclipse富客户端平台扩展到嵌入式设备上。这个平台主要是一个富客户端平台(RCP)组件子集的集合。它能让桌面环境下的应用程序模型能够大致同样地能运用在嵌入式设备上。
3 需求分析
对系统的需求分析就是用户和开发人员在“系统必须做什么”这个问题上实现相互理解,达到共识,从而形成双方认可的软件产品的需求规格。这样有利于提高软件开发过程中的能见度,便于对软件开发过程的控制与管理,便于采用工程化的模式开发软件,从而达到提高软件的质量,为开发人员、维护人员、管理人员之间的交流、协作提供便捷。作为工作成果的原始依据,系统的需求分析可以向潜在用户传递软件功能、性能的需求,使其能够判断该软件是否符合自己的需求。
3.1 系统需求
系统随机产生7中不同形状的方块,旋转后有28种状态。方块自由下落,玩家通过键盘控制方块的移动和旋转,把方块摆放在适当的位置。如果方块落下时,有被方块填满的整行,则该行可消去。每消去一行,玩家得分增加10分,每满50分,玩家等级增加一级。若由存在空格的方块填满整个窗口,则游戏宣告失败。游戏功能需求如下:
游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的默认背景色是灰色,主界面方块默认用浅绿色,预显方块颜色默认为红色。背景色、前景色对比鲜明,以达到让玩家眼前一亮的感觉,并能在游戏达到高等级状态,方块下落速度渐高的情况下使玩家能够清楚的分辨出下落方块的形状,增加游戏的刺激性。
游戏形状需求:用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型一共7种形状的向4个方向的旋转变形,各个方块要能实现它的任意变形,可设为顺时针变形或逆时针变形,一般为逆时针变形。方块的可否翻转需要加以判断,以防止其翻转越界。
键盘处理事件需求:方块下落时,可通过键盘方向键(上键、下键、左键、右键)向上(旋转变形)、向下(加速下落)、向左移动、向右移动。
鼠标处理事件需求:通过点击菜单栏中相应的菜单项或控制面板内的按钮,可以实现游戏的开始、结束、暂停、继续、提高等级、降低等级,预显方块形状的显示,分数、等级的显示,以及游戏帮助等功能。
显示需求:当方块填满一行时可以消行,剩余未填满的行逐次向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。当方块充满主界面的每一行,方块不能再下落时,提示“亲!你输了!”的字样。
非功能性需求:本系统非功能性需求包括游戏主界面窗口尺寸可调整性需求、游戏运行时主界面弹出位置居中需求等。
3.2 接口控制
本游戏通过键盘和鼠标进行操作,在Windows的操作系统下,利用键盘的按键对方块进行移动、变形,要使用到键盘的接口事件。游戏使用鼠标对游戏进行全程控制,如游戏的开始、暂停、继续、查看游戏帮助、更改游戏等级等,通过对鼠标单击、按键添加监听事件,编辑相应代码来实现相应功能。
4 系统设计
4.1 软件运行和开发工具
操作系统:Microsoft Windows 7
内存:2G
硬盘:500G
CPU:Intel(R) Core(TM) i3-2310M
交互工具:键盘、鼠标
显示器:VGA显示器
JDK版本:jdk1.7.0_25
Eclipse版本:MyEclipse 4.3.0 SDK-3.4.1-win64
4.2 系统功能设计
4.2.1 手工处理业务的基本流程
本游戏的设计以娱乐为初衷,以益智为目的,在综合研究以往俄罗斯方块经典游戏功能的基础上推陈出新,加之新的功能,赋以新的生机和活力。图4-1为游戏基本流程图具体阐述游戏的基本流程。
运行说明:
1>运行程序,点击右侧控制面板内的“开始”或“控制”菜单内的“开始”按钮开始游戏。
2>使用上、下、左、右键控制方块的变形、下落、向左和向右移动。
3>方块满行消除,分数自动增加,分数每满50等级自动增加一级。
4>等级增加、方块下落速度增加,按右侧控制面板或“游戏”菜单内的“提高等级”、“降低等级”按钮,来手动改变游戏等级。
5>按右侧控制面板或“控制”菜单内的“暂停”可以控制游戏暂停,然后按“继续”可以控制游戏继续上次游戏。按“停止”按钮,游戏会彻底停止正在进行的当局游戏,再按“开始”或“控制”菜单内的“重新开始”会开始新游戏。
6>当方块占满整个窗口,不能再有新方块下落时,游戏会弹出“亲!你输了!”的对话框提示游戏结束。
结束
是否到达顶部
显示“亲!你输了!”字样
玩家积分增加50
级数自动增加一级
开始
开始游戏
玩家操作方块
是否满行
玩家提高或降低级数等
暂停、取消、退出、重新开始
玩家积分增加
是否到达底部
初始化方块
否
是
是
否
是
否
是
是
图4-1 游戏基本流程图
4.2.2 基本流程的功能模块
本系统基于游戏的各项功能来设计游戏的各个功能模块。图4-2为本游戏的系统功能模块示意图,如图所示,本游戏主要有两大模块:游戏界面区,游戏控制区。游戏界面区分显示玩家可选操作、显示玩家操作结果两个部分。游戏控制区分开始、暂停、继续、停止、重新开始、提高级数、降低级数、退出等功能模块。
俄罗斯方块游戏
游
戏
界
面
区
游
戏
控
制
区
游戏
选项
开始
暂停、继续
重新开始
停止
提高等级
降低等级
退出
图4-2 系统功能模块示意图
图4-3为游戏界面区模块设计示意图,如图所示,游戏界面区模块可细分为创建新游戏界面、处理玩家操作、显示玩家操作结果三个功能模块。
游戏界面区
创建新游戏界面
处理玩家操作
显示玩家操作结果
图4-3 界面模块示意图
图4-4为游戏控制区设计示意图,如图所示,游戏控制区模块分为开始、暂停、继续、初始游戏级别设置、退出等功能模块。
游戏控制区
退出
初始级别设置
暂停
开始
图4-4 控制区模块示意图
5 系统实现
Java是一种纯面向对象(Object-Oriented)的程序语言。从面向对象的观念出发,本程序主要可分为以下几个模块:
⑴ 游戏主界面显示模块
⑵ 方块及数据显示模块
⑶ 方块移动控制模块
⑷ 游戏进度、等级控制模块
分析对象的技巧在于它的功能的扩展性及维护效率[10]。试想,如果因为外部环境或者用户需求的变化需要对程序进行功能扩展或者维护,就要对代码作大幅度的更动甚至重写,这样就失去了面向对象的优势,所以在本程序分析时将独立性高的模块作为一个对象,以提高程序的可扩展性和可维护性。以下该游戏中类的设计:
ControlMainGame类:继承自JFrame类,作为游戏的主类,负责对游戏的主体全局进行控制,连接与指挥各个类的枢纽。
ControlPanel类:继承自JPanel类,作为操作面板类,负责安放主游戏窗口,积分板,级别控制按钮等窗口用以控制游戏进程。
ShowBeforePanel类:继承自JPanel类,ShowBeforePanel线程类动态改变画布类的方格颜色,画布类通过检查方格颜色来体现ShowBeforePanel方块的移动情况与消去状况。
ErsBox类:方格类,组成方块的基本元素,主要表达方式为颜色。
BlockOperation类:继承自Thread类,作为操控方块的类,控制方块的移动,下落以及变形。
5.1 游戏主界面显示模块
一个优秀的软件系统不仅体现在核心的功能的多样性和强大上,如果使用者所面对的是枯燥的、陈旧的界面的话,那么这个的软件系统是不成功的,所以好的、精美的界面设计是极为重要的环节[11]。为玩家设计制作布局合理、视觉效果良好的界面的重要性就不言而喻了。
游戏主界面采用Swing组件开发,并且向其注册监听器,以实现各种控制功能,综合游戏窗体的设计,其上至少需要注册三个监听器,分别是动作监听器(ActionListener)、键盘监听器(KeyListener)、选项监听器(ItemListener)。
根据初步设计,可以确定客户端上所要用到的Swing组件对象有JFrame对象、JPanel对象,JLabel对象、JButton对象、JMenuBar对象、JMenu对象、JMenuItem对象、JTextField对象、JTextArea对象、JDialog对象等,至少十个Swing组件对象。下图5-1为游戏主界面截图。
本游戏主界面设计的初始颜色搭配基于对比鲜明的原则,默认背景色为灰色,得分初始值为0,等级初始值为1。游戏主窗体尺寸设置为(520,580)。
图5-1 游戏主界面截图
5.2 画布、方块显示模块
本游戏中将画布底色默认设计成灰色,在方块下落过程中,根据颜色的变化识别下落的方块。
5.2.1 背景画布模块设计
该游戏的主背景画布是一个20行、12列的二维数组,方块显示是由相应颜色变化来标识,主窗体用颜色填充后可形成呈现出来背景样式和方块。本游戏用继承自JPanel的ShowBeforePanel类控制背景画布的显示,用rows代表画布的行数,cols代表画布的列数,行数和列数决定着画布拥有方格的数目。背景画布实现代码如下:
/*
ShowBeforePanel 类
画布类的构造函数
rows int, 画布的行数
cols int, 画布的列数
行数和列数决定着画布拥有方格的数目
*/
private class ShowBeforePanel extends JPanel
{
private Color backColor = Color.darkGray, frontColor = Color.red;
private ErsBox[][] boxes =new ErsBox[ErsBlock.boxes_rows][ErsBlock.boxes_cols];
private int style, boxWidth, boxHeight;
private boolean isTiled = false;
public ShowBeforePanel()
{
for (int i = 0; i < boxes.length; i++)
{
for (int j = 0; j < boxes[i].length; j++)
boxes[i][j] = new ErsBox(false);
}
}//画布类的构造函数
public ShowBeforePanel(Color backColor, Color frontColor)
{
this();
this.backColor = backColor; //背景色
this.frontColor = frontColor; //前景色
}
public void setStyle(int style)
{
this.style = style;
repaint();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (!isTiled)
fanning();
int key = 0x8000;
for (int i = 0; i < boxes.length; i++)
{
for (int j = 0; j < boxes[i].length; j++)
{
Color color = (((key & style) != 0) ? frontColor : backColor);
g.setColor(color);
g.fill3DRect(j * boxWidth, i * boxHeight,
boxWidth, boxHeight, true);
key >>= 1;
}
}
}
5.2.2 预览方块模块设计
方块和数据信息是游戏中最基本的功能模块。ShowBeforePanel这个类提供方块预显图形 ,blockkindnum用来控制随机产生的方块编号,blockstatusnum用来控制方块的四种旋转状态。定义一个4x4方阵,共16个小格。用“0”和“1”来表示每个方格是绘制新颜色还是保留底色。每得到一个新方块,都是随机从七种形态的方块中选取一种。游戏定义了一个变量,代表新方块的模型。比如定义int型数组STYLE代表28中方块类型,7行4列,每个元素代表其中一种方块。即0<=blockkindnum<=6,0=<blockstatusnum<=3。
那么,当方块落下需要得到新方块时,只需随机得到一对blockkindnum,blockstatusnum值,然后再根据这个STYLE的值构画相应的方块。剩下的问题就是应该怎么随机到一对STYLE行列值。
Java语言包中的Math类提供了一个生成随机数的方法random(),调用这个方法会产生一个在0-1之间的双精度浮点数。所以每次要得到新方块时,只需调用一次这个方法,得到一个0-1的双精度浮点数,然后用该数乘以7,之后强转成整型,即可得到1—7的整数,用来控制行。用该数乘以4,之后强转成整型,即可得到1—4的整数,用来控制列。
由此可以组合出多种图形定义然后用代码实现下列功能:
1>每次执行首先为随机数产生不同的初值。
style=BlockOperation.STYLES[(int)(Math.random()*7)][(int)
(Math.random() * 4)];
2>随机选取一个图形,图5-2随机产生方块图具体描述用生成的随机数控制产生的图形。
长条形
Z形
反Z形
7形
T形
反7形
随机数
方块形
STYLES的下标
图5-2 随机产生方块图
3>当前图形在其4*4网格中的位置信息。
绘制4行4列的方块预显方格,随机生成预显示的方块样式。本游戏用二维数组存储方块的28种样式。
public final static int[][] STYLES = {// 共28种状态
{0x0f00, 0x4444, 0x0f00, 0x4444}, // 长条型的四种状态
{0x04e0, 0x0464, 0x00e4, 0x04c4}, // 'T'型的四种状态
{0x4620, 0x6c00, 0x4620, 0x6c00}, // 反'Z'型的四种状态
{0x2640, 0xc600, 0x2640, 0xc600}, // 'Z'型的四种状态
{0x6220, 0x1700, 0x2230, 0x0740}, // '7'型的四种状态
{0x6440, 0x0e20, 0x44c0, 0x8e00}, // 反'7'型的四种状态
{0x0660, 0x0660, 0x0660, 0x0660}, // 方块的四种状态
};
以下为与数组相对应的方块样式截图。
①长条型的四种状态
图5-3 长条型状态截图
②'T'型的四种状态
图5-4 'T'型状态截图
③反'Z'型的四种状态
图5-5 反'Z'型状态截图
④'Z'型的四种状态
图5-6 'Z'型状态截图
⑤'7'型的四种状态
图5-7 '7'型状态截图
⑥反'7'型的四种状态
图5-8 反'7'型状态截图
⑦方块的四种状态
图5-9 方块状态截图
5.2.3方块移动、旋转设计
方块的翻转与移动比较容易实现,方块移动只需要改变方块的横坐标或纵坐标,然后重新绘制方块即可。方块翻转也只需要改变背景数组的值,重新绘制方块即可。
本游戏方块下落时,进行动态绘制,实现Cloneable接口, 以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。方块的操作类BlockOperat
展开阅读全文