坦克大战设计与实现.docx
《坦克大战设计与实现.docx》由会员分享,可在线阅读,更多相关《坦克大战设计与实现.docx(70页珍藏版)》请在冰豆网上搜索。
坦克大战设计与实现
1绪论
1.1国内外单机游戏的研究现状
近年来,因特网在国内迅速普及,导致了网络游戏的高速发展。
单机游戏市场呈现爆炸式的发展。
尤其是国内外巨大的个人电脑拥有量,更是让商家看到了商机,手机游戏市场利润将会十分丰厚。
面对潜力如此巨大的单机游戏市场,各游戏开发商、电脑生产厂商等都纷纷开始了各自的应战准备,以便抢占商机。
由于大部分人都对电脑操作都不是很熟悉,所以对于操作负责的网络游戏的推广有一定的影响,而单机游戏凭借自身操作简单、收费低廉、对电脑要求较低、有益身心等优点而较好推广,对于我国单机游戏而言,还处于起步阶段,有着较大的商业潜力,但是也存在着正版保护意识不强、利润较低等不利因素,还需要进一步的发展。
该游戏是一款以黑白机为平台的平面操作射击游戏,1名玩家可控制自己的坦克进行移动和射击,以保护总部为前提,歼灭对方为胜利目标。
每个关卡的地形不同,玩家可利用各种地形对敌人进行打击,并会得到补给。
两人配合游戏时,每一关都有不一样的战术,以便能顺利完成关卡目标,对于玩家来说大大加强了游戏乐趣。
其操作简单且娱乐性强,是一款男女老少皆宜的游戏。
游戏附带地图编辑器,玩家可自行编辑地图进行游戏。
游戏中的众多经典关卡至今还让许多玩家记忆犹新,在80年代时曾经在无数家庭中带来了无尽的欢乐。
Java语言是当今最为流行的程序设计语言之一作为一门非常优秀和极为健壮的编程语言,它同时具有的面向对象,与平台无关,分布式应用,安全,稳定和多线程等优良的特征,使用Java语言,不仅可以开发出功能强大的大型应用程序,而且Java语言本身突出的跨平台的特性也使得它特别适合于Internet上的应用开发,可以这样说,Java的出现使得所开发的应用程序“一次编写,处处可用”的实现成为了可能。
本课题就是想对该游戏进行分析研究,借助于它的游戏规则,用java语言模拟开发一个类似的,功能相对简单的单机小游戏。
从而使自己更清楚的认识小游戏开发需要的知识和开发的环节和涉及到的领域。
同时本课题所用的知识为J2SE里面的知识,Java2平台包括:
标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本。
J2SE,J2ME和J2EE,这也就是SunONE(OpenNetEnvironment)体系。
J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入式系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
您也许已经见过这样的报告,即一些新的Java语言变化包含易于开发性主题。
这些变化包括泛型、元数据、autoboxing、增强的for循环、枚举类型、静态导入、C风格的格式化I/O、可变参数、并发实用程序以及更简单的RMI接口生成。
JSR201包括如下四个语言变化:
增强的for循环、枚举类型、静态导入和autoboxing;JSR175指定了新的元数据功能,而JSR14则详细说明了泛型。
javac编译器执行的默认语言规范是版本1.4(并非最新版本)。
这意味着要利用以下语言变化的任何好处,需要向javac命令传递参数-source1.5。
1.2研究意义
单机游戏由于其不必连入互联网也可进行游戏从而摆脱了很多的限制,只需要一台计算机即可体验游戏,同时也可以通过多人模式来实现玩家间的互动,当今的很多单机游戏都是精工细做而成,更能呈现出较好的画面、优良的游戏性,相比网络游戏而言更有可玩性,游戏的种类更加丰富,各种游戏类型多不胜数。
但如果没有好的配置也可以玩一些不需要高配置的游戏。
单机游戏往往比网络游戏的画面更加细腻,剧情也更加丰富、生动。
在游戏主题的故事背景下展开的一系列游戏体验,往往给人一种身临其境的感觉。
而且很多发展至今已经有多部作品的单机游戏系列,大多都如电影般讲述了一个剧情波澜起伏的精彩故事,并且让玩家将自己融入到故事中,去闯荡属于自己的另一个世界,打造自己的史诗与传奇经历。
2开发环境和相关技术的介绍
2.1开发环境
操作系统:
MicrosoftWindowsXP,Window7等
程序语言:
Java
开发工具:
MYEclipse6.5
2.2Java的特点
Java是一个广泛使用的网络编程语言,它是一种新的计算概念。
首先,作为一种程序设计语言,它简单、面向对象、不依赖于机器的结构、具有可移植性、鲁棒性、安全性、并且提供了并发的机制、具有很高的性能。
其次,它最大限度地利用了网络,Java的小应用程序(Applet)可在网络上运行而不受CPU和环境的限制。
另外,Java还提供了丰富的类库,使程序设计者可以很方便地建立自己的系统。
Java语言有下面一些特点:
简单、面向对象、分布式、解释执行、鲁棒、安全、体系结构中立、可移植、高性能、多线程以及动态性。
(1)简单性
Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用它编写出适合于各种情况的应用程序。
Java略去了运算符重载、多重继承等模糊的概念,并且通过实现自动垃圾回收,大大简化了程序设计者的内存管理工作。
另外,Java也适合于在小型机上运行,它的基本解释器及类的支持只有40KB左右,加了标准类库和线程的支持也只有215KB左右。
(2)面向对象
Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。
对象中封装了它的状态变量以及相应的方法,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。
(3)鲁棒性
是什么叫做鲁棒性呢?
这个名字是一个音译,其英文拼写为Robust。
也就是健壮和强壮的意思。
Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。
它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。
通过集成的面向对象的例外处理机制,在编译时,Java揭示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。
另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。
(4)安全性
用于网络、分布环境下的Java必须要防止病毒的入侵。
Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用“特洛伊”木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
(5)体系结构中立
Java解释器生成与体系结构无关的字节码指令,只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。
这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换,使之能够在不同的平台运行。
此外Java语言还有可移植性、解释执性、高性能、多线程、动态性等优秀特性。
(6)半编译半解释
编译指一次性地将一个高级语言编写的源程序翻译成可以运行的目标程序,目标程序作为一个独立的文件可以多次运行。
虽然编译过程所需的存储空间很大,而且编译时间也较长,但目标程序执行时速很快,而且不需要多次翻译,所以此种方法适合于重复执行的程序。
解释指的是对高级语言编写的源程序翻译一句执行一句,翻译和运行交替进行。
如果想重新运行程序,则需要重新翻译,重新执行。
由于一边解释一边执行,且每次翻译都需要重新翻译,所以它的速度远底于编译型语言。
Java是半编译半解释的语言,一个Java程序想要运行,首先由Java编译器编译为字节码。
但字节码不是最终的可执行程序,它必须由系统上的字节码解释器将其翻译成机器语言。
虽然Java采用边解释边运行的方式,但由于字节码已经非常接近机器码,所以它的速度也是非常快的。
(7)性能优异
与其他解释执行的语言不同,Java字节码的设计使它很容易将目标代码直接转换成对应于特定CPU的机器指令,从而得到较高的性能。
Sun用直接解释器一秒钟内可调用300,000个过程。
翻译目标代码的速度与C和C++没什么区别。
(8)动态性
在Windows系统中,如果有多个应用程序要使用相同的函数时,计算机将这个函数加载到内存里,然后多个应用程序可以共同使用内存中的函数。
这样每一个应用程序就不需要在内存中复制相同的函数,动态链接节省了内存空间的使用。
Java的动态特性是它在面向对象设计方法上的扩展。
它允许应用程序动态的装入运行过程中所需的类。
虽然C++语言也是进行面向对象设计,但它是无法实现这种功能的。
在类库中可以自由的加入新的方法和实力变量而不会影响用户程序执行使Java更适合于一个不断发展的环境。
并且Java通过实现接口来支持多重继承,使它比严格的类继承具有更灵活的方式和扩展性。
2.3关于Eclipse
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentTools,JDT)。
虽然大多数用户很乐于将Eclipse当作JavaIDE来使用,但Eclipse的目标不仅限于此。
Eclipse还包括插件开发环境(Plug-inDevelopmentEnvironment,PDE),这个组件主要针对希望扩展Eclipse的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。
由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
这种平等和一致性并不仅限于Java开发工具。
尽管Eclipse是使用Java语言开发的,但它的用途并不限于Java语言;例如,支持诸如C/C++、COBOL和Eiffel等编程语言的插件已经可用,或预计会推出。
Eclipse框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。
基于Eclipse的应用程序的突出例子是IBM的WebSphereStudioWorkbench,它构成了IBMJava开发工具系列的基础。
例如,WebSphereStudioApplicationDeveloper添加了对JSP、servlet、EJB、XML、Web服务和数据库访问的支持。
Eclipse最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。
IBM提供了最初的Eclipse代码基础,包括Platform、JDT和PDE。
目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、RationalSoftware、RedHat及Sybase等。
Eclipse是一个开发源码项目,它其实是VisualAgeforJava的替代品,其界面跟先前的VisualAgeforJava差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。
近期还有包括Oracle在内的许多大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。
3系统的分析
3.1可行性分析
1.游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。
一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、健盘事件都会以极高的频率在后台等待循环。
因此,其逻辑设计应当相当严谨,需将所有可能发生的事件各意外情考虑在设计中。
2.游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,屏幕刷新的双缓冲等都有较好的解决方案。
3.我方的坦克的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定的智能性;同时,出现在屏幕上的敌方可能性会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。
Java的多线程能力为实现这样的游戏提供了可能。
4.对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。
敌方子弹仅需要扫描用户坦克,而用户坦克需要在每一步扫描所有的敌方坦克。
这需要对所有的对象有较好的控制。
另外,子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。
如此过多的线程同时在本来效率就不高的机器上运行,也许会导致程序的缓慢。
5.双方坦克在前进时也考虑到是否碰撞到相关物体或对方坦克,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。
6.是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。
开发过程中要对结构的控制、注意变量的使用。
3.2需求分析
功能需求:
单机坦克大战游戏设置为在一个特定的场景中的敌我双方坦克的对战,敌方坦克由系统控制,自动的发射子弹;我方坦克由玩家控制,系统为玩家提供控制坦克运行和子弹发射攻击的方法。
开发过程中我们用一幅地图来表现作战的场景,地图和道具以及障碍物就是支持的PNG格式静态图片。
敌方的攻击能力主要体现在坦克的运行轨迹和子弹的发射时间和运行轨迹上,敌方坦克和子弹的运行是保证游戏的可玩性的关键。
游戏软件为玩家提供坦克运行的各种控制键,游戏软件中定义了子弹的发射键以及控制坦克运行方向的上、下、左、右键。
4系统功能及相关技术
4.1游戏功能
坦克大战游戏,顾名思义就是玩家操作一辆自己的坦克和敌方坦克对战,游戏的主要功能有:
*1.我的坦克能够四处移动
*2.能够发射普通炮弹,袭击敌人坦克
*3.敌人坦克能够八个方向随机移动
*4.击中敌人坦克能够显示爆炸效果
*5.我的坦克可以回血
*6.敌人坦克可以叠加敌我坦克不能相碰
*7.可以设置障碍物,且坦克不可以通过障碍物
*8.可以播放声音文件
4.2游戏规则
游戏中坦克能向八个方向移动,坦克能向八个方向发射子弹,子弹击中坦克产生爆炸,玩家坦克还能发射同时向八个方向发射的集束炸弹,集束炸弹有数量限制,每次生命有3颗。
地图上有障碍物,坦克和子弹都不能穿越障碍物。
玩家坦克有生命数,还有生命值,被敌人子弹击中后生命值减少,生命值为0后坦克爆炸,生命数减少1,开始新坦克的操作。
消灭了所有出现的敌人坦克之后,最后出现一个BOSS坦克,BOSS坦克可以向八个方向发射炮弹,同时也有血液,知道血液被打完,游戏结束。
4.3游戏界面和操作方式
(游戏界面图,见图4-1)
图4-1游戏界面图
操作方式:
游戏开始后玩家用键盘操作,上下左右键控制坦克的方向,O键发射超级炮弹,Ctrl键发射普通炮弹。
4.4本程序需解决的有关技术问题
1.游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。
一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。
因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。
2.游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。
3.己方坦克的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定其一定的智能性;同时,出现在屏幕上的敌方可能会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。
Java的多线程能力为实现这样的游戏提供了可能。
4.对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。
敌方子弹仅需要扫描用户坦克,而用户坦克需要在每一步扫描
所有的敌方坦克。
这需要对所有的对象有较好的控制。
5.敌人坦克与我的坦克在碰撞是直接爆炸,为了实现更美观的效果,每一次刷新页面、每前进一步都需要将所有的周围环境都进行扫描。
6.Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。
除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。
4.5相关技术的介绍
4.5.1关于JFrame
Swing的三个基本构造块:
标签、按钮和文本字段,但是现在需要个地方安放它们,并希望用户知道如何处理它们。
JFrame类就是解决这个问题的——它是一个容器,允许程序员把其他组件添加到它里面,把它们组织起来,并把它们呈现给用户。
JFrame实际上不仅仅让程序员把组件放入其中并呈现给用户。
比起它表面上的简单性,它实际上是Swing包中最复杂的组件。
为了最大程度地简化组件,在独立于操作系统的Swing组件与实际运行这些组件的操作系统之间,JFrame起着桥梁的作用。
JFrame在本机操作系统中是以窗口的形式注册的,这么做之后,就可以得到许多熟悉的操作系统窗口的特性:
最小化/最大化、改变大小、移动。
产生一个游戏的窗口。
产生一个窗口有两种方法:
1,继承JFrame.2,直接new一个JFrame.我采用继承的方法来产生游戏窗口,因为继承的方式比较灵活,可以定义自己的成员变量。
4.5.2绘图技术
关于绘图机制:
JAVA中的任何一个图形组件,小到文本框、标签,大到一个FRAME,一个DIALOG,都有一个专门负责显示其界面的函数,这个函数名称是固定的:
paint,它的原型为:
publicvoidpaint(Graphicsg){……}每当组件大小、位置、组件内容发生变化时,该函数即负责生成新的图形界面显示。
由于该函数可以被子类继承,因此,继承的子类有能力修改该函数。
如果子类中没有出现该函数,则表示其行为完全继承自父类。
则不管是组件中是否添加了新的内容,是否发生了大小的改变,是否发生了位移,父类都要有一个专门的线程,来负责描绘变化以后的组件界面。
paint函数由父类自动维护,并且如果子类一旦重载该函数,必须自己去维护所有的界面显示。
4.5.3事件监听机制
java中的事件机制的参与者有3种角色:
1.eventobject:
就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中
2.eventsource:
具体的接受事件的实体,比如说,你点击一个button,那么button就是eventsource,这样你必须使button对某些事件进行相应,你就需要注册特定的listener,比如说MouseEvent之中的MouseClicked方法,这是他就必须有了add方法
3.eventlistener:
具体的对监听的事件类,当有其对应的eventobject产生的时候,它就调用相应的方法,进行处理。
在windows程序设计里边这种相应使用callback机制来实现的。
先看看jdk提供的event包:
publicinterfaceEventListener:
所有事件侦听器接口必须扩展的标记接口。
publicclassEventObjectextendsObjectimplementsSerializable所有事件状态对象都将从其派生的根类。
所有Event在构造时都引用了对象"source",在逻辑上认为该对象是最初发生有关Event的对象。
在Java2处理事件时,没有采用dispatchEvent()-postEvent()-handleEvent()方式,采用了监听器类,每个事件类都有相关联的监听器接口。
事件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的。
对每个明确的事件的发生,都相应地定义一个明确的Java方法。
这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承java.util.EventListener。
实现了事件监听者接口中一些或全部方法的类就是事件监听者。
伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自java.util.EventObject。
事件状态对象作为单参传递给应响应该事件的监听者方法中。
发出某种特定事件的事件源的标识是:
遵从规定的设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。
4.5.4关于多线程
在计算机编程中,一个基本的概念就是同时对多个任务加以控制。
许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程。
可以通过多种途径达到这个目的。
最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。
尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。
中断对那些实时性很强的任务来说是很有必要的。
但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。
最开始,线程只是用于分配单个处理器的处理时间的一种工具。
但假如操作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。
从程序设计语言的角度看,多线程操作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。
程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。
根据前面的论述,大家可能感觉线程处理非常简单。
但必须注意一个问题:
共享资源!
如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到一个问题。
举个例子来说,两个线程不能将信息同时发送给一台打印机。
为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。
所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。
线程是在同一时间需要完成多项任务的时候实现的。
5系统的总体设计
系统总共含有7个java源文件,程序功能结构图(见图5-1)
图5-1程序功能结构图
5.1TankWarClient.java
该文件为主类,负责调用各个类,并创建游戏窗口。
(见表5-1)
表5-1程序变量表
成员变量描述
变量类型
名称
窗口宽度
int
GAME_WIDTH
窗口高度
int
GAME_HEIGHT
5.2Tank.java
建一个坦克类,定义其成员变量(见表5-2)
表5-2坦克类
成员变量描述
变量类型
名称
坦克的速度
int
TSPEED
坦克的宽
int
TANK_WIDTH
坦克的高度
int
TANK_HEIGHT
5.3Bullet.java
建一个子弹类,定义其成员变量(见表5-3)
表5-3子弹类
成员变量描述
变量类型
名称
子弹X方向的速度
int
XSPEED
子弹Y方向的毒素
int
YSPEED
坦克的高度
int
HEIGHT
5.4Explode.java
建爆炸类,定义其成员变量(见表5-4)
表5-4爆炸类
成员变量描述
变量类型
名称
坦克生死的描述
Boolean
LIVE
主类的变量
TankWarClient
Twc
5.5Miss