毕业论文-使用JavaGUI开发俄罗斯方块游戏_第1页
毕业论文-使用JavaGUI开发俄罗斯方块游戏_第2页
毕业论文-使用JavaGUI开发俄罗斯方块游戏_第3页
毕业论文-使用JavaGUI开发俄罗斯方块游戏_第4页
毕业论文-使用JavaGUI开发俄罗斯方块游戏_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

太原理工大学毕业设计(论文)用纸 ii使用JavaGUI开发俄罗斯方块游戏摘要俄罗斯方块是一款十分经典的游戏,它的主要运行规律为对系统随机产生的图形进行上下左右移动、旋转等操纵,使之排列成完整的一行或多行并且消除得分。它上手容易,难度循序渐进,老少皆宜,深入人心,标志着一代人的童年。同时以俄罗斯方块为基础由衍生出了很多种应用,因此进行俄罗斯方块的设计十分必要。本文遵循设计流程,通过系统分析与设计,系统实现以及系统测试与发布三个阶段实现游戏设计。关键词:俄罗斯方块开发;游戏编程;程序开发

UsingJavaGUIdeveloptetrisgameAbstractTetrisisaveryclassicgame,themainrunningrulesisthatitcangeneratetherandomsystemgraphicsmakethenextmovearound,rotatingmanipulation,canbearrangedintooneormorerowsandeliminatescores.Itiseasytouse,difficultstepbystep,ages,winsupportamongthepeople,markedthefirstgenerationofchildhood.AtthesametimeinTetrisbasedbyderivedfrommanyapplications,soitisverynecessarytodesign.Thispaperfollowsthedesignprocess,throughthesystemanalysisanddesign,systemrealizationandsystemtestingandreleaseofthreestagesofgamedesign.KeyWords:Tetrisdevelopment;gameprogramming;programdevelopmen太原理工大学毕业设计(论文)用纸

目录摘要 iAbstract ii1绪论 11.1研究背景 11.2java简介 11.3JavaGUI编程简介 31.4开发环境搭建 52系统分析与设计 72.1程序设计思想 72.2设计分析 82.3主要功能 92.4游戏的操作流程 93游戏实现 113.1游戏设计的具体实现 113.1.1游戏界面的设计实现 113.1.2俄罗斯方块的造型 113.1.3俄罗斯方块的旋转 123.1.4方块的运动和自动消除满行的方块 123.1.5游戏速度和游戏级别自由选择 133.1.6游戏得分的计算和游戏菜单的编辑 143.2游戏区域涉及的数据结构 143.2.1游戏区域 143.2.2基础小砖块 143.2.3下坠物的数据结构算法 143.2.4下坠物形状和状态的随机出现 153.2.5游戏的实现算法设计 153.3下坠物的关键代码示例 153.3.1游戏结束的判断 153.3.2游戏下坠物是否已落到底,停止下落的判断 163.4游戏运行 174系统测试和发布 214.1测试环境 214.2测试遇到的问题 214.3程序发布 21结论 23参考文献 24致谢 25外文原文 26外文文献翻译 34PAGE381绪论1.1研究背景电脑游戏软件的出现使计算机应用的世界更加绚丽多彩,然而游戏开发领域因涉及程序设计、图形图像、动画、音频等多方而技术而长期以来使很多电脑爱好者望而却步,更不适合一般的院校课堂教学。经典的俄罗斯方块游戏却是一个特例,它规则简单,所有人都比较熟悉,而且涉及到键盘控制、计时功能、图形的绘制以及其他逻辑问题,是一个比较综合而相对难度不很大的游戏,很适合初学者学习计算机程序开发技术,锻炼自己的动手能力。1.2java简介Java是由SunMicrosystems公司于1995年5月推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。由JamesGosling和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序。用Java实现的HotJava浏览器(支持Javaapplet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。另一方面,Java技术也不断更新,在2010年Oracle公司收购了SUN。标志着Java可以更好地被发挥出它的价值。在Oracle收购后的第二年,也就是2011年7月28日,甲骨文发布java7.0的正式版。2014年3月19日,甲骨文公司发布java8.0的正式版。为java增添了许多新功能。与传统程序不同,Sun公司在推出Java之际就将其作为一种开放的技术。全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。Java语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。Sun公司对Java编程语言的解释是:Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。Java平台是基于Java语言的平台。这样的平台非常流行。因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。Java是功能完善的通用程序设计语言,可以用来开发可靠的、要求严格的应用程序。Java分为三个体系JavaSE(J2SE)(Java2PlatformStandardEdition,java平台标准版),JavaEE(J2EE)(Java2Platform,EnterpriseEdition,java平台企业版),JavaME(J2ME)(Java2PlatformMicroEdition,java平台微型版)。JavaSE:以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。JavaSE包含了支持JavaWeb服务开发的类,并为JavaPlatform,EnterpriseEdition(JavaEE)提供基础。JavaEE:这个版本以前称为J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java应用程序。JavaEE是在JavaSE的基础上构建的,它提供Web服务、组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构(service-orientedarchitecture,SOA)和Web2.0应用程序。JavaME:这个版本以前称为J2ME,也叫K-JAVA。JavaME为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。JavaME包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于JavaME规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。笼统的讲,可以这样理解:J2SE是基础;压缩一点,再增加一些CLDC等方面的特性就是J2ME;扩充一点,再增加一些EJB等企业应用方面的特性就是J2EE。补充一点J2EE更恰当的说,应该是JAVA2企业开发的技术规范,不仅仅是比标准版多了一些类。J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。J2SE商业版本,标准版本(Java2StandardEdition)定位在客户端,主要用于桌面应用软件的编程。J2SE包含那些构成Java语言核心的类。比如:数据库连接、接口定义、输入/输出、网络编程。J2SE是J2EE的基础,他大量的JDK代码库是每个要学习J2EE的编程人员必须掌握的。可以把Configuration当作是J2SE对于两种类型嵌入式装置的规格,而这些规格之中定义了这些装置至少要符合的运算能力、供电能力、记忆体大小等规范,同时也定了一组在这些装置上执行的Java程序所能使用的类别函式库、这些规范之中所定义的类别函式库为Java标准核心类别函式库的子集合以及与该型态装置特性相符的扩充类别函式库。比方就CLDC的规范来说,可以支援的核心类别函式库为java.lang.*、java.io.*、java.util.*,而支援的扩充类别函式库为java.microedition.io.*。区分出两种主要的Configuration之後,J2SE接著在定义出Profile的概念。Profile是架构在Configuration之上的规格。之所以有Profile的概念,是为了要更明确地区分出各种嵌入式装置上Java程序该如何开发以及它们应该具有哪些功能。因此Profile之中定义了与特定嵌入式装置非常相关的扩充类别函式库,而Java程序在各种嵌入式装置上的使用者介面该如何呈现就是定义在Profile里头。Profile之中所定义的扩充类别函式库是根据底层Configuration内所定义的核心类别函式库所建立。与J2ME和J2EE相比,J2SE总体的的运行环境和目标更加多样化,但其中每一种产品的用途却更为单一,而且资源限制也更加严格。为了在达到标准化和兼容性的同时尽量满足不同方面的需求,J2SE的架构分为Configuration、Profile和OptionalPackages(可选包)。它们的组合取舍形成了具体的运行环境。Configuration主要是对设备纵向的分类,分类依据包括存储和处理能力,其中定义了虚拟机特性和基本的类库。已经标准化的Configuration有-ConnectedLimitedDeviceConfiguration(CLDC)和ConnectedDeviceConfiguration(CDC)。Profile建立在Configuration基础之上,一起构成了完整的运行环境。它对设备横向分类,针对特定领域细分市场,内容主要包括特定用途的类库和API。CLDC上已经标准化的Profile有MobileInformationDeviceProfile(MIDP)和InformationModuleProfile(IMP),而CDC上标准化的Profile有FoundationProfile(FP)、PersonalBasisProfile(PBP)和PersonalProfile(PP)。可选包独立于前面两者提供附加的、模块化的和更为多样化的功能。目前标准化的可选包包括数据库访问、多媒体、蓝牙等等。1.3JavaGUI编程简介1.AWTAWT(AbstractWindowingToolkit)是Java提供的用来建立和设置Java的图形用户界面的基本工具。AWT是Java的平台独立的窗口系统,图形和用户界面器件工具包。AWT是Java基础类(JFC)的一部分,为Java程序提供图形用户界面的标准API。AWT由Java中的java.awt包提供,里面包含了许多可用来建立与平台无关的GUI的类,这些类被称为组件(components)。AWT提供给应用程序独立于机器平台的接口,保证了同一程序的GUI在不同机器上运行具有类似的外观(不一定完全一致)。AWT提供GUI编程的功能包括:用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。在Java2中,AWT很大程度上被Swing替代。Swing通过自己绘制器件而避免了AWT的种种弊端。Swing调用本地图形子系统中的底层例程,而不是依赖操作系统的高层用户界面模块。目前几乎看不到AWT在GUI上的应用了。2.SwingSwing是一个用于开发Java应用程序用户界面的开发工具包。它以AWT为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event。相对于AWT,Swing是轻量级元件。Swing提供许多比AWT更好的屏幕显示元素,它们用纯Java写成,所以同Java本身一样可以跨平台运行。它们支持可更换的主题(各种操作系统默认的特有主题)。但Swing不是真的使用原生平台提供的设备,而是仅仅在表面上模仿,这意味着你可以在任意平台上使用JAVA支持的任意观感。轻量级元件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。通常用Swing开发GUI需要以下几个步骤:1)导入Swing包,2)选择界面风格,3)设置顶层容器,4)设置按钮和标签,5)将组件放到容器上,6)为组件增加边框,7)处理事件。图形界面至少要有一个顶级Swing容器。顶级容器为其他Swing组件在屏幕上的绘制和处理事件提供支持。常用的顶级容器:1)JFrame(框架):表示主程序窗口。2)JDialog(对话框):每个JDialog对象表示一个对话框,对话框属于二级窗口。3)JApplet(小程序):在浏览器内显示一个小程序界面。3.SWTSWT(StandardWidgetToolkit)是一个开源的GUI编程框架,与AWT/Swing有相似的用处,著名的开源IDE-eclipse就是用SWT开发的。SWT框架通过JNI来访问原生窗口部件。如果在宿主(host)平台上无法找到一个窗口部件,SWT就会自动地模拟它。SWT以方便有效的方式提供了便携式的(即WriteOnce,RunAway)带有本地操作系统观感的UI组件。SWT最大化了操作系统的图形构件API,就是说只要操作系统提供了相应图形的构件,SWT只是简单应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。SWT多用于Java桌面应用的开发,很少用于applet。所有的SWT类都用org.eclipse.swt做为包的前缀,最常用的图形构件基本都被包括在org.eclipse.swt.widgets包中,比如Button,Combo,Text,Label,Sash,Table等等。其中两个最重要的构件当数Shell和Composite。Shell相当于应用程序的主窗口框架。Composite充当着构件容器的角色,当我们想在一个窗口中加入一些构件时,最好到使用Composite作为其它构件的容器,然后再去org.eclipse.swt.layout包找出一种合适的布局方式。SWT对构件的布局也采用了AWT和Swing中Layout和LayoutData结合的方式,在org.eclipse.swt.layout包中可以找到四种Layout和与它们相对应的布局结构对象(LayoutData)。在org.eclipse.swt.custom包中,包含了对一些基本图形构件的扩展。SWT主要利用类似于Windows程序设计中的消息循环的方法来处理事件。就是反复的读取和分派(dispatch)事件,并在没有事件的时候把控制权还给CPU。SWT需要显示释放资源。利用display.dispose();在组件结束其功能后释放它。资源的释放遵循以下两条规则:1)如果你创建了某个资源,那么你就有责任释放它。2)释放父组件资源的同时也释放了其子组件的资源。4.AppletGUI开发用AWT开发的applet继承自java.applet.Applet。用Swing开发的applet继承自java.applet.Applet的子类javax.swing.JApplet。JApplet完整的继承关系如下:javax.swing.JApplet->java.awt.Applet->java.awt.Pannel->java.awt.Container->java.awt.Component->java.Object。由于JApplet继承自Pannel,所以applet窗口本身就是一个pannel,可以用来画图或放置元件。在Java中每个applet都是由Applet的子类来实现。applet通过重载Applet的几个主要成员方法完成小应用程序的初始化、绘制和运行。这些方法是init()、start()、paint()、stop()和destory()。一个applet的生命周期与Web页面有关。当首次加载含applet的页面时,浏览器调用init()方法,完成applet的初始化。然后调用start()方法启动程序,paint()用于在start()之后绘制小程序中的各个组件。当离开页面时,浏览器调用stop()方法停止小程序运行。若用户关闭浏览器将使applet停止运行,浏览器调用destory()方法终止,使小应用程序有机会释放其存在期间锁定的资源。只要用户不关闭浏览器,重新加载页面,浏览器则只调用start()方法重新运行小程序。以上几个方法并不需要程序员完全实现,在一个applet的生命周期我们只需要在中需要的时刻将自己的代码添加到对应的方法中就可以了,通常加载信息等在init()方法中,删除释放信息在destroy()方法中。另外,init()方法中的代码也可以在applet的无参构造方法中实现,效果相同。5.Graphics类Graphics类是所有图形的抽象基类,允许应用程序可以在组件上绘制图形。下面介绍一个最简单的调用Graphics类绘制图形的applet程序的例子。importjavax.swing.JApplet;importjava.awt.Graphics;publicclassHelloAppletextendsJApplet{publicvoidpaint(Graphicsg){g.drawLine(40,30,100,30);g.drawLine(40,60,100,60);g.drawString("HelloApplet2",50,50);}}在这个applet程序中,只实现了paint()方法用于绘制图像。由于applet窗口本身就是一个panel,所以可以直接用Graphic类的实例来添加组件。可以将java.awt.Graphics支持的非特性方法划分为三个常规类别之下:1)跟踪形状轮廓的绘制方法:draw3DRect()//绘制3D矩形;drawArc()//绘制圆的角度;drawBytes()//绘制byte数组给定的文本;drawChars()//绘制char数组给定的文本;drawImage()//绘制图像;drawLine()//绘制直线;drawOval()//绘制椭圆型框;drawPolygon()//绘制多边形;drawPolyline()//绘制折线;drawRect()//绘制矩形;drawRoundRect()//绘制圆角矩形;drawString()//绘制指定迭代器给定的文本。2)填充形状轮廓的绘制方法:fill3DRect()fillArc()fillOval()fillPolygon()fillRect()fillRoundRect()此类方法绘制出的图形为实心的,形状用法与第一类相同。3)诸如translate()之类的其他方法,可以将图形环境的起点从其缺省值(0,0)变成其它值。6.ApplicationGUI开发ApplicationGUI开发所遵循的原则与Applet是一致的。区别在于ApplicationGUI需要自己指定一层层的容器,并需要选择好合适的布局管理器。此外,Application需要main()方法才可以运行。其他未及事项:以上介绍的GUI开发都是静态的,不涉及交互部分。在JavaGUI开发中,交互部分采用的方式成为事件驱动(Event-Driven),具体来说就是对每一个可能产生交互信息的组件设置一个事件监听器(ActionListener)。1.4开发环境搭建想要使用Java开发程序,必须安装Java开发工具箱(JDK),现在JDK版本已经更新到8.0了,但是在软件行业,最新版的东西不一定好,稳定才是王道。所以下载了JDK6.0环境进行开发。直接运行下载的JDK安装文件jdk-6u25-windows-i586.exe,按照提示指引进行安装。其中中途有选择JRE的安装,也一并安装了。JDK是Java的开发平台,在编写Java程序时,需要JDK进行编译处理;JRE是Java程序的运行环境,包含了JVM的实现及Java核心类库,编译后的Java程序必须使用JRE执行。在下载的JDK安装包中集成了JDK与JRE,所以在安装JDK过程中会提示安装JRE。开发工具有好多种,当今最流行的是Eclipse、Myeclipse、IntelliJ、Jbuilder、Jdeveloper、Netbeans、JCreator等。我选择Eclipse工具开发本俄罗斯方块。Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentKit,JDK)。

2系统分析与设计2.1程序设计思想游戏作为人们日常生活的一个重要的娱乐项目,也带动了巨大的游戏相关产业市场的发展。游戏平台从游戏机、电视游戏,到pc游戏,到电脑游戏,中间经历了很多的技术的变革。随着新技术的发展和人们生活水平的提高,电脑开始逐渐普及,电脑以其小巧便捷,方便的特性成为人们的必备通讯工具。而基于电脑平台的电脑游戏也就拥有了巨大的市场空间,随着3g的开通和应用,电脑游戏必将迎来新的一轮游戏热潮。游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景,设置了过关升级的功能,激发大家的娱乐激情。从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if语句对分数判断,达到一定的积分就可以升级到下一个档次。俄罗斯方块游戏设计的主要步骤为以下方面:(1)游戏界面的设计。(2)俄罗斯方块的造型。(3)俄罗斯方块的旋转。(4)俄罗斯方块的运动情况(包括向左,向右和向下)。(5)俄罗斯方块的自动消行功能。(6)游戏级别的自由选择。(7)游戏速度的自由选择。(8)游戏得分的计算。(9)游戏菜单选项的设计及功能实现。程序流程图如下图2-1所示:图2-1程序流程图程序流程图描述了点击游戏开始后程序运行情况。2.2设计分析随机给出不同的形状(长条形、z字形、反z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,速度变快,若在游戏中各形状填满了给定区域,则为输者。本文涉及的方块有七种,分别如下图2-1所示:图2-2俄罗斯方块7中方块每种方块本质上为4个小方块组成的正方形。总共有7种,比如有“田”字形,Z字形的等等。每种方块有四种旋转变化,每种方块只有一个D。因为对于一种方块来说,其颜色是固定的。每种方块又可以通过旋转而变化出1到4种形状。键盘处理事件:方块下落时,可通过游戏提供的控制按键对该方块进行变形、加速、向左、向右移动等操作。显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。2.3主要功能我们开发的俄罗斯方块游戏,主要实现了以下几种功能: 1.可以灵活控制方块在图形框中运动。 2.游戏过程中方块可以自由旋转。 3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。 4.游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,生成的行数由你来选择,每行至少产生5个以上的无规律方块,这样增加了游戏难度,对于游戏高手来说,无疑不是一个新的挑战。 5.游戏的得分支持积分,并且按照公式:得分=(100+(10*(同时消除的行数–1)))*同时消除的行数,这样,你同一时间消除的行数越多,你的得分也就越高,当游戏积分到了一定时可以自动升级,这个升级指速度升级。 6.游戏中提供了一个漂亮的场景,给你带来无限激情。2.4游戏的操作流程用户在启动后,即进入游戏主画面,屏幕开始显示为欢迎画面。用户按下[开始]按钮后,就可以开始玩游戏。当用户想暂停时,再次按一下[开始]按钮,游戏就暂停了,在暂停的情况下再按[开始]按钮,游戏继续运行。任何时候按[退出]按钮,游戏都会终止如图2-3所示。图2-3操作流程图

3游戏实现3.1游戏设计的具体实现在我的努力下,此次设计,终于能够圆满完成。由于时间的紧促,在设计中,也许会有一些考虑不周之处,但其功能已经能够满足大多用户的需求,相信假以时日,一定能做出一个更经典,更完美的俄罗斯方块游戏,下面我将对每一步的具体如何实现展示给大家。3.1.1游戏界面的设计实现俄罗斯方块游戏的游戏界面如图3-1所示。图3-1俄罗斯方块界面界面简洁明了,点击开始即可运行程序。3.1.2俄罗斯方块的造型相信朋友们都玩过俄罗斯方块,对这个游戏的玩法和方块形状都比较熟悉。我们这个游戏只选择了最基本的7中造型,包括长条型,正方型,正S型,反S型,正7型,反7型,T型。如果需要我们可以添加更多的造型。将游戏界面的游戏区图片框分割成10*20的小块,每个小块放置一个jbutton控件,预览区图片框按同样比例分割成4*4的小块,同样有jbutton控件构成,我们可以把预览区图片框看作是从游戏区图片框中选取的一个部分,游戏区的小方块编号和预览区编号如下表:表3-1游戏区编号0123456789……………………90919293949596979899表3-2预览区编号3456131415162324252633343536利用Select将方块的7中造型列出,比如长条型的设计,在欲览区中分别有和5四个方块构成两中形态,用数组为:m(0)=3:m(1)=4:m(2)=5:m(3)=6:situation2=0m(0)=5:m(1)=15:m(2)=25:m(3)=35:situation2=1将它的形状编号为0和1,在后面方便调用,其他的方块造型同样的方法。3.1.3俄罗斯方块的旋转俄罗斯方块的旋转主要将方块的位置加以变换得到的,例如上述范例,长条型有两中样式,根据小方块的编号变动来实现整个造型的旋转,比如: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},//方块的四种状态};方块的造型在旋转的时候存在一个公式,当然首先要判断是否满足旋转的要求,以上是一个长条型由横着变成竖立状态的旋转,我们以它的造型中的第三个小方块n(3)为中心旋转,这样,在开始运动的时候,长条形要发生旋转最少要运动到第三行,才能由横着变成竖立状态,游戏区图形框中第三行的第一个方块的编号为20,所以长条造型的第一个小方块的编号n(0)必须要大于20。同样,长条型方块在下落到底部的时候也有限制。如果长条下落到最后一行也将无法由横着变成竖立状态。3.1.4方块的运动和自动消除满行的方块我的这个俄罗斯方块游戏主要是利用jbutton控件的visible属性完成效果的,其实在游戏区图形框可以看成是由许多的jbutton小方块组成,方块运动的过程就是造型里方块显示或者隐藏,就像现在的霓虹灯效果一样,由时钟控件控制visible属性改变的速度,上一层的消失,下一层的显示,这样,从视觉效果可以看到方块的下落运动效果。方块在下落的过程中会自动判断每一行方块的visible属性,如果全部为true时,就会将这一行小方块的visible属性全部变成false,在将上面的小方块向下移动,利用for语句进行循环判断,将所有这样情况的行改变小方块visible属性。当有多行同时出现这样情况时使用递归调用,实现连续消行。具体程序代码如下:publicRussiaBlock(inty,intx,intlevel,intstyle){this.y=y;this.x=x;this.level=level;moving=true;pausing=false;this.style=style;canvas=GameCanvas.getCanvasInstance();boxes=newRussiaBox[ROWS][COLS];intkey=0x8000;for(inti=0;i<boxes.length;i++)for(intj=0;j<boxes[i].length;j++){booleanisColor=((style&key)!=0);boxes[i][j]=newRussiaBox(isColor);key>>=1;}display();}3.1.5游戏速度和游戏级别自由选择游戏速度的自由选择无非就是改变时钟控件的频率,我们在菜单中添加了选择速度的功能,还有添加了考验功能,将欲览窗中的方块造型隐藏,给玩家提高了难度,如果你不愿意接受考验也可以点击显示还原成原来状态。游戏级别的自由选择是让用户选择游戏开始时候,游戏区底部出现一定行数的随机方块,同样给玩家增加了难度,功能代码如下:publicvoidrun(){while(moving){try{sleep(BETWEEN_LEVELS_TIME*(RussiaBlocksGame.MAX_LEVEL-level+LEVEL_FLATNESS_GENE));if(!pausing)moving=(moveTo(y+1,x)&&moving);}catch(InterruptedExceptione){e.printStackTrace();}}}可以根据你选择的难度系数在底层的每一行随机产生超过半数(即5个以上)以上的小方块,这样适合喜欢高难度的玩家。3.1.6游戏得分的计算和游戏菜单的编辑游戏得分的计算主要是根据消除的行数来决定的,当然每一次同时消除的行数不一样,每一行的得分也不一样,如果你每次消除的行数为1,则最后得分是100分,如果同时消除2行,则最后得分是220分,同时消除3行,得分为360分,同时消除4行,得分为520分,这由公式:得分=(100+10*(同时消除的行数–1))*同时消除的行数。游戏的编辑,读者可以参照下面的功能介绍。3.2游戏区域涉及的数据结构3.2.1游戏区域游戏区域为屏幕的一部分,可通过面板实现,该区域为正方形,边长一定能被16整除,如果设定边长变量为Side-length,则Sidelength的值应该满足Sidelength%16==0、因为俄罗斯游戏区域刚好为16个小方块长,16个小方块宽的方形。无论在水平方向还是垂直方向,该区域都要处于屏幕的居中位置。游戏区域在水平方向上分为2部分,一部分为12个小方块宽,用来显示游戏容器,另一部分为4个小方块宽,用来显示下一个下坠物和总的分数、3.2.2基础小砖块基础小砖块简称基块,是俄罗斯方块游戏程序设计中的最基木单位,程序的设计和实现都是通过基块实现的。基块是一个小的正方形,其长度应该为游戏区域长度的1/16,设定基块的边长变量为Unitlength,则Unitlength=Sidelenbh/16。通过paint()方法在面板绘制基块,每个基块在绘制的时候,四周会留出1个像素宽,绘制成白色或者灰色,以体现基块与基块之间的间隙。3.2.3下坠物的数据结构算法俄罗斯方块游戏中的下坠物总共有7种不同形状,分别用1-7七个不同id来标识,每个形状由16个黑色基块组成,其中能体现出下坠物形状的基块用灰色表示。每一个下坠物有4种不同方向的状态,在设计的时候可以考虑用一个长度为4的数组来存储一个下坠物的4种状态,数组中每一个元素表示该下坠物的一种状态。那么用什么东西来表示某个下坠物的某种状态呢。用一个4x4的二维数组来存储一种下坠物的一种状态比较合适。在灰色基块出现的位置,值为1,而只有背景颜色,无需绘制的位置,值为0。以ID编号为2的“L”形状为例,整个”L”形卜坠物的4种状态可以用一个3维数组来表示:intshape2[][][]={ {{0,0,0,0},{0,0,1,0},{1,1,1,0},{0,0,0,0}}, {{0,1,0,0},{0,1,0,0},{0,1,1,0},{0,0,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}} };3.2.4下坠物形状和状态的随机出现因为下坠物的7种形状分别给予一个id编号,每个形状的4种状态也分别用0-3的整数表示。因此,可以用随机算法,即使用随机类Random所生成的随机对象来实现对其中下坠物,即chapel-shape7,以及不同状态,即shapeN-0-shapeN-3的随机生成、其中,N的值取值为1-7,代表7种不同的下坠物形状。关键代码如下:Randomrand=newRandom();intN=rand.nextInt(7)+1;intid=rand.nextInt(4);由随机生成的数N可以确定shapel-shape7中的某一个下坠物形状,即确定三维数组中的数组名后缀编号。由随机生成的数ID可以确定三维数组中的第一维的值,即4种不同状态的ID编号。三维数组中的第二维代表要绘制的4x4的16个小基块组成的状态中的第(id+1)行图案,三维数组中的第三维代表具体的某一个基块。例如,当数组为shape2[2][2][1]时,表示绘制的是“L”形状中,第三种状态,即编号为shape2-2状态中第三行的第二个灰色基块,按照类似的算法,可以设定其余6种卜坠物形状的三维数组,在此就不再一一举例。3.2.5游戏的实现算法设计所采用的游戏设计思想就是用一个线程来产生重绘事件,通过线程和用户输入来改变游戏状态。启动游戏后,即刻生成一个重绘线程,该线程每隔50ms绘制一次屏幕、重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择,比如游戏画布上那些己经固定下来的下坠物(下坠物一共有7种,由4x4个小基块组成,每种下坠物颜色固定,可以上卜左右旋转)就不需重绘。游戏画布是事件触发源,可以接受用户键盘命令,控制下坠物的左移,右移,下移和旋转动作、整个游戏的流程控制体现在游戏画布对象的paint()方法里。paint()根据当前的游戏状态,绘制出当时的游戏画面,例如欢迎画面、GameOver,游戏暂停画面等,游戏暂停画面的设置通过设立标志,让paint执行的时候无需真正执行重绘动作。3.3下坠物的关键代码示例3.3.1游戏结束的判断游戏地图可以看成由magiWIDTHxmagiHIGHT个基块组成的区域,每格子都有一个相对于左上角的坐标。可以用一个magiWIDTHxmagiHIGHT的二维数组表示游戏地图,代码如h:intgamemap[map-WIDTH][map-HIGHT]。某格子对应的数组元素的值为1,表示此格子己被基块填充,为0表示未被填充。在游戏地图中,被基块填充了的格子为深灰色,未被填充的格子为白色(底色),灰色格子触及空间顶部时,游戏结束。即gamemap[0](二维数组第一排)中有元素的值为1时,游戏结束。以下是判断游戏是否结束的关键代码:booleanisGameOver()/*true-一结束false一没有结束*/{booleanflag=false;for(inti=0;i<map_WIDTH;i++){if(gamemap[0][i]-=1){flag=true;break;}}returnflag;}3.3.2游戏下坠物是否已落到底,停止下落的判断判断下坠物是否己落到底,就是判断下坠物中每个基块的正下方位置是否己被填充或出下界、)如己到底,把下坠物所在的位置(格子)填充(对应gamemap元素值设为1),还要查看是否有某行己被全填充,把被全填充的行消掉,并给用户加分关键程序代码如下:booleanisHitBottom()//判断当前卜坠物是否已触底,刀并处理{booleanflag=false;/*标志变量,假设为还没有触底*/inti,x,y;/*卜坠物中基块的正卜方格式的坐标*/for(i=0;i<4;i++)/*逐个判断各小基块是否已触底*/{x=blockcx+block一ox[i][0];y=blockcy+block一ox[i][1]+1;if(y>=mapesHIGHTIIgamemap[y][x]==1){flag=true;break;}/*设置为触底*/if(flag)/*已触底*/{for(i=0;i<4;i++)/*逐个填充基块所占格子*/{x=blockcx+block一ox[i][0];y=blockcy+blockbox[i][1];if(y>=0){gamemap[y][x]=l;}}for(i=0;i<4;i++)/*逐个检查h坠物所在行是否全填充*/{y=blockcy+block一ox[i][1];while(y>=0&&CheckAndCutLine(y))//检查此行刀是否全填充m–score+=100;//加分}isplaying=!isGameOver();/*半」断游戏是否结束*/}returnflag;}booleanCheckAndCutLine(intLn)/*检查某一行是否为全填充,如是,消掉并返回1*/booleanisFilled=true;/*假设为全填充*/for(inti=0;i<map_WIDTH;i++)/*逐个判断各格是否有没填充的*/if(gamemap[Ln][i]==0){isFilled=false;break;}/*设置为没有全填充*/}if(isFilled)//全填充时,消掉此行,把上面的格子值往卜移一格{Intj,k;For(j=Ln;j>0;j--)For(k=0;k<map_WIDTH;k++)//逐个把全填充行上的所有行向下移动一行Gamemap[j][k]=gamemap[j-1]for(k=0;k<map_WIDTH;k++)gamemap[0][k]=0;//顶行}returnisFilled;}3.4游戏运行游戏的功能介绍,进入游戏点击开始,游戏的运行效果图如下图3-2所示:图3-2游戏开始的运行效果图游戏还设置了菜单栏,菜单栏包含内容如下:游戏声音:游戏声音快捷键Ctrl+Shift+A,控制键设置:图3-3控制键效果图控制键可以进行自定义设置,比如左移右移可以设置成如下图3-4所示:图3-4改变设置后的控制键效果显示设置:显示设置可以设置界面的简单改变,比如网格,色彩等,如下图3-5所示,默认的显示设置如下,3-5显示设置当改变其中的选项之后,界面会发生变化,变化如下3-6图所示图3-6改变显示设置后的俄罗斯方块界面当改变显示设置之后,界面发生了很大的变化,颜色单一,没有色彩。网格也没有了,网格可以辅助人来更好的玩游戏。关卡设置关卡设置如下图3-7,图3-7关卡选择效果图不同的关卡复杂度不一样,标准关卡比较简单,复杂性关卡难度级别最高。标准关卡难度中等,7种基本形状,共分2级,50000分一级,速度递增,下落一格的速度每2000分减少10毫秒。速度关卡难度较大,7种基本形状,共分10级,10000分一级,速度快且随着分数的增加而递增。复杂性关卡难度最大,共分10级,8000分一级,随着级别越高复杂度越来越大,会出现随机填充的障碍物,以及难以应付的复杂形状,到第4级以后会出现16种基本形状。这里有一个稍后应用和一个立即应用。假如正在玩游戏,如果想稍后应用,重新开始即可,如果想立即应用,那么暂停前的这一局的复杂度会马上增加。

4系统测试和发布4.1测试环境测试电脑配置:CPU型号intelcorei54100MCPU主频2.67GHz内存3g显卡AMDRadeonHD8670M当方块顶在最上边,不能下落时,游戏结束,游戏的界面变红,游戏终止,测试效果图如下图4-1所示:图4-1游戏结束效果图4.2测试遇到的问题1.偶尔会出在现形状下落的过程中形状的某一块没有被擦除掉,原因不明。可能原因为,程序在刷新视图时并没有全部擦除重画,只是根据形状在上一次的显示位置将这一小块重画了一个空块以覆盖。仔细测试过,后台明明执行了这个过程,视图却没有被擦除掉,可能是JDK的问题2.一直按住回车键,程序将在开始游戏和结束游戏之间不停切换,偶尔会出现蒙层未盖住形状的问题4.3程序发布程序发成在任何一台windows平台下都可以运行的程序。通过Eclipse软件导出jar文件。Jar文件可与运行在装有jdk的电脑上,现在需要将此程序与jre打包在一起,放入压缩文件中,并且设置路径,形成zip文件。Zip文件也可以把后缀名改为exe打开。当有人需要安装时,直接双击exe可执行文件即可解压,在另一台电脑上运行。这种方式就相当于安装QQ,360软件一样智能化。

结论经过一学期的设计和开发,俄罗斯方块游戏已经成功。其功能基本符合用户需求,能够完成游戏的控制,方块的变换以及消层等功能。并提供游戏设置,对于一些技术性比较过硬的玩家,可以调游戏级别、以及游戏速度,使得玩家能够充分的发挥竞技游戏的特色,可以不断的挑战自我,挑战极限。但是由于设计时间较短,所以该游戏还有许多不尽如人意的地方,比如方块类型太少,退出游戏不能存储进度等多方面问题。这些都有待进一步改善,我们在游戏中还可以更换背景音乐,以适合不同的玩家,在每通过一关可以给玩家播放一段flash,吸引玩家去挑战极限,不断提高玩家的兴趣,相信在以后的制作过程中我将给大家带来一个更新功能更全面的游戏。

参考文献[1]马海军.Java编程原理与实践.北京:清华大学出版社,2005[2]米川英树.电脑游戏程序设计.北京:中国铁道出版社,2005[3]孙淑敏.Java2游戏开发北京.北京:清华大学出版社,2005[4]张小玮.J2SE无线应用开发.北京:清华大学出版社,2005[5]张白一.面向对象程序设计——Java.西安:西安电子科技大学出版社,2002[6]史斌星.Java基础编程贯通教材.北京:清华大学出版社,2005[7]杨绍方.Java程序基础设计.北京:科学出版社,2005[8]JoshuaBloch.EffectiveJava[M].Piscataway,N.J:IEEEPress,2009[9]ElliotteRustyHaroldJ.Java网络编程.北京:中国电力出版社,2001[10]BruceEckel.ThinkingInJava.北京:机械工业出版社,2007

致谢人生的成长历程始终是向前的。当一个阶段快要结束即将迈入另一个阶段时,自然需要对即将过去的进行思考和小结。自己一直在思考学业、职业、事业的哲学关系,也许本来就没有固定的答案和模式。需要的是对自己对时间、对生命的尊重和珍惜,同样需要对在我成长历程中、在人生某个阶段一直给予我帮助、指导、鼓励、支持、信任、爱护的人,表达真正的感谢。可以用客套、冠冕堂皇的话,也可以选择朴实。后者才更真挚,更深入心灵。在本次设计中,我从甄磊老师和段立国老师身上学到了很多东西。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他们无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他们耐心的辅导。另外,在游戏开发过程中许多同学也给于我很大的帮助,同他们的讨论也让我受到了很大的启发,他们的开放和严谨的思维方式让我受益匪浅,这帮助我解决了不少的难点,使得游戏能及时开发完成,在此感谢他们在我论文期间给予的关心和帮助。

外文原文Java2MicroEditionandtheWorldofJava1IntroductionThecomputerrevolutionofthe1970sincreasedthedemandforsophisticatedcomputersoftwaretotakeadvantageoftheever-increasingcapacityofcomputerstoprocessdata.TheCprogramminglanguagebecamethelinchpinthatenabledprogrammerstobuildsoftwarethatwasjustasrobustasthecomputeritranon.Asthe1980sapproached,programmerswerewitnessinganotherspurtintheevolutionofprogramminglanguage.ComputertechnologyadvancedbeyondthecapabilitiesoftheCprogramminglanguage.Theproblemwasn’tnew.Itoccurredpreviouslyandcausedthedemiseofgenerationsofprogramminglanguages.Theproblemwasthatprogramswerebecomingtoocomplicatedtodesign,write,andmanagetokeepupwiththecapabilitiesofcomputers.ItwasaroundthistimethatadesignconceptbasedonSimula67andSmalltalk(fromthelate1960s)movedprogrammingtothenextevolutionarystep.Thiswastheperiodwhenobject-orientedprogramming(OOP),andwithitanewprogramminglanguagecalledC++,tookprogrammersbystorm.In1979,BjarneStroustrupofBellLaboratoriesinNewJerseyenhancedtheCprogramminglanguagetoincludeobject-orientedfeatures.HecalledthelanguageC++.(The++istheincrementaloperatorintheCprogramminglanguage.)C++istrulyanenhancementoftheCprogramminglanguage,anditbeganasapreprocessorlanguagethatwastranslatedintoCsyntaxbeforetheprogramwasprocessedbythecompiler.Stroustrupbuiltontheconceptofaclass(takenfromSimula67andSmalltalk),fromwhichinstancesofobjectsarecreated.Aclasscontainsdatamembersandmemberfunctionsthatdefineanobject’sdataandfunctionality.Healsointroducedtheconceptofinheritance,whichenabledaclasstoinheritsomeoralldatamembersandmemberfunctionsfromoneormoreotherclasses—allofwhichcomplementstheconceptsofobject-orientedprogramming.By1988,ANSIofficialsstandardizedStroustrup’sC++specification.2EnterJavaJustasC++wasbecomingthelanguageofchoiceforbuildingindustrial-stren

温馨提示

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

评论

0/150

提交评论