java的坦克大战的设计与实现

摘要:基于Java平台设计一款PC单机坦克大战,界面简洁,操作方便,可玩性强。用Eclipse集成开发环境来开发此游戏,用多线程来解决坦克和子弹的移动,在碰撞检测的问题上使用了Java自带的Rectangle类来应对,采用随机数来控制坦克的移动距离和方向。实现了经典坦克大战的基本功能,对于增加游戏性上,将敌方坦克划分为四个等级供玩家挑战,同时有两张不同风格的地图供玩家选择。整个游戏易于上手,适应各个年龄层的人群,在诸多坦克大战游戏中具有画面简洁可玩性强的特点,能够让玩家回忆起曾经玩红白机坦克大战的快乐,是一款放松精神打发时间的好游戏。关键字:Java;坦克大战;随机;多线程;IDEA design and implementation of a tank war based on JavaStudent major in computer science Jiansong ZhuTutor: Yuancheng XieAbstruct: This single tank war is designed based on Java platform, the interface is simple, easy to operate and easy to play. Using the eclipse integrated development environment to develop the game, using multiple threads to solve the movement of tanks and bullets, to deal with the problem of collision detection, the game used java rectangle class, using random numbers to control the moving distance and the direction of the tank.The game has basic function as the classic tank war, to increase the interests of the game, the enemy tanks are divided into four levels for the play
 *好棒文|www.hbsrm.com +Q: %3^5`1^9`1^6^0`7^2# 
ers to challenge, while two different styles of map for the player to choose. The game is easy to get started and adapt to people of all ages, in many tank war games its characteristics is simple picture easy to play, it can let players recalled the happiness of playing tank war on NES .In a word ,it’s a good game can help relax spirit and pass the time.KeyWords: Java;Tank Battle;random;multi-thread;IDE绪论研究背景和意义研究背景1978年是电脑单机游戏的诞生年,世界上第一款PC游戏——《冒险岛》在美国问世,因为他的出现,带动了电脑游戏产品的发展。【8】游戏在近年来的发展十分迅速,由于经济的迅速发展,科技日新月异的变法,越来越多的人把电脑作为一种娱乐工具,而不单单是用来工作,单机游戏又凭借其自身操作简单,价格低廉,对电脑的配置要求低,有利于各个阶层各行各业的人使用,并且适度的娱乐有益于身心健康,在琳琅满目的游戏中脱颖而出。从1980年第一款坦克大战Battle City诞生至今已有32年历史了,坦克大战也发展出了许多版本,从最初的红白游戏机,到现在的网络游戏,从最开始的平面2D到现在的3D游戏,坦克大战的发展趋势是网络化,立体化和多样化。对于坦克大战这个游戏来说,游戏虽然很简单却师范又去,玩家们控制着屏幕上的坦克不断地打击攻击自己形态各异的敌人,并且还要保护自己目的的那个鹰样的标识。【3】这就是最早的坦克大战。FC(Family Computer)主机在欧美又称Nintendo Entertainment System(可译为任天堂娱乐平台即NES)。Battle City是其中最主要的作品之一,游戏一共设置30个关卡,可供两人游戏,游戏界面设置了各种不同的建筑如同砖头的阻挡物,游戏的目标是消灭全部敌方坦克作为通关条件。《坦克大战》画面精美,音效出众,在pc机的处理器80386还没有面试的当时,能在硬件上运行这种2D程序让人惊叹。研究意义在当今忙碌的生活中,简单的休闲游戏可以在我们休息的时候放松我们的身心,坦克大战这个游戏又是我们童年时期经常玩的一款经典游戏,本游戏还原了红白机坦克大战的基本功能,旨在回忆童年时的乐趣,提醒自己不忘童心,也是对红白机坦克大战的一种致敬,同时也能在制作游戏中锻炼自己的编程能力,可谓一举两得。论文的主要内容与结构本论文内容主要包括5大部分,即绪论、需求分析与可行性分析、系统总体架构,系统测试与结果分析、总结与展望。第一章是绪论,主要阐述研究课题的时代背景和历史意义,研究的目的及主要内容和方法,此部分内容为对论文大体情况的概括和总结,有利于对整篇论文进行把握。第二章是对坦克大战游戏的设计原则及需求分析进行综述和分析。第三章是对坦克大战系统总体架构的介绍及分析,其中包括游戏各模块的介绍和对系统中重要的类的列举及介绍。第四章是对坦克大战游戏的测试,包括效果测试和功能测试,附程序运行图,更加直观的展示坦克大战程序的运行。第五章为对本次设计的总结和展望。需求分析与可行性分析需求分析功能需求(1)设计一个图形用户界面,将所有游戏元素都在此界面上显示出来,界面能够接受用户的操作,具有人机交互功能。用户可以选择开始游戏,退出游戏,暂停游戏或查询游戏帮助;(2)界面中包含坦克,树和阻挡坦克运动的墙以及玩家需要保护的老家;(3)坦克分为两种,敌方坦克与受用户控制的坦克。玩家坦克和敌方坦克均可以发射子弹,改变行进的路线,且在敌方坦克行走过程中遇到不可穿越的地形会主动改变方向,而不是一直顶着障碍物不动,坦克之间不可穿越,碰撞后自动改变方向;(4)树,界面中的树用来作为遮蔽物体和装饰,以便增加游戏元素美化界面,使游戏具有真实性更加人性化。树的数目不限,以游戏整体界面的美观程度来决定数目;(5)墙,墙体分为两种,第一种是普通的墙,普通的墙在受到子弹攻击时会损坏,坦克可以穿过被破坏的区域继续行进,双方坦克均可破坏普通的墙。第二种是敌方和我方坦克都不可穿越的金属墙。金属墙不宜过多,不然游戏难度会降低;(6) 家,只有玩家方才拥有的需要保护的东西。家由普通墙体包围,“老家”在受到敌方坦克的攻击以后被破坏,玩家则被判定为输掉比赛,结束本局游戏;(7)子弹,我方坦克与地方坦克均可以发射子弹,且发射出去的子弹沿直线运动,碰到普通墙就会破坏该位置的墙,碰到金属墙及边界就会消失,子弹可以穿越树林。敌方坦克被一枚子弹击中后就会爆炸消失,我方坦克在被敌方子弹击中后并不会立即死亡,而是削减血量,血量为零时我方坦克死亡消失,且玩家输掉本局游戏;(8)爆炸,任意方坦克在被对方坦克的子弹击中后都会发生爆炸,界面中会出现效果显示该爆炸效果;(9)方向控制,坦克和子弹都拥有方向属性,且只有上下左右四个方向,子弹的方向从属于坦克的方向,子弹的方向即坦克发射子弹时的方向,不会发生改变,沿直线运动;性能需求(1)具有稳定性,游戏可以在长时间运行中不会崩溃。(2)具有可靠性和健壮性,各模块相对独立,出现事故率小且不具有广泛影响,同时在维护时便于操作。(3)响应和访问速度快,易于维护,运行过程中尽量少的占用电脑的系统资源与网络资源。可行性分析技术可行性本系统采用Java语言编写,它是一种简单的,面向对象的编程语言,具有多线程,分布式,跨平台等特性。它有自己的安全机制,并且移植性很好。Java语言对开发网络产品有其独特的优势,本系统开发过程是利用Java编程语言和Eclipse集成开发环境配合使用来实现的。界面主要是通过使用GUI的知识,核心功能主要运用了Java的基本知识,其中涉及到了线程方面的知识。另外,此系统对开发环境的要求,都是大部分Java程序员进行软件开发使用的开发环境,所以技术方面也是可行的。经济可行性本设计的开发是基于JDK和Eclipse的,因为他们都是免费且开源的软件,只需要下载安装即可,使用的图片素材都是网上共享的资源,该系统对操作环境没有太多要求,系统的开发不需要很强的经济支持,无需要投入太多的人力、物力,从而开发所需要的资金投入也不会很大,所以实现此需求的成本可以忽略不计。操作可行性本设计是一个大家都熟悉的游戏,可供一个玩家游戏,模拟了坦克大战的常用功能,加入敌我双方坦克,加入子弹并可以打出子弹,产生爆炸效果等一系列功能,坦克大战的操作容易,玩家不需要了解复杂的操作流程,只要有一台电脑,可以不用网络,用户就可以体验此款游戏,使得其适合用户体验,成为一款老少皆宜的游戏。开发环境及相关技术介绍开发环境此系统是在Microsoft Windows 7操作系统下完成的,用Java语言编写的,用Eclipse集成开发工具开发的。Java语言的特点Java编程语言是由SUN微系统公司的JAMES GOSKING于1991年主持研究开发的。它最初是用来开发网络化的商务实时系统,因而这种编程语言必须十分紧凑,高效加可靠,易于移植。【5】首先,作为一种程序设计语言,它简单、面向对象、不依赖于机器的结构、具有可移植性、安全性、并且提供了并发机制、具有很高的性能。其次,它最大限度地利用了网Java的小应用程序(Applet)可在网络上运行而不受CPU和环境的限制。另外,Java还提供了丰富的类库,使程序设计者可以很方便地利用已有的封装好的类,迅速的建立自己的系统。它具有以下几个特点:(1)简单性Java语言是一门非常纯粹的面向对象的编程语言,它吸收了C++语言的各种优点,又摒弃了C++里难以理解的多继承、指针等概念,并且通过实现自动垃圾回收,大大简化了程序设计者的内存管理工作。【2】另外,Java也适合在小型机上运行,他的基本解释器及类的支持只有40KB左右,加上标准类库和线程的支持也只有216KB左右。【1】由于Java拥有着这些新特性,使得开发人员更容易写出“无错代码”。(2)面向对象在很多面向对象的语言里,Java才是一门纯粹的面向对象语言,Java中面向对象的思想主要体现在三大特点,即封装,继承和多态。它提供了简单的类机制以及动态的接口模型。对象中封装了它的属性以及对应的方法行为,实现了模块化和信息隐藏,而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,大大的提高了代码的复用率。健壮性一门语言的健壮性就体现在它对常见错误的预防能力,Java语言就很好的体现了这一点。Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。安全性网络的快速发展,给人们的生活工作带来了很大的便利,但是于此同时,使得用户的信息不再透明化。Java对指针进行了屏蔽,从而不能直接对内存进行操作,进而大大的提高了内存的安全性。解释性Java解释器生成与体系结构无关的字节码指令只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换使之能够在不同的平台运行。Java除了具有以上一些优点外,还有分布式、可移植性、多线程以及动态性。关于EclipseEclipse是开放源代码的、基于Java的可扩展开发平台。它由IBM作为主发起人投资开发,并被Borland、Sybase等众多公司所支持,它不仅是一个集成开发环境(IDE),也是一个工具集成的开发平台,它提供了一个用于开发插件的框架,使创建、集成和使用软件工具更容易。【13】Eclipse附带了一个标准的插件集,包括Java开发工具(Java?Development?Tools?,JDT?)。Eclipse还包括插件开发环境(Plug-in?Development?Environment,PDE),这个组件主要针对希望扩展?Eclipse?的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。这种平等和一致性并不仅限于Java开发工具。尽管Eclipse是使用Java语言开发的,但它的用途并不限于Java语言,例如,支持诸如?C/C++、COBOL和Eiffel等编程语言的插件已经可用或将来会推出。Eclipse框架还可作为与软件开发无关的其他应用程序类型的基础。Eclipse最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT和PDE。目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational?Software、Red?Hat及Sybase等。由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。近期,还有包括Oracle在内的许多大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。GUI技术简介1998年12月,Sun公司正式发布了Java2平台(JDK1.2)。与JDK1.X的AWT相比,JFC的出现给Java图形界面的用户提供了强有力的工具来构建丰富美观的图形界面。【4】图形用户界面(Graphical?User?Interface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。Java的图形用户界面由各种组件(component)构成,在java.awt包和javax.swing包中定义了多种用于创建图形界面的组件类。GUI是一种结合计算机科学、美学、心理学、行为学,及各商业领域需求分析的人机系统工程,强调人—机—环境三者作为一个系统进行总体设计。这种面向客户的系统工程设计其目的是优化产品的性能,使操作更人性化,减轻使用者的认知负担,使其更适合用户的操作需求,直接提升产品的市场竞争力。GUI即人机交互图形化用户界面设计。纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到GUI在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了相关部门专门从事GUI的研究与设计,同业间也成立了若干机构,以互相交流GUI设计理论与经验为目的。随着中国IT产业,移动通讯产业,家电产业的迅猛发展,在产品的人机交互界面设计水平发展上日显滞后,这对于提高产业综合素质,提升与国际同等业者的竞争能力等等方面无疑起了制约的作用。系统总体架构游戏各模块介绍本游戏有主框体控制模块、坦克操作模块、子弹操作模块、地图绘制模块、监听菜单模块。各模块之间的关系图如图3.1所示:图 3.1 系统的总体流程图主框体控制模块TankClient是客户端的主类,它承担着整个坦克大战游戏系统的所有功能的调度工作,是游戏运行的入口。坦克、树、家、墙体等都是调用各自类里面的draw()函数来画出的,最后new一个图形面板出来,把所有元素添加进面板。界面的构造就是由TankClient类的构造方法完成,即每构造一个用户类就会产生这样一个包含各种游戏元素的界面。由于画面是静止的,游戏中坦克和子弹却都是运动的,所以要对画面进行不断地更新,重绘以表现出动态的效果。在程序中此部分功能也是有TankClient类里面的update函数和framPaint函数共同实现的,将需要“动”的元素进行重绘,而“不动”的元素如菜单项就不需要重绘,所以这也是为什么把菜单项设计进TankClient类的构造方法中。界面中的元素都是在构造界面用界面实例对象的add方法加入的。坦克操作模块图3.2 坦克的操作流程坦克主要由Tank类来实现。坦克的属性:速度(有X轴速度和Y轴速度两个),坦克大小,坦克所在的坐标(X坐标和Y坐标),坦克是否存活,行进方向等。所有这些属性都有初始化值,从而在游戏一开始就可以运行。在设计过程中,坦克出现的位置由坐标而定。用户方之后的位置由键盘监听方向按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题,这个功能由Tank类里的changToOldDir()方法实现。坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到J,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。 用户方Tank还可以吃红心来增加自己的生命值,得到一个红心,增加100生命值。所以在程序中坦克必须要有一个方法来判断当坦克接触到红心时,生命值增加的方法。程序中用eat()方法来实现“吃”红心并且增加生命值,当然,这其中要使得坦克的生命值不会超过自己生命的极限值200,所以判断的时候,当生命小于等于100时,直接加100生命值,但是当生命值大于100时,就只能使生命值加满到极限值200.当然,说到生命值,一定要在图形用户界面中显示出来,所以在Tank类里面一定要设计一个方法,来画出生命的增减过程,在Tank类里面是用DrawBloodbBar()来刻画。地图绘制模块(1)树模块树林主要是用来做修饰物体的,具有不透明性。由一个Tree类来描述,Tree有两个属性,位置和长宽。树的类里有一个自己的构造方法,当然还有一个必不可少的draw()方法。(2)墙体模块墙体分为普通墙和金属墙。普通墙可以被子弹破坏,而金属墙不会。普通墙有以下几个属性:墙的固定长度和宽度,墙的位置坐标,墙体是由图片加入到图形用户界面来表示的。程序中用CommonWall类来描述普通墙,此类里有一个构造方法,用于传递参数,还有一个draw()方法,来画指定位置的墙,另外还有个getRect()方法来构造长方形实例。金属墙的参数和普通墙完全类似,只不过金属墙不能被子弹穿破,但这个属性在接下来讨论的子弹的属性里面,由于上面已经给出里普通墙的属性,所以这里将不再赘述金属墙的属性了。子弹操作模块图3.3 子弹的操作流程子弹的属性:子弹前进的X轴和Y轴的速度——初始速度都为10,子弹的长度和宽度——初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。darw()方法和move()方法来控制画子弹和移动子弹接下来就是要考虑到子弹打到个各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接return true就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果。具体代码:public boolean hitTanks(List tanks) {//当子弹打到坦克时 for (int i = 0; i < tanks.size(); i++) { if (hitTank(tanks.get(i))) { //对每一个坦克,调用hitTank return true; } } return false; }子弹打到其他坦克上时用hitTank(Tank t) 方法,子弹打到墙上时用hitWall(CommonWall w)方法,打到金属墙上hitWall(MetalWall w),打到家hitHome(),当然在这些方法里,都要作相应的操作来表示接受到子弹的后果,普通墙要移除对应的位置,所以在方法里面又要调用remove()方法来移除,如打到家上,就要吧home的生命设置为false,从而结束游戏。实现如下:public boolean hitHome() { //当子弹打到家时 if (this.live && this.getRect().intersects(tc.home.getRect())) { this.live = false; this.tc.home.setLive(false); //当家接受一枪时就死亡 return true; } return false; }当子弹射击到对方(用户方对敌方)时,当敌方射击到用户方,用户方要减少生命值,每接受一枪,就执行t.setLife(t.getLife() - 50); 受一粒子弹寿命减少50,接受4枪就死, 坦克的生命值为200,当然方法里面还要做其他很多的判断,如生命值是否小于0,如果是的话就执行t.setLive(false);从而结束游戏。爆炸效果模块坦克的爆炸效果独立出来用一个类来描述,爆炸的属性:位置和存活状态,另外,画爆炸效果的时候要取得用户界面控制,所以要定义private static Toolkit tk = Toolkit.getDefaultToolkit();其他的方法大同小异。辅助功能模块(1)家模块是由Home类来抽象的,具体的属性有:家的大小,家的位置,家的存活状态,与树林和河流一样,家还有draw()和自己的构造方法,作用也和前面的一样,但是家还有一些新的方法,因为可以在游戏中重新开始游戏,所以要有设置方法让家重新“活”起来,当然,有时候要判断玩家现在的存活状态,所以就必须要isLive()和setLive()两个方法了。除此之外,还要有一个游戏结束界面的清理工作和提示工作,gameover()方法就是解决这个问题的。核心问题解决碰撞检测图3.4 Rectangle类java.awt中有一个Rectangle类,其中的一个方法可以用来进行碰撞检测,非常实用。Rectangle指定坐标空间的一个区域,通过坐标空间中Rectangle对象左上方的点(x, y)、宽度和高度可以定义这个区域。Rectangle类属于geom包,geom是geometry(几何)的缩写,同属这个包的还有Point类,这个包里放的也都是一些数学运算的概念类。Rectangle直接继承Object对象,所以没有很多父类属性函数要了解。一共有11个公共属性,16个公共方法。看似很多,其实很多都很容易理解。接下来着重介绍两个方法,Boolean : intersects(Rectangle r),这个方法是确定Rectangle是否与指定的Rectangle相交的方法,它传递的参数是需要做比较的Rectangle,他的返回值是Boolean类型,如果两Rectangle相交,则返回True,如果不相交则返回False。Rectangle : intersection(Rectangle r)这个方法是计算两Rectangle相交的交集,传递的参数是两个Rectangle,返回值是Rectangle这个区域。我们用于碰撞检测的函数用的是第一个方法,具体例子如下:if (this.live && this.getRect().intersects(w.getRect())) {return true; }如上方法我们便知道两个Rectangle是否相交,进而可以进行后续的判断及操作。坦克的行动坦克的行动即敌方坦克自我决定的行动方式,可以理解为坦克的智能性,本设计中对坦克行进距离和方向的控制是选择使用随机数的方法。(1)行进距离private static Random r = new Random();private int step = r.nextInt(10)+5;产生一个随机数,随机模拟坦克的移动路径,单坦克至少移动5个像素,最多移动14个像素。(2)行进方向if (!good) { Direction[] directons = Direction.values(); if (step == 0) { step = r.nextInt(10) + 5;//产生随机路径,5-14 int rn = r.nextInt(directons.length); direction = directons[rn];//产生方向 } step--;当敌方坦克下一步的行进将会导致该坦克无效,则从枚举类Direction中选择一个方向作为下一步的方向,行进距离依然是由随机数产生5到14像素的距离作为行进距离。上述代码发生在敌方坦克与任意模块发生碰撞的时候,首先进行碰撞检测,如果碰撞则重新规划下一步的行为。类的介绍Direction是一个枚举类 有L, U, R, D, STOP表示左,上,右,下和静止五个状态Home表示用户方的家的类表3.1 Direction类的属性及方法width=30家的静态全局宽度length=30家的静态全局长度xX轴坐标yY轴坐标TankClient tcTankClient对象homeImages家的图片boolean live初始存活状态为true 表示家的存活状态Home(int x, int y, TankClient tc)家的构造方法void draw(Graphics g)画出家的方法Rectangle getRect()长方形实例void gameOver(Graphics g)游戏结束方法,做清理工作和相应的提示boolean isLive()判断是否存活void setLive(boolean live)设置存活状态,以便从新开始游戏Tree描述树林的类表3.2 Tree类的属性及方法width=30树林的静态全局宽度length=30树林的静态全局长度x树林在界面中X轴坐标y树林在界面中Y轴坐标TankClient tcTankClient对象Toolkit tk取得界面的控制treeImages树林的图片Tree(int x, int y, TankClient tc)家的构造方法void draw(Graphics g)画出树林的方法Bullets描述子弹的类表3.3 Bullets类的属性及方法speedX = 10子弹的全局静态速度 x轴方向的speedY = 10子弹的全局静态速度 y轴方向的width = 10子弹的全局静态宽度length = 10子弹的全局静态长度Direction diretion子弹的方向 xX轴坐标yY轴坐标TankClient tcTankClient对象bulletImages子弹的图片boolean live初始存活状态为true 表示家的存活状态Bullets(int x, int y, Direction dir)子弹的构造方法,带三个参数Bullets(int x, int y, boolean good, Direction dir, TankClient tc)子弹的构造方法,带五个参数的void draw(Graphics g)画出子弹的方法move()刻画子弹运动的方法Rectangle getRect()长方形实例void gameOver(Graphics g)游戏结束方法,做清理工作和相应的提示的方法boolean isLive()判断是否存活boolean hitTanks(List tanks) 子弹打到敌方坦克的时候的方法boolean hitTank(Tank t)子弹打到坦克的方法boolean hitWall(CommonWall w)子弹打到普通墙的方法boolean hitWall(MetalWall w)子弹打到金属墙的方法boolean hitHome()子弹打到家的方法GetBlood血描述类表3.4 GetBlood类的属性及方法width=36血包的静态全局宽度length=36血包的静态全局长度xX轴坐标yY轴坐标TankClient tcTankClient类实例化对象Random r用于产生随机数Toolkit tktk获得用户界面bloodImages家的图片poition位置数组boolean live初始存活状态为false 表示初始化时无血包void draw(Graphics g)画出血包的方法void move()血包移动的方法Rectangle getRect()长方形实例boolean isLive()判断是否存活,是否有血包void setLive(boolean live)设置存活状态,设置血包的存在CommonWall普通墙的类表3.5 CommonWall的属性及方法width=20普通墙的静态全局宽度length=20普通墙的静态全局长度x普通墙在界面中X轴坐标y普通墙在界面中Y轴坐标TankClient tcTankClient类实例化对象,因为画墙要取得界面的控制权Toolkit tktk获得用户界面wallImages普通的图片CommonWall(int x, int y, TankClient tc)普通墙的构造方法,用于传递墙的位置参数和TankClientvoid draw(Graphics g)画出普通墙的的方法Rectangle getRect()长方形实例MetalWall金属墙的类表3.6 MetalWall的属性及方法width=30金属墙的静态全局宽度length=30金属墙的静态全局长度x金属墙在界面中X轴坐标y金属墙在界面中Y轴坐标TankClient tcTankClient类实例化对象 Toolkit tktk获得用户界面wallImages金属墙的图片MetalWall(int x, int y, TankClient tc)金属墙的构造方法,用于传递墙的位置参数和TankClientvoid draw(Graphics g)画出金属墙的的方法Rectangle getRect()长方形实例BombTank坦克爆炸类表3.7 BombTank类的属性及方法x坦克爆炸效果在界面中X轴坐标y坦克爆炸效果在界面中Y轴坐标TankClient tcTankClient类实例化对象 Toolkit tktk获得用户界面Image[] images爆炸效果的图片BombTank(int x, int y, TankClient tc)爆炸效果的构造方法,用于传递爆炸效果的位置参数和TankClientvoid draw(Graphics g)画出爆炸效果的的方法Tank描述Tank的类表3.8 Tank类的属性及方法speedX = 6坦克的全局静态速度 x轴方向的speedY = 6坦克的全局静态速度 y轴方向的width = 35坦克的全局静态宽度length = 35坦克的全局静态长度Direction diretion坦克的状态 ,初始化为静止 Direction Kdirection坦克的方向,初始化为向上Int xX轴坐标Int yY轴坐标int oldX旧状态的X轴坐标int oldY旧状态的Y轴坐标boolean live坦克是否存活,初始化为活着的TankClient tcTankClient对象int life初始化生命值为200Random r随机数,用于控制坦克的方向int step路径Image[] tankImages各个方向坦克的图片数组集合Tank(int x, int y, boolean good)坦克的构造方法1 ,带三个参数Tank(int x, int y, boolean good, Direction dir, TankClient tc)坦克的构造方法2 ,带五个参数的void draw(Graphics g)画出坦克的方法move()描述坦克运动方向的方法void changToOldDir()转换到旧方向void keyPressed(KeyEvent e)键盘监听方法void decideDirection()决定移动方向方法void keyReleased(KeyEvent e)监听键盘释放方法Bullets fire()坦克开火方法Rectangle getRect()长方形实例的方法boolean isLive()判断是否存活的方法void setLive(boolean live)设置坦克存活方法boolean isGood()用于返回是否是good状态boolean collideWithWall(CommonWall w)坦克碰到普通墙的解决方法boolean collideWithWall(MetalWall w)坦克碰到金属墙的解决方法boolean collideRiver(River r)坦克碰到河流的解决方法boolean collideHome(Home h)坦克碰到家的解决方法Boolean collideWithTanks(java.util.List tanks)坦克撞到坦克的解决方法int getLife()获得坦克的生命状态的方法void setLife(int life)设置坦克的生命状态的方法boolean eat(GetBlood b)坦克吃红心血包的方法int getX()确定X的位置的get方法int getY()确定Y的位置的get方法TankClient坦克用户类,继承Frame,实现ActionListener接口实例化各个类的容器:List theRiver = new ArrayList(); List tanks = new ArrayList(); List bombTanks = new ArrayList(); List bullets = new ArrayList(); List trees = new ArrayList(); List homeWall = new ArrayList(); // 实例化对象容器 List otherWall = new ArrayList(); List metalWall = new ArrayList();表3.9 TankClient类的属性及方法int Fram_width 游戏用户界面的全局静态变量宽度,初始化为800int Fram_length游戏用户界面的全局静态变量长度,初始化为600void update(Graphics g)图形用户界面的更新方法void framPaint(Graphics g)画图形用户界面的方法,需要重画的界面元素都在这个方法里面void actionPerformed(ActionEvent e)监听菜单项的方法static void main(String[] args)主函数,启动整个程序用户类主要是综合调用各个类来协作完成游戏的设计。系统测试与分析程序效果测试(1)菜单项测试菜单项可以选择菜单项可以选择开始新游戏,退出,暂停,继续,帮助功能,对于开始新游戏,退出两个功能,要给出提示,用户是否真的想继续操作!图4.1 菜单项测试界面点击开始新游戏后弹出对话框图4.2 开始新游戏弹出框确定后将开始新游戏,取消则会返回原来的界面。(2)暂停功能测试图4.3 暂停游戏界面(3)帮助功能测试图4.4 帮助界面(4) 退出功能测试图4.5 退出游戏弹出框游戏功能测试子弹击中目标爆炸效果测试图4.6 子弹击中坦克测试图图中红色类似爆炸的图像是玩家击中敌方坦克后的爆炸效果子弹击中普通墙后的效果图4.7 子弹击中普通墙测试图图中残破的类似砖墙的地方即被子弹击中过后的普通墙血包生成测试图4.8 血包生成测试图图中被树林挡住的心形物体就是用来补血的道具,坦克移动经过心形时就会补血,下方血条即可得到补充。补血测试 图4.9 未补充血量图 图4.10 补充血量的图 玩家坦克吃过血包后可见血条已补充血量被击败测试图4.11 游戏结束界面当玩家血量耗尽或“老家”被击破后,游戏失败,弹出上图中的提示。获胜测试图4.12 游戏胜利界面当玩家获胜后会显示上图中提示,你赢了!总结与展望经过两个多月的学习,研究与开发,从选题,收集资料,学习相关技术,看网上学习视频,到最后实际手动编程,期间遇到不少的问题,但最后,坦克大战游戏的基本功能已经实现出来。我所设计的坦克大战游戏中敌方的坦克可以自行的解决移动问题,难度有一定保证,再加上一些图片的帮助,游戏的观赏性也有了一定的提高。通过这次毕业设计,我学会了一些编程技巧,变量及函数的命名规则,也巩固了平时学习的理论知识,更进一步理解了面向对象的思想,对调试程序的错误也有了更深一步的认识。在使用Eclipse集成开发环境时也感受到了这个软件的强大,对代码编写者有很大帮助,对于撰写毕业论文也有了相当的认识,掌握了它的规则规范。对于一个简单的PC休闲游戏,设计中依然有一些不足之处,目前还存在的一些问题有如下几点,由于没有美术功底,合适的素材也并不容易找到,界面没有达到很美观的程度,欢迎界面的缺失也是一个问题,敌方坦克的人工智能方面略欠缺等,同时,自己在测试调试时还有很多的敌方需要改进。参考文献[1] 白亮. Java简介[J]. 厦门科技, 2005, (2): 27-29[2] 李刚. 疯狂Java讲义[M]. 电子工业出版社, 2009-04.[3] 兔子爱吃草. 百玩不厌的坦克大战[J]. 软件导刊, 2003, 4(4): 126-127[4] 吕校春;李玲莉. 基于Swing的Java GUI组件开发[J]. 机械工程师, 2008, 5(5): 129-131[5] 徐白雁. JAVA编程语言及其应用[J]. 电脑信息与技术, 1996, 4(4): 32-34[6] Cay?S.Horstmann, Gary?Cornell. Java核心技术卷I:基础知识[M]. 机械工业出版社, 2008[7] Adewole Adewumi,Sanjay Misra,Nicholas Omoregbe.??A Review of Models for Evaluating Quality in Open Source Software [A]. Proceedings of 2013 International Conference on Electronic Engineering and Computer Science (EECS 2013 V4)[C]. 2013[8] 电脑爱好者杂志社. 电脑游戏发展中的重头戏[J]. 电脑爱好者, 2008, 13(13): 9-9[9] Tien Lung Sun, Chien Hua Huang.?Design and Development of Kinect-Based Exergame for Balance Control Training [A]. Proceedings of the Eleventh International Conference on Information and Management Sciences in Celebration of the 60th Birthday of Prof. Shu Cherngfang [C]. 2012[10]Georges?Gauthier?Merx,?Ronald?J.?Norman.??Unified?Software?Engineering?with?Java[M].? 机械工业出版社,2008?[11] 宋中山;严千钧. Java程序设计[M]. 清华大学出版社, 2005[12] Bruce?Eckel.?Thinking?in?Java[M].?机械工业出版社,2007?.28-34[13] 刘洪星;谢玉山. Eclipse开发平台及其应用[J]. 武汉理工大学学报(信息与管理工程版), 2005, (2): 89-92[14] Chan Woo Ahn, Chae Woon Kim.??Exercise Motivations of the Participated in Darts Sports: Involvement, Fun, and Continuance Factors [A]. Proceedings of 2014 Incheon Asian Games International Sport Science Congress [C]. 2014
目录
摘要 1
关键字 1
Abstruct 1
KeyWords 1
1. 绪论 2
1.1.研究背景和意义 2
1.1.1. 研究背景 2
1.1.2. 研究意义 2
1.2. 论文的主要内容与结构 3
2. 需求分析与可行性分析 3
2.1. 需求分析 3
2.1.1. 功能需求 3
2.1.2. 性能需求 4
2.2. 可行性分析 4
2.2.1. 技术可行性 4
2.2.2. 经济可行性 5
2.2.3. 操作可行性 5
2.3. 开发环境及相关技术介绍 5
2.3.1. 开发环境 5
2.3.2. Java语言的特点 5
2.3.3. 关于Eclipse 6
2.3.4. GUI技术简介 7
3. 系统总体架构 8
3.1. 游戏各模块介绍 8
3.1.1 主框体控制模块 9
3.1.2 坦克操作模块 9
3.1.3 地图绘制模块 11
3.1.4 子弹操作模块 11
3.1.5 爆炸效果模块 13
3.1.6 辅助功能模块 13
3.2. 核心问题解决 14
3.2.1 碰撞检测 14
3.2.2.坦克的行动 15
3.3. 类的介绍 15
4. 系统测试与分析 22
4.1. 程序效果测试 22
4.2. 游戏功能测试 23
5. 总结与展望 27
参考文献 27
基于Java的坦克大战的设计与实现

版权保护: 本文由 hbsrm.com编辑,转载请保留链接: www.hbsrm.com/jsj/jsjkxyjs/2231.html

好棒文