《Java版坦克大战游戏毕业设计.doc》由会员分享,可在线阅读,更多相关《Java版坦克大战游戏毕业设计.doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 引言11 开发背景 随着人们精神文化生活的日益丰富,为了让我们在闲暇的时间多方面发展个人的兴趣爱好,为了更好地开发个人智力,游戏成为人们生活中不可缺少的一部分。游戏产业促动高科技技术不断升级,作为经济增长的一大支撑点,已经成为经济腾飞的“第四产业”。作为休闲游戏的起源应该追溯到早期的俄罗斯方块和坦克大战,坦克大战是童年经常玩的游戏,也是一款经典游戏。坦克大战游戏几乎家喻户晓,对我们80后90后而言,是童年最珍贵的回忆。此款游戏是一款以红白机为平台操作射击游戏1,玩家可以控制自己的坦克,以歼灭对方的坦克,其操作方式及其简单,是一款男女老少皆宜的游戏。为了满足人们的个性化需求,使玩家在游戏的过
2、程中,更能体验游戏本身的乐趣,也为了满足更好的用户体验,市场上逐渐出现了墨水坦克大战2,它是经典坦克大战的姊妹游戏,只有手机版,没有PC版,所以决定在自己大学毕业之时,开发一个PC版的墨水坦克大战。12 国内外单机游戏的研究现状近年来,由于经济的迅速发展,科技日新月异的变化,越来越多的人会把电脑作为一种娱乐工具,而不仅仅是用它来工作,单机游戏又凭借自身操作简单,价格低廉,对电脑的配置要求低,有利于各个阶层各个行业人士使用,并且有益于身心健康,在琳琅满目的游戏中脱颖而出。但是,对于我国国内单机游戏而言,还处于起步阶段,有着较大的商业潜力,但是也存在着正版维护意识不强,从而使得盗版有机可乘,影响市
3、场的健全发展,还需要得到进一步的更健全的发展3。13 研究意义单机游戏由于其不必联入互联网也可以进行游戏,从而摆脱了很多限制,只要有一台电脑即可体验游戏带来的欢乐,现在许多的单机游戏都是精工细致而成的,更能呈现出友好的界面,流畅的画面,悦耳的背景音乐,良好的游戏性。墨水坦克大战只有手机版,使得手机屏幕小或者配置低的用户很难体验到墨水坦克大战的妙趣横生,开发PC版的墨水坦克大战势在必行。开发这一游戏,不仅能够满足更多人的需要,同时,通过开发这一完整项目,使得自己能更好的巩固大学所学的知识,使理论与实践相结合,增强动手能力,进一步了解软件开发的流程,并且在这一过程中提升自己的编程能力。在遇到问题的
4、时候,通过查阅资料,自己解决,或者请教老师,增强了自学的能力,增加了师生的感情。这一项目是俩人合作完成的,除了能学习到技术方面的知识,我也深刻的体会到合作的重要意义。这也使得这次毕业设计有很重要的意义。2 开发环境及相关技术的介绍2.1 开发环境此系统是在Microsoft Windows 7操作系统下完成的,用Java语言编写的,用Eclipse工具开发的。2.2 Java语言的特点 Java是Sun公司推出的新一代面向对象程序设计语言4。 首先,作为一种程序设计语言,它简单、面向对象、不依赖于机器的结构、具有可移植性鲁棒性、安全性、并且提供了并发机制、具有很高的性能。其次,它最大限度地利用
5、了网Java的小应用程序(Applet)可在网络上运行而不受CPU和环境的限制。另外,Java还提供了丰富的类库,使程序设计者可以很方便地利用已有的封装好的类,迅速的建立自己的系统5。1简单性 Java语言是一种比C+还面向对象的编程语言,Java略去了运算符重载、多重继承等模糊的概念,并且通过实现自动垃圾回收,大大简化了程序设计者的内存管理工作6。Java抛弃了指针的概念。由于java拥有着这些新特性,使得开发人员更容易写出“无错代码”。2面向对象 在很多面向对象的语言里,Java才是一门纯粹的面向对象语言,Java中面向对象的思想主要体现在三大特点,即封装,继承和多态7。它提供了简单的类机
6、制以及动态的接口模型。对象中封装了它的属性以及对应的方法行为,实现了模块化和信息隐藏,而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,大大的提高了代码的复用率。3健壮性 一门语言的健壮性就体现在它对常见错误的预防能力,Java语言就很好的体现了这一点8。Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。 4安全性 网络的快速发展,给人们的生活工作带来了很大的便利,但是于此同时,使得用户的信息不再透明化。Java对指针进行了屏蔽,从而不能直接对内存进行操作,进而大大的提高
7、了内存的安全性9。 5解释性 Java解释器生成与体系结构无关的字节码指令只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换使之能够在不同的平台运行10。 Java除了具有以上一些优点外,还有分布式、可移植性、多线程以及动态性。 2.3 关于EclipseEclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境11。幸运的是Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Develop
8、ment Tools ,JDT )。 Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。 这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言,例如,支持诸如 C/C+、COBOL
9、和 Eiffel 等编程语言的插件已经可用或将来会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础。 Eclipse最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT和PDE12。目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase等。 由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,
10、因此越来越受人们关注。近期,还有包括Oracle在内的许多大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。2.4 GUI技术简介图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。Java的图形用户界面由各种组件(component)构成,在java.awt包和javax.swing包中定义了多种用于创建图形界面的组件类。GUI 是一种结合计算机科学、美学、心理学、行为学,及各商业领域需求分析的人机系统工程,强调人机环境三者作为一个
11、系统进行总体设计。这种面向客户的系统工程设计其目的是优化产品的性能,使操作更人性化,减轻使用者的认知负担,使其更适合用户的操作需求,直接提升产品的市场竞争力。GUI即人机交互图形化用户界面设计。纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到GUI在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了相关部门专门从事 GUI的研究与设计,同业间也成立了若干机构,以互相交流GUI设计理论与经验为目的。随着中国IT产业,移动通讯产业,家电产业的迅猛发展,在产品的人机交互界面设计水平发展上日显滞后,这对于提高产业综合素质,提升与国际同等业者的竞争能力
12、等等方面无疑起了制约的作用。GUI的广泛应用是当今计算机发展的重大成就之一,他极大地方便了非专业用户的使用。人们从此不再需要死记硬背大量的命令,取而代之的是可以通过窗口、菜单、按键等方式来方便地进行操作。而嵌入式GUI具有下面几个方面的基本要求:轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。2.5 本章小结本章介绍了Java语言的特点、本程序的开发环境及其相关的开发工具的原理和使用。3 系统设计及相关的技术3.1 系统可行性分析3.1.1 技术可行性本系统采用Java语言编写,它是一种简单的,面向对象的编程语言,具有多线程,分布式,跨平台等特性。它有自己的安全机制,并且移植性很好
13、。Java语言对开发网络产品有其独特的优势,本系统开发过程是利用Java编程语言和Eclipse集成开发环境配合使用来实现的。界面主要是通过使用GUI的知识,核心功能主要运用了Java的基本知识,其中涉及到了线程方面的知识。另外,此系统对开发环境的要求,都是大部分Java程序员进行软件开发使用的开发环境,所以技术方面也是可行的。3.1.2 经济可行性本设计的开发是基于JDK1.7和Eclipse的,因为他们都是免费且开源的软件,只需要下载安装即可,使用的图片素材和音效素材都是网上共享的资源,该系统对操作环境没有太多要求,系统的开发不需要很强的经济支持,无需要投入太多的人力、物力,从而开发所需要
14、的资金投入也不会很大,所以实现此需求的成本可以忽略不计。3.1.3 操作可行性 本设计是一个大家都熟悉的游戏,模拟了坦克大战的常用功能,加入敌我双方坦克,加入子弹并可以打出子弹,产生爆炸效果等一系列功能,并且加入了自己的独特元素涂鸦风格,坦克大战的操作容易,玩家不需要了解复杂的操作流程,只要有一台电脑,可以不用网络,用户就可以体验此款游戏,使得其适合用户体验,成为一款老少皆宜的游戏。3.2 系统需求分析3.2.1 单机模式下实现的功能(1)玩家可以通过键盘控制坦克的移动,并可以通过按键发射炮弹,包括普通炮弹和超级炮弹;(2)敌人坦克能够自由移动和射击;(4)能产生爆炸效果;(5)有声音效果;(
15、6)有些小道具,如血瓶,通过它可以增加血条;(7)游戏的开始界面,菜单界面,游戏界面以及游戏结束界面要美观友好。(8)能保存玩家的游戏数据;(9)玩家可以查看排行榜信息;3.2.2 用况建模游戏中敌我双方坦克都可以完成射击动作,并且都可以移动,自己的坦克是通过键盘的方向键控制坦克的运动,敌人的坦克是随机运动的。屏幕上的敌方坦克数量较多,所以需要为敌方的每一辆坦克开辟一个独立的线程,以便使其独立运行。Java的多线程能力实现这样的游戏成为了可能。此游戏的用例图如图3.1所示:添加障碍物移动射击我方坦克射击敌方坦克射击敌方坦克我方坦克 图3.1 游戏用例图3.3 程序运行流程3.3.1 程序中炮弹
16、的运行流程炮弹是一个单独的类,它拥有一个很重要的变量isGood,它标识了该子弹是我方的还是敌方的,这样可以控制子弹在脱离了坦克后的运行状态中的行为。击中墙时,子弹的生命就结束,不再继续画。如果没有击中物体,就继续监测是否击中了坦克,这根据子弹的来源分为两种情况,来自我方时,监测是否与敌人进行了碰撞,发生碰撞时,将敌人从list中移走,并置为空,将产生爆炸效果,敌人数量减少一个。如果来自敌人的子弹,将监测是否与我方坦克碰撞,如果碰撞,就生命值减少百分之二十。子弹的功能流程图如3.2所示:击中墙壁子弹消失开始开始是否出界击中物体玩家子弹击中敌人敌人子弹击中玩家NYYNY消除敌人NN消除玩家YYN
17、图3.2 子弹运行流程图3.3.2 程序中小道具的运行流程游戏中设置了奖励道具,当count值为100时,就会在屏幕上随机出现一个奖励道具,每个道具都会有自己的生命值,定义道具的生命值life为100,从道具出现开始,道具的life就做自减操作,当life的值为0时,道具就从屏幕上消失,在道具消失前如果坦克检测到道具,坦克的生命值就变成100,如果坦克没有检测到道具,则道具自动消失。其运行流程图如图3.3所示:NY开始Count+Count=100随机出现道具Count=0Count-Life=0消失被坦克吃掉NNY 图3.3 运行流程图3.4 系统总体设计3.4.1 坦克大战总体功能设计坦克
18、大战游戏主要实现,用户启动游戏客户端选择游戏模式,分为单机模式和网络对战模式,选择单机模式可以直接进入游戏状态,通过歼灭敌人的坦克计分,歼灭不同颜色的敌人坦克可以累计不同的分值,游戏结束后,如果创造出新纪录,则弹出保存游戏纪录的对话框。本游戏有游戏主窗体模块、坦克类模块、子弹模块、障碍物模块、爆炸模块、奖励模块、坦克客户端模块。模块之间的关系如图3.4所示:坦克大战 爆炸模块 子弹模块地图模块地图加载模块坦克类模块主窗口程序模块图3.4 坦克大战功能模块图3.4.2 坦克大战的游戏规则 玩家在打开此游戏时,首先映入眼帘的是坦克大战游戏的欢迎界面,随后便自动跳入到菜单界面,玩家可以通过菜单按钮选
19、择游戏模式后即可进入游戏界面,玩家可以选择单机版坦克大战,也可以选择网络版坦克大战。选择某一种游戏模式后,玩家进入了游戏界面,玩家可以通过键盘的上下左右键控制坦克的移动方向,在坦克移动的过程中,玩家可以通过Ctrl键发射普通炮弹,通过A键可以发射超级炮弹。玩家在游戏的过程中,可以获得某些小道具,从而增加血条或者生命,在玩家被消灭后可以通过F2键重新开始游戏,在一局以后,如果玩家有了新纪录,则弹出玩家信息的对话框,用来纪录玩家的游戏信息,从而增加游戏的可玩儿性,使得玩家有目标。3.4.3 客户端TankClient的设计TankClient类是客户端的主类,它承担着整个坦克大战游戏系统的所有功能
20、的调度工作,是游戏运行的入口。负责键盘和鼠标的监听,游戏窗口的重画,背景音乐的播放,玩家信息的纪录。该模块由TankClient.java文件实现,该文件是单机版的核心所在,该类中主要成员变量如下表3.5所示:表3.5 Tank Client类中成员变量表成员变量描述变量类型名称游戏窗口宽度IntGAME_FRAME_WIDTH游戏窗口高度IntGame_FRAME_HEIGHT休眠时间IntSLEEPTIME背景图片StringBACK_GROUND_PICTURE虚拟背景图片ImageOffScreenImage最高分数InthighestScore该类中包含以下几个方法,其基本功能见下图
21、:表3.6 Tank Client类中主要方法方法功能备注paint()画出窗体的内容无备注update()调用update时自动调用无备注launchFrame()游戏主窗体无备注saveHighestScore()保存各玩家的最高游戏纪录无备注isRanking()榜单信息无备注readFile()通过此方法读取玩家信息无备注3.4.4 坦克类Tank设计Tank类是所有坦克类的父接口。其属性有:坦克的身份,坦克的颜色,坦克的八个方向等。其中定了了坦克的一些方法,比如能够控制坦克移动,判断坦克是否越界,坦克与其它坦克已经碰撞物的检测,坦克发射炮弹,包括普通炮弹和超级炮弹,玩家按键从而发出不
22、同方向的炮弹,血条等小道具的添加也是在此类中完成的。坦克包括我方坦克和敌人坦克。我方坦克必须能够射击和移动,只有通过射击才能击败敌军,也只有移动才能躲避敌军的子弹和吃到奖励的小道具。敌军坦克能够移动和发射子弹,但他们的移动和射击都是随机的,并且不需要玩家的操纵,他们是通过线程设定相应的休眠周期来控制移动和射击,敌军会向8个不同的方向移动特定的步数和射击,其中方向是通过随机函数生成的。该模块由tank.java文件实现,创建坦克,打子弹,打超级炮弹。处理坦克和墙相撞的问题,坦克不能相互穿越,加入我方坦克的生命值,击毙敌人坦克。该类中主要变量如表3.7所示:表3.7 Tank类中主要成员变量表成员
23、变量描述变量类型名称坦克在X轴的移动速度IntX_SPEED坦克在Y轴的移动速度IntY_SPEED坦克的身份Stringcategory坦克的生死状态BooleantankLive该类中包含以下几个方法,其功能表如表3.8所示:表3.8 Tank类中的方法功能表方法名功能getEnemyTankImage()画出敌人坦克getFriendlyImage()画出我方坦克limitTankCannotOutOfBounds()判断坦克是否越界fire()发射普通炮弹superFire()发射超级炮弹keyReleased(KeyEvent e)键抬起的事件处理locateDirection()坦
24、克的方向tankCollidesWithWall(Wall w)我方坦克与墙碰撞检测tankCollidesWithTank(List tanks)敌人坦克与墙碰撞检测tankEatBloodBottle(BloodBottle b)我方坦克吃血条3.4.5 子弹类设计坦克射击后能产生一个飞行的子弹,和其它物体相撞后,能产生不同的爆炸效果,且子弹分为普通子弹和超级炮弹,玩家通过按下不同的方向键可以打出不同方向的子弹,敌人坦克打到我方坦克时,血条减少,我方打向敌人坦克时,敌人坦克消失,我方和敌方打出的子弹颜色不同。我方坦克发出的子弹可以穿越障碍物打敌人坦克,敌人的子弹则不能穿越障碍物。 子弹分为
25、敌军子弹和自己的子弹。敌方每隔一段时间就会发射子弹,子弹也设定了休眠周期来控制自身的移动,当子弹击中墙或者我方坦克时时就会出现爆炸效果, 我方坦克的生命值减少百分之二十,子弹随即消失。我方坦克的子弹是通过键盘事件监听的,当按了相应的按键之后,子弹会以某种速度向坦克炮筒方向移动,如果子弹击中敌人坦克或者墙时,敌人坦克将被消灭,并产生爆炸效果。该类中主要的成员变量,如下表3.9所示:表3.9 子弹类主要成员变量表成员变量描述变量类型名称子弹在X轴方向的速度intX_SPEED子弹在Y轴方向的速度intY_SPEED子弹图片ImagemissileImage子弹身份Stringcategory 该类
26、中主要的方法如表3.10所示:表3.10 子弹类主要方法表方法名功能setCategory(String category)设置子弹的身份isMissileLive()判断子弹是否活着getFriendMissileImage()画出自己子弹的图片getEnemyMissileImage()画出敌人子弹的图片missileMove()子弹移动hitTank(Tank t)敌人打击我方坦克hitTanks(List tanks)我方坦克打击敌人坦克hitWall(Wall w)子弹撞墙3.4.6 爆炸类设计 每一颗子弹在消失的时候,都会产生爆炸效果。 在子弹击中对方坦克时,能产生一个爆炸,爆炸的
27、效果是通过在一个地方按顺序播放一组不同大小的图片得到的。3.4.7 加载声音和图片类设计 为了增强游戏的可玩儿性,使得玩家在体验游戏的时候不是太枯燥,特意加入了音乐,在玩家玩儿游戏时可以开启音乐或者关闭音乐,使得游戏更加人性化,用户体验较好。3.5 本系统相关技术的介绍3.5.1 关于Java Swing组件所谓的Java Swing组件,就是通过使用这些组件可以用来组成一个图形化的界面14,例如按钮,标签等,而每一个组件拥有的不同形态可以满足用户的不同需求,帮助用户创建出友好的界面。Swing组件包括俩大类:一种是JComponent类,另一种就是Window类。Window组件类主要是包括
28、了一些可以独立显示的组件15。本系统中主要运用了JFrame以及一些按钮,标签等,从而产生了一个个的游戏窗口。产生窗口一般有两种方式,一种是通过继承JFrame,另一种则是直接实例化一个JFrame,我是通过继承的方式创建的,因为其灵活,可以定义自己的成员变量,加入自己的方法,可以直接使用里面的一些方法。3.5.2 绘图技术Java中的任何一个图形组件,从文本框,标签到窗口,都有一个专门的一个负责显示其界面的函数15,这个函数就是paint(),每当组件的大小,内容及位置等发生变化时,系统会自动调用paint(),该类可以被子类继承,如果子类没有重写paint(),则默认完全继承自父类。无论组
29、件是否有变化,父类都有一个线程,描述组件的界面。paint()由父类自动维护,如果子类重载该函数,就必须重写方法。3.5.3 线程线程,有时候也被称为轻量级进程,是程序执行流的最小单位。在本系统中,多次用到了线程的概念。如背景音乐的播放,游戏窗口的重画,等等都用到了线程。Java中线程的创建有俩种形式,一种是继承Thread,另一种则是实现Runnable接口,可将代码和数据、CPU分开,实现了数据共享16,在本系统中paintThread就是这种方式实现的。3.5.4 事件监听器 在本系统中,主要是对鼠标事件和键盘事件的监听。在GUI事件处理编程时,首先要定义监听器类,该类实现特定接口中的对
30、应方法,即用来处理自己程序的逻辑部分。然后要在组件上添加监听器的对象,随即该监听器对组件的某一操作进行接听,从而执行不同的事件处理方法。 4 系统详细设计与实现4.1 游戏界面和操作方式4.1.1 游戏欢迎界面WelcomeScreen是系统的欢迎界面,其继承了SuperFrame类,用来显示坦克大战的欢迎界面。该界面的设计非常简单。它是一个最普通最简单的窗体,只是加了一张背景图片,该背景图片是有动画效果的,其动画效果是我用PhotoShop软件做的一张动态图片。该界面意在引起玩家的兴趣,并且展示了整个游戏的风格主题涂鸦风格。其界面如图4.1所示:图4.1 欢迎界面截图4.1.2 菜单界面 M
31、enu是系统的菜单界面,继承了SuperFrame类,在该界面中,玩家可以查看游戏的帮助界面,打开帮助界面后,有关于此游戏的说明以及操作的基本方法。玩家可以自主选择游戏模式,即单机游戏还是网络对战游戏,选择网络对战游戏后,通过创建、加入即进入网络对战模式。如果选择了单机版游戏,则直接进入游戏界面。玩家可以根据个人的需要选择是否开启音乐,使得玩家在体验该游戏的时候不枯燥,增加游戏的用户体验。在menu上显示了游戏的最高纪录,此记录可以引发更多的玩家挑战最高纪录,从而增加了游戏的可玩性。在该菜单界面有排行榜按钮,点击该按钮后,可以查看各个玩家的信息,查看其排行信息。这样,就可以激发玩家的游戏兴趣,
32、使得玩家在体验的时候会有目标。菜单界面如图4.2所示:图4.2 菜单界面截图4.1.3 游戏界面 游戏界面主要是TankClient里通过paintThread线程定期重画界面的,是整个游戏的核心部分,包括敌我双方坦克移动,发射炮弹,打中敌人坦克的爆炸效果等等。该游戏界面是通过继承JFrame类,该类指定了游戏窗口的大小,加入了我方坦克并指定了位置,在游戏的主界面加入了菜单栏,并且在该界面做了关于打破新纪录后悔弹出需要保存玩家信息的界面。该游戏界面是整个坦克大战游戏的核心所在,也是主要的界面,游戏界面如下图4.3所示:图4.3 游戏界面图4.1.4 游戏结束界面该界面是在玩家坦克生命值降为0后
33、出现的界面,如果玩家在玩儿这局的时候,破了现在的最高纪录,则弹出保存玩家游戏信息的对话框,然后出现此界面,如果玩家没有打出新纪录,则直接弹出此界面。游戏结束界面,标志着这一局游戏的结束,与此同时,玩家可以选择是否再玩一局,如果点击相应“是”的按钮,则重新回到游戏界面,否则就退出整个游戏系统。该界面仍然保持着我们所做的坦克大战的涂鸦风格,游戏的界面如下图4.4所示:图4.4 游戏结束界面4.1.5 游戏操作方式各界面之间的切换主要是通过点击鼠标完成的。点击欢迎界面以后即跳转到menu界面,在menu界面中点击不同的按钮,触发不同的事件,则切换到不同的界面。在游戏界面中,玩家则主要是通过键盘控制坦
34、克的移动方向,炮弹的发射以及发射的炮弹类型。4.2 坦克初始化4.2.1 在面板中加入坦克所加的坦克有俩种,我方坦克和敌军坦克,其中敌人的坦克又有不同的颜色,歼灭不同颜色的坦克所获分数不同,同时设置我方坦克的初始位置。我方坦克在开始的时候都有生命值,每次被打一次生命值减少百分之二十。本系统中的坦克不是画出来的,是通过图片调出来的,其中用Toolkit方法把硬盘中的图片拿到内存中来的。其主要代码如下:加入自己的坦克:Tank myTank = new Tank(TANK_INITIAL_COORD_X, TANK_INITIAL_COORD_Y, this);myTank.setCategory
35、(Tank.FRIEND);myTank.tankCollidesWithTank(tanks);myTank.tankCollidesWithWall(wall);myTank.tankEatBloodBottle(bloodBottle);myTank.draw(g);加入敌方坦克:for (int i = 0; i tanks.size(); i+) Tank tank = tanks.get(i);tank.tankCollidesWithWall(wall);tank.tankCollidesWithTank(tanks);tank.draw(g);for (int i = 0; i
36、 5; i+) Tank tank = new Tank(100 + 60 * (i + 1), 100, this);tank.setCategory(Tank.ENEMY);tanks.add(tank);4.2.2 让坦克可以移动将坦克的位置改变为变量,启动线程不断重画,使得线程重画更均匀,并且可以控制线程重画的速度。按键重画不能解决子弹自动飞行的问题,每次重画都改变坦克的位置,使得视觉上坦克在移动。由于普通的刷新频率太快会导致闪屏问题,我采用了双缓冲消除闪屏问题。将所有要显示的画在虚拟图片上,然后一次性显示出来。我方坦克是通过事件监听机制完成的,由键盘控制,坦克可以向八个方向移动。敌军
37、的坦克的方向是随机的,需要定义一个随机数产生器。敌军的自由移动也是通过随机数产生器来实现的。主要是move()实现的。其核心代码如下:public void move() this.lastStepCoord_x = tankCoord_x;this.lastStepCoord_y = tankCoord_y;if (this.tankDirection != Direction.STOP) this.barrelDirection = this.tankDirection;limitTankCannotOutOfBounds();setEnemyTankMovingTypeAndFireFr
38、equency();public void setEnemyTankMovingTypeAndFireFrequency() if (this.category.equals(Tank.ENEMY) if (enemyTankMovingStep = 0) enemyTankMovingStep = randomNumberBuilder.nextInt(24) + 4;Direction dirs = Direction.values();int randomDirectionNumber = randomNumberBuilder.nextInt(dirs.length);tankDire
39、ction = dirsrandomDirectionNumber;enemyTankMovingStep-;setEnemyTankFireFrequency();4.3 坦克作战4.3.1 添加子弹创建Missile类,用来模拟一发子弹。通过其属性,可以区分普通子弹和超级子弹,普通子弹只能朝着坦克前进的方向发一发子弹,而超级子弹可以同时向8个方向发射8发子弹。其核心代码如下:4.3.2 发射子弹根据主战坦克的方向和位置,通过Ctrl键按键处理,可以相应的打出一发普通子弹,通过A键的按键处理,可以打出一个超级子弹。为了解决坦克停止也能打出炮弹,需要画出炮弹,每次移动后通过tank的新方向来确
40、定炮筒的方向。在Tank类中添加fire方法,其返回值是Missile,每次抬起Ctrl键的时候就打出一发子弹。为了解决炮弹不消亡的问题,加入了标识子弹生命的变量,当子弹已经死去或者子弹已经到了边界,就不需要对其重画。其中有碰撞检测的方法,不同坦克发出的子弹打到不同障碍物的不同效果。其中我方坦克打到敌人坦克的时候,会有爆炸效果产生。爆炸的效果是通过在同一地点连续播放多张图片实现的动画效果。4.3.3 将敌方坦克击毙在Missile类中加入hitTank()方法,其返回值为布尔类型,通过碰撞检测的辅助类,为tank和missile都加入getRect()方法,判断子弹是否击中对方坦克。当击中敌人
41、坦克时,子弹的生命就为false,当生命为false时将不再重画。其核心代码如下:public boolean hitTank(Tank t)if(this.missileLive & t.getTankInscribedCircle().intersects(this.getTankInscribedCircle() & t.isTankLive() & this.category != t.getCategory()if(t.getCategory()=Tank.FRIEND)t.setHP(t.getHP()-20);if(t.getHP() = 0)t.setTankLive(fals
42、e);Explode e = new Explode(missileCoord_x, missileCoord_y, tc);tc.explodes.add(e);t.tc.rankingList =t.tc.new RankingList(t.tc.highestScore);if(t.tc.rankingList.isRanking()t.tc.rankingList.setVisible(true);elset.tc.newGame = t.tc.new NewGame();t.tc.newGame.setVisible(true);if(t.getCategory()=Tank.ENE
43、MY)t.setTankLive(false);Explode e = new Explode(missileCoord_x, missileCoord_y, tc);tc.explodes.add(e);t.tc.highestScore += t.getSorce();this.missileLive = false;return true;else return false;4.4 游戏结束 当玩家坦克的生命值为0时,本局游戏结束。当玩家打破最高记录的时候,将弹出保存游戏信息的对话框,保存游戏信息完毕,将弹出游戏结束的界面,玩家可以根据自身需要,选择继续游戏或者退出该游戏。4.4.1 计
44、分功能游戏结束后,如果玩家创了新纪录,则会弹出保存玩家游戏信息的对话框,以激励玩家继续玩下一局。4.5 系统优化4.5.1 添加背景音乐为了使玩家在体验游戏乐趣的同时,可以放松心情,特意加了背景音乐,玩家可以自主选择是否开启音乐。添加音乐主要用了线程的知识,其核心代码如下:public void run() while (true) if (!stopThread) File soundFile = new File(filename);AudioInputStream audioInputStream = null;AudioFormat format = audioInputStream.getFormat();SourceDataLine auline = null;DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);auline.start();int nBytesRead = 0;byte abData = new byte1024; / 这是缓存4.5.2 加入血条在游戏开始的时候,主战坦克的血条是满的,每次被击中后,降低百分之二十,直