Java版坦克大战游戏毕业设计.docx
- 文档编号:10703014
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:31
- 大小:1.77MB
Java版坦克大战游戏毕业设计.docx
《Java版坦克大战游戏毕业设计.docx》由会员分享,可在线阅读,更多相关《Java版坦克大战游戏毕业设计.docx(31页珍藏版)》请在冰豆网上搜索。
Java版坦克大战游戏毕业设计
1引言
1.1开发背景
随着人们精神文化生活的日益丰富,为了让我们在闲暇的时间多方面发展个人的兴趣爱好,为了更好地开发个人智力,游戏成为人们生活中不可缺少的一部分。
游戏产业促动高科技技术不断升级,作为经济增长的一大支撑点,已经成为经济腾飞的“第四产业”。
作为休闲游戏的起源应该追溯到早期的俄罗斯方块和坦克大战,坦克大战是童年经常玩的游戏,也是一款经典游戏。
《坦克大战》游戏几乎家喻户晓,对我们80后90后而言,是童年最珍贵的回忆。
此款游戏是一款以红白机为平台操作射击游戏[1],玩家可以控制自己的坦克,以歼灭对方的坦克,其操作方式及其简单,是一款男女老少皆宜的游戏。
为了满足人们的个性化需求,使玩家在游戏的过程中,更能体验游戏本身的乐趣,也为了满足更好的用户体验,市场上逐渐出现了《墨水坦克大战[2]》,它是经典坦克大战的姊妹游戏,只有手机版,没有PC版,所以决定在自己大学毕业之时,开发一个PC版的《墨水坦克大战》。
1.2国内外单机游戏的研究现状
近年来,由于经济的迅速发展,科技日新月异的变化,越来越多的人会把电脑作为一种娱乐工具,而不仅仅是用它来工作,单机游戏又凭借自身操作简单,价格低廉,对电脑的配置要求低,有利于各个阶层各个行业人士使用,并且有益于身心健康,在琳琅满目的游戏中脱颖而出。
但是,对于我国国内单机游戏而言,还处于起步阶段,有着较大的商业潜力,但是也存在着正版维护意识不强,从而使得盗版有机可乘,影响市场的健全发展,还需要得到进一步的更健全的发展[3]。
1.3研究意义
单机游戏由于其不必联入互联网也可以进行游戏,从而摆脱了很多限制,只要有一台电脑即可体验游戏带来的欢乐,现在许多的单机游戏都是精工细致而成的,更能呈现出友好的界面,流畅的画面,悦耳的背景音乐,良好的游戏性。
《墨水坦克大战》只有手机版,使得手机屏幕小或者配置低的用户很难体验到《墨水坦克大战》的妙趣横生,开发PC版的《墨水坦克大战》势在必行。
开发这一游戏,不仅能够满足更多人的需要,同时,通过开发这一完整项目,使得自己能更好的巩固大学所学的知识,使理论与实践相结合,增强动手能力,进一步了解软件开发的流程,并且在这一过程中提升自己的编程能力。
在遇到问题的时候,通过查阅资料,自己解决,或者请教老师,增强了自学的能力,增加了师生的感情。
这一项目是俩人合作完成的,除了能学习到技术方面的知识,我也深刻的体会到合作的重要意义。
这也使得这次毕业设计有很重要的意义。
2开发环境及相关技术的介绍
2.1开发环境
此系统是在MicrosoftWindows7操作系统下完成的,用Java语言编写的,用Eclipse工具开发的。
2.2Java语言的特点
Java是Sun公司推出的新一代面向对象程序设计语言[4]。
首先,作为一种程序设计语言,它简单、面向对象、不依赖于机器的结构、具有可移植性鲁棒性、安全性、并且提供了并发机制、具有很高的性能。
其次,它最大限度地利用了网Java的小应用程序(Applet)可在网络上运行而不受CPU和环境的限制。
另外,Java还提供了丰富的类库,使程序设计者可以很方便地利用已有的封装好的类,迅速的建立自己的系统[5]。
1简单性
Java语言是一种比C++还面向对象的编程语言,Java略去了运算符重载、多重继承等模糊的概念,并且通过实现自动垃圾回收,大大简化了程序设计者的内存管理工作[6]。
Java抛弃了指针的概念。
由于java拥有着这些新特性,使得开发人员更容易写出“无错代码”。
2面向对象
在很多面向对象的语言里,Java才是一门纯粹的面向对象语言,Java中面向对象的思想主要体现在三大特点,即封装,继承和多态[7]。
它提供了简单的类机制以及动态的接口模型。
对象中封装了它的属性以及对应的方法行为,实现了模块化和信息隐藏,而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,大大的提高了代码的复用率。
3健壮性
一门语言的健壮性就体现在它对常见错误的预防能力,Java语言就很好的体现了这一点[8]。
Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。
它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。
4安全性
网络的快速发展,给人们的生活工作带来了很大的便利,但是于此同时,使得用户的信息不再透明化。
Java对指针进行了屏蔽,从而不能直接对内存进行操作,进而大大的提高了内存的安全性[9]。
5解释性
Java解释器生成与体系结构无关的字节码指令只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。
这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换使之能够在不同的平台运行[10]。
Java除了具有以上一些优点外,还有分布式、可移植性、多线程以及动态性。
2.3关于Eclipse
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境[11]。
幸运的是Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentTools,JDT)。
Eclipse还包括插件开发环境(Plug-inDevelopmentEnvironment,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[12]。
目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、RationalSoftware、RedHat及Sybase等。
由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。
近期,还有包括Oracle在内的许多大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。
2.4GUI技术简介
图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
Java的图形用户界面由各种组件(component)构成,在java.awt包和javax.swing包中定义了多种用于创建图形界面的组件类。
GUI是一种结合计算机科学、美学、心理学、行为学,及各商业领域需求分析的人机系统工程,强调人—机—环境三者作为一个系统进行总体设计。
这种面向客户的系统工程设计其目的是优化产品的性能,使操作更人性化,减轻使用者的认知负担,使其更适合用户的操作需求,直接提升产品的市场竞争力。
GUI即人机交互图形化用户界面设计。
纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到GUI在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了相关部门专门从事GUI的研究与设计,同业间也成立了若干机构,以互相交流GUI设计理论与经验为目的。
随着中国IT产业,移动通讯产业,家电产业的迅猛发展,在产品的人机交互界面设计水平发展上日显滞后,这对于提高产业综合素质,提升与国际同等业者的竞争能力等等方面无疑起了制约的作用。
GUI的广泛应用是当今计算机发展的重大成就之一,他极大地方便了非专业用户的使用。
人们从此不再需要死记硬背大量的命令,取而代之的是可以通过窗口、菜单、按键等方式来方便地进行操作。
而嵌入式GUI具有下面几个方面的基本要求:
轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。
2.5本章小结
本章介绍了Java语言的特点、本程序的开发环境及其相关的开发工具的原理和使用。
3系统设计及相关的技术
3.1系统可行性分析
3.1.1技术可行性
本系统采用Java语言编写,它是一种简单的,面向对象的编程语言,具有多线程,分布式,跨平台等特性。
它有自己的安全机制,并且移植性很好。
Java语言对开发网络产品有其独特的优势,本系统开发过程是利用Java编程语言和Eclipse集成开发环境配合使用来实现的。
界面主要是通过使用GUI的知识,核心功能主要运用了Java的基本知识,其中涉及到了线程方面的知识。
另外,此系统对开发环境的要求,都是大部分Java程序员进行软件开发使用的开发环境,所以技术方面也是可行的。
3.1.2经济可行性
本设计的开发是基于JDK1.7和Eclipse的,因为他们都是免费且开源的软件,只需要下载安装即可,使用的图片素材和音效素材都是网上共享的资源,该系统对操作环境没有太多要求,系统的开发不需要很强的经济支持,无需要投入太多的人力、物力,从而开发所需要的资金投入也不会很大,所以实现此需求的成本可以忽略不计。
3.1.3操作可行性
本设计是一个大家都熟悉的游戏,模拟了坦克大战的常用功能,加入敌我双方坦克,加入子弹并可以打出子弹,产生爆炸效果等一系列功能,并且加入了自己的独特元素—涂鸦风格,坦克大战的操作容易,玩家不需要了解复杂的操作流程,只要有一台电脑,可以不用网络,用户就可以体验此款游戏,使得其适合用户体验,成为一款老少皆宜的游戏。
3.2系统需求分析
3.2.1单机模式下实现的功能
(1)玩家可以通过键盘控制坦克的移动,并可以通过按键发射炮弹,包括普通炮弹和超级炮弹;
(2)敌人坦克能够自由移动和射击;
(4)能产生爆炸效果;
(5)有声音效果;
(6)有些小道具,如血瓶,通过它可以增加血条;
(7)游戏的开始界面,菜单界面,游戏界面以及游戏结束界面要美观友好。
(8)能保存玩家的游戏数据;
(9)玩家可以查看排行榜信息;
3.2.2用况建模
游戏中敌我双方坦克都可以完成射击动作,并且都可以移动,自己的坦克是通过键盘的方向键控制坦克的运动,敌人的坦克是随机运动的。
屏幕上的敌方坦克数量较多,所以需要为敌方的每一辆坦克开辟一个独立的线程,以便使其独立运行。
Java的多线程能力实现这样的游戏成为了可能。
此游戏的用例图如图3.1所示:
图3.1游戏用例图
3.3程序运行流程
3.3.1程序中炮弹的运行流程
炮弹是一个单独的类,它拥有一个很重要的变量isGood,它标识了该子弹是我方的还是敌方的,这样可以控制子弹在脱离了坦克后的运行状态中的行为。
击中墙时,子弹的生命就结束,不再继续画。
如果没有击中物体,就继续监测是否击中了坦克,这根据子弹的来源分为两种情况,来自我方时,监测是否与敌人进行了碰撞,发生碰撞时,将敌人从list中移走,并置为空,将产生爆炸效果,敌人数量减少一个。
如果来自敌人的子弹,将监测是否与我方坦克碰撞,如果碰撞,就生命值减少百分之二十。
子弹的功能流程图如3.2所示:
图3.2子弹运行流程图
3.3.2程序中小道具的运行流程
游戏中设置了奖励道具,当count值为100时,就会在屏幕上随机出现一个奖励道具,每个道具都会有自己的生命值,定义道具的生命值life为100,从道具出现开始,道具的life就做自减操作,当life的值为0时,道具就从屏幕上消失,在道具消失前如果坦克检测到道具,坦克的生命值就变成100,如果坦克没有检测到道具,则道具自动消失。
其运行流程图如图3.3所示:
图3.3运行流程图
3.4系统总体设计
3.4.1坦克大战总体功能设计
坦克大战游戏主要实现,用户启动游戏客户端选择游戏模式,分为单机模式和网络对战模式,选择单机模式可以直接进入游戏状态,通过歼灭敌人的坦克计分,歼灭不同颜色的敌人坦克可以累计不同的分值,游戏结束后,如果创造出新纪录,则弹出保存游戏纪录的对话框。
本游戏有游戏主窗体模块、坦克类模块、子弹模块、障碍物模块、爆炸模块、奖励模块、坦克客户端模块。
模块之间的关系如图3.4所示:
图3.4坦克大战功能模块图
3.4.2坦克大战的游戏规则
玩家在打开此游戏时,首先映入眼帘的是坦克大战游戏的欢迎界面,随后便自动跳入到菜单界面,玩家可以通过菜单按钮选择游戏模式后即可进入游戏界面,玩家可以选择单机版坦克大战,也可以选择网络版坦克大战。
选择某一种游戏模式后,玩家进入了游戏界面,玩家可以通过键盘的上下左右键控制坦克的移动方向,在坦克移动的过程中,玩家可以通过Ctrl键发射普通炮弹,通过A键可以发射超级炮弹。
玩家在游戏的过程中,可以获得某些小道具,从而增加血条或者生命,在玩家被消灭后可以通过F2键重新开始游戏,在一局以后,如果玩家有了新纪录,则弹出玩家信息的对话框,用来纪录玩家的游戏信息,从而增加游戏的可玩儿性,使得玩家有目标。
3.4.3客户端TankClient的设计
TankClient类是客户端的主类,它承担着整个坦克大战游戏系统的所有功能的调度工作,是游戏运行的入口。
负责键盘和鼠标的监听,游戏窗口的重画,背景音乐的播放,玩家信息的纪录。
该模块由TankClient.java文件实现,该文件是单机版的核心所在,该类中主要成员变量如下表3.5所示:
表3.5TankClient类中成员变量表
成员变量描述
变量类型
名称
游戏窗口宽度
Int
GAME_FRAME_WIDTH
游戏窗口高度
Int
Game_FRAME_HEIGHT
休眠时间
Int
SLEEPTIME
背景图片
String
BACK_GROUND_PICTURE
虚拟背景图片
Image
OffScreenImage
最高分数
Int
highestScore
该类中包含以下几个方法,其基本功能见下图:
表3.6TankClient类中主要方法
方法
功能备注
paint()
画出窗体的内容无备注
update()
调用update时自动调用无备注
launchFrame()
游戏主窗体无备注
saveHighestScore()
保存各玩家的最高游戏纪录无备注
isRanking()
榜单信息无备注
readFile()
通过此方法读取玩家信息无备注
3.4.4坦克类Tank设计
Tank类是所有坦克类的父接口。
其属性有:
坦克的身份,坦克的颜色,坦克的八个方向等。
其中定了了坦克的一些方法,比如能够控制坦克移动,判断坦克是否越界,坦克与其它坦克已经碰撞物的检测,坦克发射炮弹,包括普通炮弹和超级炮弹,玩家按键从而发出不同方向的炮弹,血条等小道具的添加也是在此类中完成的。
坦克包括我方坦克和敌人坦克。
我方坦克必须能够射击和移动,只有通过射击才能击败敌军,也只有移动才能躲避敌军的子弹和吃到奖励的小道具。
敌军坦克能够移动和发射子弹,但他们的移动和射击都是随机的,并且不需要玩家的操纵,他们是通过线程设定相应的休眠周期来控制移动和射击,敌军会向8个不同的方向移动特定的步数和射击,其中方向是通过随机函数生成的。
该模块由tank.java文件实现,创建坦克,打子弹,打超级炮弹。
处理坦克和墙相撞的问题,坦克不能相互穿越,加入我方坦克的生命值,击毙敌人坦克。
该类中主要变量如表3.7所示:
表3.7Tank类中主要成员变量表
成员变量描述
变量类型
名称
坦克在X轴的移动速度
Int
X_SPEED
坦克在Y轴的移动速度
Int
Y_SPEED
坦克的身份
String
category
坦克的生死状态
Boolean
tankLive
该类中包含以下几个方法,其功能表如表3.8所示:
表3.8Tank类中的方法功能表
方法名
功能
getEnemyTankImage()
画出敌人坦克
getFriendlyImage()
画出我方坦克
limitTankCannotOutOfBounds()
判断坦克是否越界
fire()
发射普通炮弹
superFire()
发射超级炮弹
keyReleased(KeyEvente)
键抬起的事件处理
locateDirection()
坦克的方向
tankCollidesWithWall(Wallw)
我方坦克与墙碰撞检测
tankCollidesWithTank(List
敌人坦克与墙碰撞检测
tankEatBloodBottle(BloodBottleb)
我方坦克吃血条
3.4.5子弹类设计
坦克射击后能产生一个飞行的子弹,和其它物体相撞后,能产生不同的爆炸效果,且子弹分为普通子弹和超级炮弹,玩家通过按下不同的方向键可以打出不同方向的子弹,敌人坦克打到我方坦克时,血条减少,我方打向敌人坦克时,敌人坦克消失,我方和敌方打出的子弹颜色不同。
我方坦克发出的子弹可以穿越障碍物打敌人坦克,敌人的子弹则不能穿越障碍物。
子弹分为敌军子弹和自己的子弹。
敌方每隔一段时间就会发射子弹,子弹也设定了休眠周期来控制自身的移动,当子弹击中墙或者我方坦克时时就会出现爆炸效果,我方坦克的生命值减少百分之二十,子弹随即消失。
我方坦克的子弹是通过键盘事件监听的,当按了相应的按键之后,子弹会以某种速度向坦克炮筒方向移动,如果子弹击中敌人坦克或者墙时,敌人坦克将被消灭,并产生爆炸效果。
该类中主要的成员变量,如下表3.9所示:
表3.9子弹类主要成员变量表
成员变量描述
变量类型
名称
子弹在X轴方向的速度
int
X_SPEED
子弹在Y轴方向的速度
int
Y_SPEED
子弹图片
Image
missileImage
子弹身份
String
category
该类中主要的方法如表3.10所示:
表3.10子弹类主要方法表
方法名
功能
setCategory(Stringcategory)
设置子弹的身份
isMissileLive()
判断子弹是否活着
getFriendMissileImage()
画出自己子弹的图片
getEnemyMissileImage()
画出敌人子弹的图片
missileMove()
子弹移动
hitTank(Tankt)
敌人打击我方坦克
hitTanks(List
我方坦克打击敌人坦克
hitWall(Wallw)
子弹撞墙
3.4.6爆炸类设计
每一颗子弹在消失的时候,都会产生爆炸效果。
在子弹击中对方坦克时,能产生一个爆炸,爆炸的效果是通过在一个地方按顺序播放一组不同大小的图片得到的。
3.4.7加载声音和图片类设计
为了增强游戏的可玩儿性,使得玩家在体验游戏的时候不是太枯燥,特意加入了音乐,在玩家玩儿游戏时可以开启音乐或者关闭音乐,使得游戏更加人性化,用户体验较好。
3.5本系统相关技术的介绍
3.5.1关于JavaSwing组件
所谓的JavaSwing组件,就是通过使用这些组件可以用来组成一个图形化的界面[14],例如按钮,标签等,而每一个组件拥有的不同形态可以满足用户的不同需求,帮助用户创建出友好的界面。
Swing组件包括俩大类:
一种是JComponent类,另一种就是Window类。
Window组件类主要是包括了一些可以独立显示的组件[15]。
本系统中主要运用了JFrame以及一些按钮,标签等,从而产生了一个个的游戏窗口。
产生窗口一般有两种方式,一种是通过继承JFrame,另一种则是直接实例化一个JFrame,我是通过继承的方式创建的,因为其灵活,可以定义自己的成员变量,加入自己的方法,可以直接使用里面的一些方法。
3.5.2绘图技术
Java中的任何一个图形组件,从文本框,标签到窗口,都有一个专门的一个负责显示其界面的函数[15],这个函数就是paint(),每当组件的大小,内容及位置等发生变化时,系统会自动调用paint(),该类可以被子类继承,如果子类没有重写paint(),则默认完全继承自父类。
无论组件是否有变化,父类都有一个线程,描述组件的界面。
paint()由父类自动维护,如果子类重载该函数,就必须重写方法。
3.5.3线程
线程,有时候也被称为轻量级进程,是程序执行流的最小单位。
在本系统中,多次用到了线程的概念。
如背景音乐的播放,游戏窗口的重画,等等都用到了线程。
Java中线程的创建有俩种形式,一种是继承Thread,另一种则是实现Runnable接口,可将代码和数据、CPU分开,实现了数据共享[16],在本系统中paintThread就是这种方式实现的。
3.5.4事件监听器
在本系统中,主要是对鼠标事件和键盘事件的监听。
在GUI事件处理编程时,首先要定义监听器类,该类实现特定接口中的对应方法,即用来处理自己程序的逻辑部分。
然后要在组件上添加监听器的对象,随即该监听器对组件的某一操作进行接听,从而执行不同的事件处理方法。
4系统详细设计与实现
4.1游戏界面和操作方式
4.1.1游戏欢迎界面
WelcomeScreen是系统的欢迎界面,其继承了SuperFrame类,用来显示坦克大战的欢迎界面。
该界面的设计非常简单。
它是一个最普通最简单的窗体,只是加了一张背景图片,该背景图片是有动画效果的,其动画效果是我用PhotoShop软件做的一张动态图片。
该界面意在引起玩家的兴趣,并且展示了整个游戏的风格主题—涂鸦风格。
其界面如图4.1所示:
图4.1欢迎界面截图
4.1.2菜单界面
Menu是系统的菜单界面,继承了SuperFrame类,在该界面中,玩家可以查看游戏的帮助界面,打开帮助界面后,有关于此游戏的说明以及操作的基本方法。
玩家可以自主选择游戏模式,即单机游戏还是网络对战游戏,选择网络对战游戏后,通过创建、加入即进入网络对战模式。
如果选择了单机版游戏,则直接进入游戏界面。
玩家可以根据个人的需要选择是否开启音乐,使得玩家在体验该游戏的时候不枯燥,增加游戏的用户体验。
在menu上显示了游戏的最高纪录,此记录可以引发更多的玩家挑战最高纪录,从而增加了游戏的可玩性。
在该菜单界面有排行榜按钮,点击该按钮后,可以查看各个玩家的信息,查看其排行信息。
这样,就可以激发玩家的游戏兴趣,使得玩家在体验的时候会有目标。
菜单界面如图4.2所示:
图4.2菜单界面截图
4.1.3游戏界面
游戏界面主要是TankClient里通过paintThread线程定期重画界面的,是整个游戏的核心部分,包括敌我双方坦克移动,发射炮弹,打中敌人坦克的爆炸效果等等。
该游戏界面是通过继承JFrame类,该类指定了游戏窗口的大小,加入了我方坦克并指定了位置,在游戏的主界面加入了菜单栏,并且在该界面做了关于打破新纪录后悔弹出需要保存玩家信息的界面。
该游戏界面是整个坦克大战游戏的核心
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 坦克 大战 游戏 毕业设计