版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE河北农业大学本科毕业论文题目:基于Java的俄罗斯方块的设计与实现摘要俄罗斯方块作为一款风靡全球的多样化终端游戏,经久不衰。俄罗斯方块简单的基本游戏规则是旋转、移动,游戏自动随机输出7种形状的方块,经旋转后可形成28种形状,方块堆叠在一起,排列成完整的一行或多行消除得分,积分达到一定程度会自动提升级别。该游戏上手简单、老少皆宜、家喻户晓。本论文在详尽分析传统俄罗斯实现的基本原理、基本规则基础上,更深一步地研究俄罗斯方块的创新模式,在经典模式基础上开发出等级可变的模式,本文对以上功能给出了实现流程、详尽描述、和部分源代码。程序是在MicrosoftWindows7系统下,以Java为开发语言,在MyEclipse开发平台上进行游戏的设计与实现。关键词:游戏;软件工程;MyEclipse
AbstractTetrisisapopularglobaldiversificationterminalgame,enduring.ThebasicrulesofthegameTetrissimpleisrotating,moving,thegameautomaticallyrandomoutput7shapebox,therotationcanbeformedafterthe28squareshape,stackedtogether,arrangedtocompleteoneormorerowstoeliminatethescore,theintegraltoacertainextentwillautomaticallyupgradethelevelof.Thegamestartedsimple,suitableforallages,makeknowntoeveryfamily.InthispaperadetailedanalysisofthebasicrulesoftraditionalRussianbasicprinciple,onthebasisoftherealizationofinnovationmode,furtherstudyofTetris,developedaclassvariablemodelintheclassicalmodel,theabovefunctiongivestheimplementationprocess,detaileddescription,andpartofthesourcecode.ThisdesignisintheMicrosoftWindows7system,takingJavaasthedevelopmentlanguage,forgamedesignandImplementationonMyEclipseplatform.Keywords:Game;softwareengineering;MyEclipse
目录1绪论 11.1俄罗斯方块游戏的背景 11.2俄罗斯方块游戏的规则 11.3研究俄罗斯方块游戏的意义 11.4论文组织 22相关技术分析 32.1JAVA语言概述 32.2Eclipse简介 43需求分析 63.1系统需求 63.2接口控制 64系统设计 74.1软件运行和开发工具 74.2系统功能设计 74.2.1手工处理业务的基本流程 74.2.2基本流程的功能模块 95系统实现 115.1游戏主界面显示模块 115.2画布、方块显示模块 125.2.1背景画布模块设计 125.2.2预览方块模块设计 145.2.3方块移动、旋转设计 165.3控制面板模块 205.3.1菜单栏模块设计 205.3.2控制面板按钮设计 226总结 23参考文献 24致谢 25PAGE251绪论1.1俄罗斯方块游戏的背景俄罗斯方块是俄罗斯人阿列克谢•帕基特诺夫(AlexeyPazhitnov)发明。1985年6月工作于莫斯科科学计算机中心的阿列克谢·帕基特诺夫在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica60(一种计算机)为平台的俄罗斯方块的游戏。后来经瓦丁·格拉西莫夫(VadimGerasimov)移植到PC上,并且在莫斯科的电脑界传播。人们一开始并没预料到它将会有如此广泛的吸引力。实际上,在游戏发明后的数年间,俄罗斯方块成了无数场专利官司和法律纠纷的目标,而许多公司也不遗余力地上阵厮杀,想要将游戏的创意据为己有。一个最初的版本是SpectrumHolobyte为IBM兼容机开发的游戏。1988年,俄罗斯方块在街机上也变得非常流行,这归功于Atari,因为他们发布了一个能让两名玩家同时游戏的版本。俄罗斯方块经常被称为拼图游戏。玩家需要找出如何能把各块积木最好的拼在一起的方法。俄罗斯方块相当于直角的智力拼图游戏,或者其它一种“在这有限空间内组织几何体”的拼图。俄罗斯方块为了创造真正引人入胜的游戏,它巧妙的平衡了拼图游戏与动作游戏的机制。因而每个人玩这个游戏都会有一次不同的体验。俄罗斯方块所用到的一种动作游戏机制是越来越逼近的威胁感,留给玩家的时间总是非常有限。俄罗斯方块中积木是从上面落下来。如果玩家不在积木落到屏幕底下或翻转它,不能给它找一个最有利的位置,这块积木就可能会堵住某处,而它下面的几行也就没有办法拼接完整,玩家也就离游戏结束又靠近了一行或几行。在游戏进程中,积木落下来的速度越来越快,这样对玩家的挑战也就越来越大,游戏的难度也逐步增加。2014年2月22日,英国心理学家发现,减肥者通过玩俄罗斯方块,可以降低对富含脂肪的食物和零食的心理需求;尝试戒烟者的烟瘾也能得到遏制[1]。1.2俄罗斯方块游戏的规则由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束[2]。1.3研究俄罗斯方块游戏的意义在成为一个真正的游戏开发者的路上,俄罗斯方块是一个完美开始。并且,不需要艺术家般的才能就能做出非常好看的俄罗斯方块游戏。任何一个能画出方块的人每个作图形程序的人都会的就能做出商业品质的俄罗斯方块游戏。以俄罗斯方块开始还有另外一个好处,不仅能做出一个完整的既好玩又容易上瘾游戏,而且它看上来和那些商业版本没什么区别。方块就是方块,不管是谁画出它们的,而且tetraminos(俄罗斯方块中使用的形状)也不过是一些方块的组合。俄罗斯方块拥有所有游戏共通的独立成份。它有一个游戏循环(这个过程被反复执行直到游戏退出)。这个游戏循环读取玩家的输入,处理这个输入,然后更新游戏的元素(下落的tetraminos),并且检查是输还是赢[3]。以后要做的所有的简单的游戏都要用到这些东西,所以学习这个过程并且实现它是非常重要的。当第一次完成它之后,以后再做游戏时就能看出那个游戏有多难以及要花多长时间。如果没有完整的完成过这些,哪怕一次,就永远不能完整地正确领会其中的每个元素。当做大的项目时,就更不能确定其复杂性及所要的时间。如果甚至不能正确地领会这整个过程(因为你没能完成它),可能是没能建立一个合适的时间表或估计合适的时间,更有可能的是不够努力。还有,玩俄罗斯方块可以练习人的反映能力,开始时快速的下降会让人手无足措,但适应了之后就会发现自己的反应力变的很快了。其次长时间的手指活动可以让人血液流通加快有利健康。还有俄罗斯方块高手都知道要想赢,就要有远大的布局,决不能只局限于一点一点的减,这在无形中就提高了人的智慧。1.4论文组织论文全文共分为六章:第一章绪论:主要介绍了游戏的背景、规则及研究此游戏的意义。第二章相关技术分析:介绍了Java语言和开发环境Eclipse的相关知识。第三章需求分析:主要介绍了系统设计思想、功能和性能需求。第四章系统设计:主要介绍了系统的功能设计。第五章系统实现:介绍了系统的所有模块和它的功能。第六章总结:回顾开发此游戏的艰辛过程与人生感悟。
2相关技术分析2.1JAVA语言概述Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言[4],是由SunMicrosystems公司于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应用编程接口中有一个网络应用编程接口(javanet),它提供了用于网络应用编程的类库,包括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的运行环境是用ANSIC实现的。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企业应用编程接口(JavaEnterpriseAPIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库[6-7]。2.2Eclipse简介Eclipse是著名的跨平台的自由集成开发环境(IDE)[8]。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。Eclipse最初是由IBM公司开发的替代商业软件VisualAgeforJava的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(EclipseFoundation)管理。2003年,Eclipse3.0选择OSGi服务平台规范为运行时架构。2007年6月,稳定版3.3发布。2008年6月发布代号为Ganymede的3.4版[9]。Eclipse的基础是富客户机平台(RichClientPlatform,即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)EclipseWeb工具平台计划(WTP):用Java企业版Web应用程序开发工具来扩展Eclipse平台。它由以下部分组成:HTML、JavaScript、CSS、JSP、SQL、XML、DTD、XSD和WSDL的源代码编辑器;XSD和WSDL的图形界面编辑器;Java企业版的“项目性质”(projectnature)、建构器(builder)和模型(model),与一个Java企业版的导航(navigator);一个Web服务(Webservice)向导和浏览器,还有一个WS-I测试工具;最后是数据库访问查询的工具与模型。(4)Eclipse商业智能和报表工具计划(BIRT):提供Web应用程序(特别是基于Java企业版的)的报表开发工具。(5)Eclipse可视化界面编辑器计划(VEP):一个Eclipse下创建图形用户界面代码生成器的框架。(6)Eclipse建模框架(EMF):依据使用XMI描述的建模规格,生成结构化数据模型的工具和其他应用程序的代码。(7)图形化编辑器框架(GEF):能让开发者采用一个现成的应用程序模型来轻松地创建富图形化编辑器。(8)UML2:Eclipse平台下的一个UML2.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需求分析对系统的需求分析就是用户和开发人员在“系统必须做什么”这个问题上实现相互理解,达到共识,从而形成双方认可的软件产品的需求规格。这样有利于提高软件开发过程中的能见度,便于对软件开发过程的控制与管理,便于采用工程化的模式开发软件,从而达到提高软件的质量,为开发人员、维护人员、管理人员之间的交流、协作提供便捷。作为工作成果的原始依据,系统的需求分析可以向潜在用户传递软件功能、性能的需求,使其能够判断该软件是否符合自己的需求。系统随机产生7中不同形状的方块,旋转后有28种状态。方块自由下落,玩家通过键盘控制方块的移动和旋转,把方块摆放在适当的位置。如果方块落下时,有被方块填满的整行,则该行可消去。每消去一行,玩家得分增加10分,每满50分,玩家等级增加一级。若由存在空格的方块填满整个窗口,则游戏宣告失败。游戏功能需求如下:游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的默认背景色是灰色,主界面方块默认用浅绿色,预显方块颜色默认为红色。背景色、前景色对比鲜明,以达到让玩家眼前一亮的感觉,并能在游戏达到高等级状态,方块下落速度渐高的情况下使玩家能够清楚的分辨出下落方块的形状,增加游戏的刺激性。游戏形状需求:用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型一共7种形状的向4个方向的旋转变形,各个方块要能实现它的任意变形,可设为顺时针变形或逆时针变形,一般为逆时针变形。方块的可否翻转需要加以判断,以防止其翻转越界。键盘处理事件需求:方块下落时,可通过键盘方向键(上键、下键、左键、右键)向上(旋转变形)、向下(加速下落)、向左移动、向右移动。鼠标处理事件需求:通过点击菜单栏中相应的菜单项或控制面板内的按钮,可以实现游戏的开始、结束、暂停、继续、提高等级、降低等级,预显方块形状的显示,分数、等级的显示,以及游戏帮助等功能。显示需求:当方块填满一行时可以消行,剩余未填满的行逐次向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。当方块充满主界面的每一行,方块不能再下落时,提示“亲!你输了!”的字样。非功能性需求:本系统非功能性需求包括游戏主界面窗口尺寸可调整性需求、游戏运行时主界面弹出位置居中需求等。本游戏通过键盘和鼠标进行操作,在Windows的操作系统下,利用键盘的按键对方块进行移动、变形,要使用到键盘的接口事件。游戏使用鼠标对游戏进行全程控制,如游戏的开始、暂停、继续、查看游戏帮助、更改游戏等级等,通过对鼠标单击、按键添加监听事件,编辑相应代码来实现相应功能。
4系统设计操作系统:MicrosoftWindows7内存:2G硬盘:500GCPU:Intel(R)Core(TM)i3-2310M交互工具:键盘、鼠标显示器:VGA显示器JDK版本:jdk1.7Eclipse版本:MyEclipse4.3.0SDK-3.4.1-win644.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类画布类的构造函数rowsint,画布的行数colsint,画布的列数行数和列数决定着画布拥有方格的数目*/privateclassShowBeforePanelextendsJPanel { privateColorbackColor=Color.darkGray,frontColor=Color.red; privateErsBox[][]boxes=newErsBox[ErsBlock.boxes_rows][ErsBlock.boxes_cols];privateintstyle,boxWidth,boxHeight; privatebooleanisTiled=false; publicShowBeforePanel() { for(inti=0;i<boxes.length;i++) { for(intj=0;j<boxes[i].length;j++) boxes[i][j]=newErsBox(false); } }//画布类的构造函数 publicShowBeforePanel(ColorbackColor,ColorfrontColor) { this(); this.backColor=backColor;//背景色 this.frontColor=frontColor;//前景色 } publicvoidsetStyle(intstyle) { this.style=style; repaint(); } publicvoidpaintComponent(Graphicsg) { super.paintComponent(g); if(!isTiled) fanning(); intkey=0x8000; for(inti=0;i<boxes.length;i++) { for(intj=0;j<boxes[i].length;j++) { Colorcolor=(((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种样式。publicfinalstaticint[][]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()方法可以合法地对该类实例进行按字段复制。方块的操作类BlockOperation继承Thread类,重写run()方法,以实现方块的动态正确下落。当然,在线程中要判定方块是处于moving状态还是pausing状态。 publicvoidrun() { while(moving)//判定方块是否在动态下落 { try { sleep(betweenleveltime *(ErsBlocksGame.maxlevel-level+flatgene)); }catch(InterruptedExceptionie) { ie.printStackTrace(); } if(!pausing)//判定游戏是否处于暂停状态 moving=(moveTo(y+1,x)&&moving);是在等待的100毫秒间,moving没被改变 } }当然,在游戏中还要判定方块移动的边界问题,比如,一个方块在它左边正好差一个格子的空间才能够翻转,但是它的右边恰好有一个格子的空间,这种情况,如果方块不能够翻转,就不方便用户操作,如果能够翻转,就会发生越界,将已经存在的方块挤占掉。要想实现翻转又不发生越界,那么,就应该在方块翻转后把它往右边移动一个格子,然后再绘制方块,这样,方块就不会挤占掉其它已经固定住的方块了,以下解决越界问题。1>方块翻转判定在两种情况可能发生越界,一种是方块落下去固定住以后,第二种是周围的空间不允许它进行翻转。第一种情况只需要参考方块落下去后不能够再移动的判定即可。对于第二种情况,在每次方块翻转前,必须首先计算出方块周围的空间,如果空间允许则翻转。否则,不能翻转。因为七种方块是不规则的,每种方块要求的翻转空间都是不一样的,甚至是在它的不同翻转状态下,所要求的翻转空间也是不一样的,首先想到的自然就是为每一种方块,方块的每一种状态都写一个判定条件,但是这样做未免过于麻烦。根据观察,不难发现,七种形态的方块,长条形的方块如果以横条的形态下落,则只要能够下落,就能翻转,如果以竖条的形态下落,那么它翻转后所处的位置必须要有4x1个格子的空间才能够翻转。对于田字形的方块,只有能够继续下坠,就一定能够翻转,所以田字型的方块只要没有落下,就一直能够翻转。而其它五种形态的方块,又有一个共同点,就是它们都有两种翻转状态横向占三个格子的空间,竖直方向占两个空间,另外两种翻转状态横向占两个格子的空间,竖直方向占三个格子空间,如果他们是以横向占三个格子的状态下落,那么只要能下落,就一定能够翻转,如果是以横向两个格子的状态下落,那么在翻转后,周围必须要有3x2个格子的空间。所以,方块翻转的判定,要分三种情况,第一种情况是方块落下去后不能翻转;第二种情况是对竖直状态出现的长条形的方块进行翻转判定;第三种情况是对除长条形和田字形之外的其它五种以横向占两个格子的状态出现的方块进行翻转判定。何种情况下方块能够翻转的问题解决了,接下来,我们就应该解决方块翻转后所处的位置的问题了,因为只有事先知道方块翻转后所处的位置,才能够对那个位置的空间范围进行判定,判定它是否能够容纳方块。可以确定的是,无论方块怎么翻转,都处在方块数组中,也就是说方块必定是在游戏地图中某一4x4个格子的空间范围内。方块数组在游戏主界面中的坐标是确定的,不确定的是方块翻转后到底处在方块数组的哪个位置,为了解决这个问题,我们可以限定方块在方块数组中的存储原则是靠左、靠上,这样,无论翻转怎么翻转,方块数组中第一行和第一列都是有方块的,这样也就确定了方块在方块数组中的位置,也就可以得知方块翻转后在游戏地图中的位置了。假定方块数组的横纵坐标是x和y,那么,这个位置就是,长条形的方块翻转后所处的那一行是游戏地图的第y行,所占的列是第x到x+3列,长条形和田字形以外的五种方块翻转后的所占的行数是游戏地图的第y和第y+1行,所占的列是第x到x+2列。所以,如果以上空间有空格子,方块就能够翻转。2>翻转越界纠正只要方块翻转后所处的空间足够,方块就能够翻转,但是,如果方块翻转后所处的空间不足够,而在它的另一边却有足够的空间呢?方块在边界处时,翻转后不仅可能翻出地图外,还可能发生数组越界,当然,只需要将地图数组定义得大一些,就能够避免数组越界错误,对于方块越界,如果在它的另一边有足够空间,那么,就应该把方块往另一个方向移动适当的单位,纠正方块越界错误。如图5-10方块翻转流程图所示,方块翻转需要经三次判定:是否已经下落到底部、翻转后是否有足够空间、翻转后是否越界。
结束结束开始接收到翻转信息方块是否落下翻转后是否有足够空间翻转后是否越界翻转越界纠正不能翻转不能翻转直接翻转是否否否是是图5-10方块翻转处理流程图玩家操作键盘实现方块的移动、旋转,代码引进ControlKeyListener类继承KeyAdapter类进行键盘监听功能的实现。KeyAdapter类继承自Object类,实现\o"java.awt.event中的接口"KeyListener接口,用来接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。扩展此类即可创建KeyEvent侦听器并重写所需事件的方法,即是ControlKeyListener类。使用ControlKeyListener可创建侦听器对象,然后使用组件的addKeyListener方法向该组件注册此侦听器对象。当按下、释放或键入某个键时,将调用该侦听器对象中的相应方法,并将KeyEvent传递给相应的方法。实现代码如下:privateclassControlKeyListenerextendsKeyAdapter { publicvoidkeyPressed(KeyEventke) { if(!game.isPlaying()) return; ErsBlockblock=game.getCurBlock(); switch(ke.getKeyCode()) { caseKeyEvent.VK_DOWN://处理下键 block.moveDown(); break; caseKeyEvent.VK_LEFT://处理左键 block.moveLeft(); break; caseKeyEvent.VK_RIGHT://处理右键 block.moveRight(); break; caseKeyEvent.VK_UP://处理上键转换 block.turnNext(); break; default: break; } } }5.3.1菜单栏模块设计菜单栏中有“游戏”、“控制”、“帮助”四个菜单选项。“游戏”选项又分“新游戏”、“提高级数”、“降低级数”、“退出”四个选项。“控制”选项分“开始”、“暂停”、“重新开始”、“停止”。“帮助”选项分“方块控制键”。相关截图如图5-11、图5-12、图5-13所示。图5-11菜单栏“游戏”选项图5-12菜单栏“控制”选项图5-13菜单栏“帮助”选项1>“新游戏”的按钮功能为实现游戏画布的重新绘制,类似reset的功能。该按钮的监听实现代码如下: miNewGame.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventae) { stopGame();//停止游戏 reset();//让游戏“复位”到初始状态 setLevel(initlevel);//设置游戏难度 } });2>“提高等级”、“降低等级”按钮用来手动调节游戏的等级,从而改变方块下落的速度。“退出”按钮控制游戏随时退出,终止游戏。3>“控制”选项的“开始”子选项控制游戏的开始,点击按钮,方块开始下落。4>“帮助”按钮中“方块控制键”选项,点击可弹出对话框显示游戏帮助信息。5.3.2控制面板按钮设计本游戏控制面板中包含得分统计、等级统计等字段,其中的TextField控件均由游戏本身统计给出,玩家不能私自编辑。本游戏的游戏规则为每消一行得10分,每增加50分上升一个等级,初始得分为0,初始等级为1。以下给出得分、等级更新字段的代码:publicsynchronizedvoidremoveLine(introw)绘制方块 { for(inti=row;i>0;i--) { for(intj=0;j<cols;j++) boxes[i][j]=(ErsBox)boxes[i-1][j].clone(); } score+=ErsBlocksGame.alinescore;//每次消行加10分 scoreForLevelUpdate+=ErsBlocksGame.alinescore;//等级更新 repaint();//重绘画布 }控制面板中按钮的功能在5.3.1中已给出代码,在此不再赘述。
6总结此次毕业设计让我明白“纸上得来终觉浅,绝知此事要躬行”的道理。在这次的学习过程中,我遇到了很多的困难与挫折,是我人生的一次历练。本文的程序设计借鉴了参考书籍和互联网上相关程序的设计思想,在此对相关网站的提供者表示衷心的感谢。这次用java来设计俄罗斯方块游戏还是有一些难度的,由于本人实践经验较少,在知识和经验方面都存在着不足,而且有些功能也未能按所要求的去实现,存在不少的错误。另外,在整个开发的过程中,时间也比较仓促,因此本论文许多地方仍有一些缺陷。而且每个问题的解决办法不止一种,当然本游戏开发亦是如此,我们可以采用各种不同的语言开发本游戏,进行进一步对比,从而让我们更好的了解并掌握各种语言编程的优缺点。通过这次的历练,我逐步学习了实现俄罗斯方块的具体步骤,相信学习的道路永无止境,这次的毕业设计对我的人生道路也会有非常深刻的积极影响。
参考文献[1]心理学家称玩俄罗斯方块有助于减肥戒烟.新华网.(引用日期2014-06-01)[2]综述:俄罗斯方块25年.新华网.(引用日期2014-06-[3]高凌琴陈青华.俄罗斯方块游戏关键技术探讨[J].信息技术与信息化讨,2008年第二期[4]朱福喜.《java语言基础教程》.学出版社;第一版(2008年4月1日)[5](美)RogersCadenhead.《Java编程入门经典》.梅兴文译.第4版.北京:人民邮电出版社,20072[6]邦杰.《彻底研究java》.北京:电子工业出版社,2002年[7]美BruceEckel.《ThinkingInJava》.英文第4版.北京:机械工业出版社,2007[8]卫琴,科技产品研发中心.《Java面向对象编程》.北京:电子工业出版社,2006.7[9]广吉.Java程序设计实例教程[M].北京:冶金工业出版社,2007年[10]美HerbertSchidt.《Java参考大全》.鄢爱兰.鹿江春译.北京:清华大学出版社,2006[11]栾阳.《Java技术在图像处理领域的应用研究》.学术期刊.《电脑学习》
2009年5期
致谢在这次毕业设计制作和毕业论文写作过程中,陈晨老师在论文写作过程、相关专业知识的指导等方面,给予了我大力的支持和帮助。同时向四年来教我知识、育我成长的河北农业大学现代科技学院的全体教师致以最衷心的谢意!由于我的学识有限,加之时间仓促,文中不免有错误和待改、不足之处,真诚欢迎各位师长、同学提出宝贵意见。我会以身作则,严于律己、奋勇拼搏,以母校为荣,走出一条属于自己的阳关大道。最后,祝愿所有的教师和同学们,愿你们身体健康,工作顺利!目录TOC\o"1-2"\h\u253321总论 1311911.1项目概况 1317891.2建设单位概况 3162241.3项目提出的理由与过程 3311231.4可行性研究报告编制依据 4225921.5可行性研究报告编制原则 426521.6可行性研究范围 5265791.7结论与建议 665262项目建设背景和必要性 9302042.1项目区基本状况 9237942.2项目背景 11327472.3项目建设的必要性 11265903市场分析 14297233.1物流园区的发展概况 1479553.2市场供求现状 1669963.3目标市场定位 17108883.4市场竞争力分析
17160544项目选址和建设条件 1950564.1选址原则 1969314.2项目选址 19544.3场址所在位置现状 19297334.4建设条件 20123545主要功能和建设规模 22282555.1主要功能 22281835.2建设规模及内容 26195696工程建设方案 27137726.1设计依据 27219396.2物流空间布局的要求 27262516.3空间布局原则 2853886.4总体布局 2936766.5工程建设方案 30235856.6给水工程 33115596.7排水
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理职业安全与防护措施
- 护理礼仪的礼仪实践
- 护理励志教育:构建和谐医患关系的桥梁
- 压力管理与睡眠改善
- 快消品行业技术顾问的招聘面试流程介绍
- 零售业客户服务流程优化实践
- 零售业财务管理实务与面试要点详解
- 联想电脑技术支持面试技巧
- 连锁便利店会计系统分析及运营要务面试全攻略
- 快消品行业财务审计岗位面试要点
- 休克诊疗规范课件
- 2025年新生儿窒息复苏试题及答案
- 20万吨-年采矿废石综合回收利用项目环境影响报告书
- (一诊)2026年兰州市高三模拟考试历史试卷(含答案)
- 2026贵州安顺关岭恒升村镇银行春季招聘4人考试参考题库及答案解析
- 企业内部福利待遇制度
- 步进电机及其工作原理
- 护理查房慢性肾脏病5期护理查房
- 公差分析高级
- 热风循环烘箱验证方案及报告
- 中学教师职称晋升(中学英语)专业考试说明书及试卷
评论
0/150
提交评论