毕业设计java版坦克大战.docx
《毕业设计java版坦克大战.docx》由会员分享,可在线阅读,更多相关《毕业设计java版坦克大战.docx(37页珍藏版)》请在冰豆网上搜索。

毕业设计java版坦克大战
毕业设计(论文)
题目:
JAVA版坦克大战
2014年11月20日
JAVA版坦克大战
摘要
J2SE(Java2StandardEdition)/(java2标准版)是近年来随着各种不同技术的发展,尤其是编程语言飞速发展而诞生的一项新的开发语言。
随着信息技术的飞速发展,计算机的使用也日渐普及。
本文从实际应用出发,研究并开发实现了一个坦克大战的游戏程序。
在Eclipse平台下开发调试。
玩家坦克的运行是通过键盘响应事件控制,敌方坦克则是自动运行并具有了一定的智能性。
程序进行了精简和优化,游戏运行流畅,具有一定的吸引力。
本游戏就是一款基于J2SE的游戏。
本游戏主要是运用JAVAGUI的知识实现的。
Java图形用户界面(GUI)是指采用图形方式显示的计算机操作用户界面。
讲到这里必须得提一下Applet,Applet是镶嵌在网页上运行的小应用程序,Applet的paint()方法用于绘制显示区域,本游戏的坦克就是用这个方法绘制出来的。
早期的java提供的GUI类库(java.awt)称之为AbstractWindowToolkit,即AWT,AWT功能不是很好,不能很好的访问操作系统中高级的GUI特性,生成的程序外观很一般。
Swing是JDK1.2以后提供的GUI类库,即:
javax.swing,使用方便,界面更加美观。
Eclipse提供的StandardWidgetToolkit用户界面开发包,SWT能够充分利用本机系统的GUI。
关键词:
游戏,Java,坦克,智能
JavaTankWarGameDevelopment
Abstract
J2SEisakindoffastdevelopingtechnologyimplementedonvariousdevicesespeciallyequipments.Withtherapiddevelopmentofinformationtechnology,computerusehasbecomemorepopular,thepracticalapplicationofthispapertointroducethedesignandimplementationofthegameBattleCity.Ittransportstheclassicalproducttocomputer,offeringcorrespondingsoftwareforsuchmorepopularhardwareplatform.Eclipseplatformsimulator.Theplayer’stankiscontrolledbykeyboardresponseevents,whiletheenemy’stankisoperatedautomaticallyandisofintelligence.Havingbeenstreamlinedandoptimized,thegamesystemcanrunfluentlyandattracttheplayers.
ThispaperdescribesthehistoryofBattleCity,javarelatedtechnologiesandtheproceduresofstructuralanalysisandtherealizationofspecificfunctions.GameprogrammingenvironmentinEclipse3.5.1.Itsmainfeaturesare:
tomovearound.capableoffiringbulletsagainstenemy.theenemycanmove.tosimulatetheexplosion.tocreateanobstacle.toincreasethelife
Keywords:
game,Java,tank,Smart
绪论
《坦克大战》(BattleCity)是1985年日本南梦宫Namco游戏公司在任天堂FC平台上,推出的一款多方位平面射击游戏。
游戏以坦克战斗及保卫基地为主题,属于策略型联机类。
同时也是FC平台上少有的内建关卡编辑器的几个游戏之一,玩家可自己创建独特的关卡,并通过获取一些道具使坦克和基地得到强化。
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE,JavaEE,JavaME)的总称。
Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
网络化的市场让游戏变成人和人的交战,而不是人和电脑的对战,这样可以增加游戏的难度、游戏的时间和游戏的寿命。
立体化是为了适应现在越来越3D的趋势,游戏有必要做的更加的完善,趋向3D并且加重环境描写。
多样化则是增加游戏的任务、游戏的耐玩性,而在坦克大战里增加更多的内容加大其可玩性,比如:
装备、对战方式、任务合作模式等等。
可以想像,如果坦克大战还是人机对战的模式,并且协作性不提高的话,玩家对该游戏的选择性将大大降低。
本设计就是想对该游戏进行分析研究,借助于它的游戏规则,用JAVA语言模拟开发一个类似的、功能相对比较简单的小游戏。
第1章系统开发环境及语言介绍
1.1开发环境
操作系统:
MicrosoftWindowsXP
开发语言:
Java
开发工具:
Eclipse
1.2关于java语言的起源
Java平台和语言最开始只是SUN公司在1990年12月开始研究的一个内部项目。
SUN公司的一个叫做帕特里克·诺顿的工程师被自己开发的C和C语言编译器搞得焦头烂额,因为其中的API极其难用。
帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。
“Stealth计划”后来改名为“Green计划”,JGosling(詹姆斯·高斯林)和麦克·舍林丹也加入了帕特里克的工作小组。
他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,SUN公司预料未来科技将在家用电器领域大显身手。
团队最初考虑使用C语言,但是很多成员包括SUN的首席科学家比尔·乔伊,发现C和可用的API在某些方面存在很大问题。
工作小组使用的是内嵌类型平台,可以用的资源极其有限。
很多成员发现C太复杂以至很多开发者经常错误使用。
他们发现C缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。
最后,他们想要一种易于移植到各种设备上的平台。
根据可用的资金,比尔·乔伊决定开发一种集C语言和Mesa语言搭成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议SUN公司的工程师应该在C的基础上,开发一种面相对象的环境。
最初,高斯林试图修改和扩展C的功能,他自己称这种新语言为C--,但是后来他放弃了。
他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的树而命名。
就像很多开发新技术的秘密的工程一样,工作小组没日没夜地工作到了1992年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库,和其硬件。
最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为“Duke”的智能代理来帮助用户。
1992年12月3日,这台设备进行了展示。
同年11月,Green计划被转化成了“FirstPerson有限公司”,一个SUN公司的全资子公司,团队也被重新安排到了帕洛阿尔托。
FirstPerson团队对建造一种高度互动的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时(Requestforproposal),FirstPerson改变了他们的目标,作为对征求意见书的响应,提出了一个机顶盒平台的提议。
但是有线电视业界觉得FirstPerson的平台给予用户过多地控制权,因此FirstPerson的投标败给了SGI。
与3DO公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在电视工业产生任何效益,公司再并回SUN公司。
1994年6、7月间,在经历了一场历时三天的头脑风暴的讨论之后,约翰·盖吉、詹姆斯·高斯林、比尔·乔伊、帕特里克·诺顿、韦恩·罗斯因和埃里克·斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。
他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。
作为原型,帕特里克·诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava。
同年,Oak改名为Java。
商标搜索显示,Oak已被一家显卡制造商注册,因此团队找到了一个新名字。
这个名字是在很多成员常去的本地咖啡馆中杜撰出来的。
名字是不是首字母缩写还不清楚,很大程度上来说不是。
虽然有人声称是开发人员名字的组合:
JamesGosling(詹姆斯·高斯林)ArthurVanHoff(阿瑟·凡·霍夫)AndyBechtolsheim(安迪·贝克托克姆),或“JustAnotherVagueAcronym”(只是另外一个含糊的缩写)。
还有一种比较可信的说法是这个名字是出于对咖啡的喜爱,所以以Java咖啡来命名。
类文件的前四个字节如果用十六进制阅读的话,分别为CAFEBABE,就会拼出两个单词“CAFEBABE”(咖啡宝贝)。
1994年10月,HotJava和Java平台为公司高层进行演示。
1994年,Java1.0a版本已经可以提供下载,但是Java和HotJava浏览器的第一次公开发布却是在1995年5月23日SunWorld大会上进行的。
SUN公司的科学指导约翰·盖吉宣告Java技术。
这个发布是与网景公司的执行副总裁马克·安德森的惊人发布一起进行的,宣布网景将在其浏览器中包含对Java的支持。
1996年1月,升阳公司成立了Java业务集团,专门开发Java技术。
1.3关于Eclipse
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentKit,JDK)。
Eclipse是著名的跨平台的自由集成开发环境(IDE)。
最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。
Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。
许多软件开发商以Eclipse为框架开发自己的IDE。
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集成者,使用者只需下载各种语言的插件即可。
第2章游戏需求分析
2.1可行性分析
1)游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。
一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、健盘事件都会以极高的频率在后台等待循环。
因此,其逻辑设计应当相当严谨,需将所有可能发生的事件和各种意外情况考虑在设计中。
2)游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,屏幕刷新的双缓冲等都有较好的解决方案。
3)我方的坦克的运行可以通过键盘响应事件控制,但敌方坦克则因为是自动运行,就需要有一定的智能性;同时,出现在屏幕上的敌方坦克可能会有较多的数量,这需要为每个敌方坦克开辟一个线程以便能让其独立运行。
Java的多线程能力为实现这样的游戏提供了可能。
4)对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。
敌方坦克子弹仅需要扫描我方坦克,而我方坦克需要在每一步扫描所有的敌方坦克。
这需要对所有的对象有较好的控制。
另外,子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。
如此过多的线程同时在本来效率就不高的机器上运行,可能会导致程序的缓慢。
5)双方坦克在前进时也考虑到是否碰撞到相关物体或对方坦克,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。
6)java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。
开发过程中要对结构和变量的使用进行控制。
2.2游戏规则和系统功能介绍
游戏中坦克能向八个方向移动,和友方坦克碰到后不能穿越。
坦克能向八个方向发射子弹,子弹击中坦克产生爆炸,玩家坦克还能发射同时向八个方向发射集束炸弹。
地图上有障碍物,坦克和子弹都不能穿越障碍物。
玩家坦克有生命数,还有生命值,被敌人子弹击中后生命值减少,生命值为0后坦克爆炸,开始新坦克的操作按F2。
地图上有随机出现的加生命值的血块,吃恢复生命值满,游戏的目的是操作自己的坦克消灭敌人坦克,消灭所有敌人坦克后游戏结束。
基于Java语言的各种特性,本软件使用Java语言进行开发,并最终完成当初的设计要求,所有的程序以及其程序功能如表2.1所示。
表2.1程序功能表
程序名
功能
TankClient.java
游戏的主窗口
Tank.java
坦克的数据和方法
Missile.java
炮弹的数据和方法
Explore.java
爆炸的数据和方法
Wall.java
墙的数据和方法
Blood.java
血块的数据和方法
2.3程序运行流程
2.3.1子弹运行流程
子弹实现了Missile这个接口中的某些方法,运行在独立的线程中,它拥有一个很重要的变量good。
它标识了子弹是属于玩家的还是敌人的,这样可以控制子弹再脱离坦克后的运行状态中的行为,其中主要功能流程图见图3-1流程图。
当击中了需要做出反应的物体时,就分别采取措施:
击中墙时,子弹生命就结束,不再继续画.如果没有击中物体,就继续检测是否击中了坦克,这根据子弹的来源分为两种情况.当来自玩家时,检测是否与敌人碰撞,发生碰撞时,将敌人从List中移走,并置为空,产生爆炸效果,敌人数量减少一位,敌人屏幕上数量减少一位。
如果是来自敌人的子弹,将同样检测与玩家坦克的碰撞,如有碰撞,玩家生命就减少,当生命值为0时,就死亡了。
下图为子弹运行的主要流程:
图2.1子弹运行流程图
2.3.2敌方坦克运行流程
N
Y
图2.2敌方坦克运行流程图
第3章游戏总体设计
3.1主框架模块
该模块由TankClient.java文件实现,负责调用各个类。
创建游戏窗口。
该类中的一些主要方法如表3.1所示。
表3-1Tankclient类中成员变量表
成员变量描述
变量类型
名称
整个游戏的宽度
int
GAME_WIDTH
整个游戏的高度
int
GAME_HEIGHT
该类中包括lauchFrame(),paint(),update()三个方法,其功能表如表3-2
表3-2Tankclient类中方法表
方法
功能
备注
lauchFrame()
显示坦克主窗口
无备注
paint(Graphicsg)
重画时调用
无备注
update(Graphicsg)
使用双缓冲消除闪烁现象
无备注
3.2子弹模块
该模块由Missile.java文件实现,实现子弹的各个功能,实现打坦克、实现子弹是否活着的功能。
该类中的变量如表3.3所示。
表3-3Missile类中成员变量表
成员变量描述
变量类型
名称
子弹在X方向上的速度
int
XSPEED
子弹在Y方向上的速度
int
YSPEED
子弹的高度
int
HEIGHT
该类中包括hitTank(),Islive()二个方法,其功能表如表3-4
表3-4Missile类中方法表
方法名
功能
备注
hitTank(Tankt)
实现子弹撞坦克的功能
无备注
Islive()
实现判断子弹是否活着的功能
无备注
3.3坦克模块
该模块由Tank.java文件实现,创建坦克,打子弹,打多发子弹。
处理坦克和墙相撞的问题。
坦克不能相互穿越。
加入主战坦克的生命值。
击毙敌人坦克。
让坦克更加智能。
该类中的变量如表3-5所示
表3-5Tank类中成员变量表
成员变量描述
变量类型
名称
坦克在X方向上的速度
int
XSPEED
坦克在Y方向上的速度
int
YSPEED
坦克的高度
int
HEIGHT
该类中包括collidesWithWall(),Eat()二个方法,其功能表如表3-6
表3-6Tank类中方法表
方法名
功能
备注
collidesWithWall(Wallw)
处理坦克和墙相撞的问题
无备注
Eat(Bloodb)
坦克吃血,增长生命
无备注
3.4墙模块
该模块由Wall.java文件实现,添加两堵墙,处理坦克和墙相撞的问题。
该类中的变量如表3-7所示。
表3-7Wall类中成员变量表
成员变量描述
变量类型
名称
墙的起始位置坐标
int
X.Y
墙的宽度
int
W
墙的高度
int
H
该类中包括collidesWithWall()一个方法,其功能表如表3-8
表3-8WallTank类中方法表
方法名
功能
备注
collidesWithWall(Wallw)
处理坦克和墙相撞的问题
无备注
3.5血液模块
该模块由Blood.java文件实现,添加必要的方法,让血块按照一定轨迹运动,并在一定时间消失。
该类中的变量如表3-9所示。
表3-9Blood类中成员变量表
成员变量描述
变量类型
名称
血块在X轴的坐标
Int
X
血块在X轴的坐标
Int
Y
血块的宽度
Int
W
血块的高度
Int
H
该类中包括Move(),islive()二个方法,其功能表如表3-10所示。
表3-10BloodTank类中方法表
方法名
功能
备注
Move()
处理血块移动的问题
无备注
islive()
判断血块是否活着
无备注
3.6爆炸模块
该模块由Explode.java文件实现,击毙一辆坦克后产生爆炸。
该类中的变量如表3-11所示。
表3-11Explode类中成员变量表
成员变量描述
变量类型
名称
坦克生死的描述
boolean
Live
主类的变量
TankClient
Tc
该类中包括GetDefaultToolkit(),Draw(Graphics)二个方法,其功能表如表3-12
表3-12Explode类中方法表
方法名
功能
备注
GetDefaultToolkit()
拿到的工具包
无备注
Draw(Graphics)
画爆炸现象
无备注
第4章游戏详细设计与实现
4.1游戏窗口与我方坦克
1)窗口
产生一个窗口,添加关闭窗口的事件处理,不允许窗口的大小改动。
通过如下代码实现。
图4-1游戏窗口
importjava.awt.*;
importjava.awt.event.*;
publicclassTankClientextendsFrame{//建立游戏窗口
publicvoidlauchFrame(){
this.setLocation(400,300);
this.setSize(800,600);//窗口大小
this.setTitle("TankWar");//窗口命名
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
this.setResizable(false);
setVisible(true);
}
publicstaticvoidmain(String[]args){
TankClienttc=newTankClient();
tc.lauchFrame();
}
}
2)画出代表坦克的实心圆
重写paint方法。
注意:
不要改变原来的前景色
图4-2单个坦克
publicvoidpaint(Graphicsg){
Colorc=g.getColor();
g.setColor(Color.RED);//坦克颜色
g.fillOval(50,50,30,30);//坦克尺寸
g.setColor(c);
}
3)让坦克动起来
将位置改变为变量,启动线程不断重画,线程重画更均匀,更能控制重画的速度。
按键重画不能解决子弹自动飞行的问题。
每次重画改变Tank位置。
注意:
x,y值得含义,指的是小方块的左上角点。
图4-3单个坦克移动
privateclassPaintThreadimplementsRunnable{
publicvoidrun(){
while(true){
repaint();
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
4)使用双缓冲消除闪烁现象
原因:
刷心重画频率太快,paint方法还没有完成,逐条显示。
解决:
将所有东西画在虚拟图片上,一次性显示出来。
图4-4消除闪烁
publicvoidupdate(Gr