JAVA语言写的坦克大战详细说明手册.docx

上传人:b****8 文档编号:10081157 上传时间:2023-02-08 格式:DOCX 页数:21 大小:133.27KB
下载 相关 举报
JAVA语言写的坦克大战详细说明手册.docx_第1页
第1页 / 共21页
JAVA语言写的坦克大战详细说明手册.docx_第2页
第2页 / 共21页
JAVA语言写的坦克大战详细说明手册.docx_第3页
第3页 / 共21页
JAVA语言写的坦克大战详细说明手册.docx_第4页
第4页 / 共21页
JAVA语言写的坦克大战详细说明手册.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

JAVA语言写的坦克大战详细说明手册.docx

《JAVA语言写的坦克大战详细说明手册.docx》由会员分享,可在线阅读,更多相关《JAVA语言写的坦克大战详细说明手册.docx(21页珍藏版)》请在冰豆网上搜索。

JAVA语言写的坦克大战详细说明手册.docx

JAVA语言写的坦克大战详细说明手册

陕西国防学院

《Java语言》课程期末实训

题目坦克大战

学院电子信息学院

专业软件技术

班别软件3132班

学号3531323X

姓名小智

2015年3月6日

一、课程题目

◆坦克大战(Java版本)

实现一个java版本的坦克大战游戏

【功能提示】

1.游戏要有图形用户界面,界面能够反映游戏所有的细节。

2.界面中要有坦克,墙,树林,河流。

3.界面中要有一个“家”,“家”被攻击中则输了游戏。

4.坦克分两种,敌方和我方。

5.墙也分为两种,可以穿透的普通墙,不可以穿透的铁墙。

6.树和河流均只有一种,树林坦克可以通过。

7.坦克可以发射子弹,敌我方的子弹属性一样。

8.我方子弹可以杀死敌方坦克,敌方子弹也可以杀死我方坦克,但需要多枪子弹才可以杀死。

9.敌方之间不可以杀死对方。

10.子弹击中坦克要有爆炸,但击中墙不能爆炸。

11.我方可以吃血包增加生命。

12.游戏可以暂停,重新开始,游戏帮助等功能。

具体如下图:

二、题目分析与设计

⏹需求分析

1.设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。

用户可以选择重新开始游戏,退出游戏,暂停游戏和查找游戏帮助。

2.界面中包含坦克,树,河流,阻挡墙和游戏用户所要保护的“家”。

3.坦克:

坦克分为两种,敌方坦克和用户控制的坦克。

用户方和敌方坦克均可以发射子弹,可以改变路径的行走,且在行走过程中遇到墙等阻碍物和游戏边界时要改变方向,而不能一直顶着障碍物不放。

坦克之间不能穿越,碰撞到后自动调换方向。

4.树:

界面中要包括树林,作为遮掩物体和修饰物体,以便增加游戏的元素,使得游戏更加贴切人性化。

树的数目不限,以游戏整体界面清晰美观来决定数目。

5.河流:

界面中要包括河流,河流作用与树林相同,同样河流的数目不限,以游戏界面整体美观度来决定数目。

6.墙:

墙体分为两种,普通的墙和铁墙,普通的墙在受到子弹袭击时会损坏,而铁墙可以阻碍子弹的穿越。

两方的坦克均不能穿越两种墙体,但都可以摧毁普通墙体。

普通墙体的数目配合其他元素合理安排,铁墙则不宜过多,不然游戏难度太低甚至因为坦克不能穿越铁墙而使得游戏无法进行下去。

7.“家”:

用户方除了有一辆自己的坦克外还有一个要保护的家,家由普通墙体包围,家受到子弹攻击后游戏立即结束,用户方则输了本局游戏。

8.子弹:

子弹可以由敌方和用户方发射,且发射出去的子弹可以直线移动,直到碰到障碍物就消失,子弹可以穿越树林和河流。

敌方坦克受到一颗子弹攻击会爆炸从而导致死亡,死亡后坦克消失。

用户方受到子弹攻击后会减少寿命,且受到四次攻击则死亡,此时如还有敌方坦克存在,则用户方输掉本次游戏。

9.爆炸:

当子弹射击到坦克身上时,要产生爆炸效果。

10.方向:

坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。

⏹具体设计

以下的论述均根据上面需求分析的顺序来安排:

1.图形用户界面

图形用户界面要用到Java课程里的第六章的知识,需要用到抽象窗口工具集即AWT和Swing来设计实现,由于游戏需要有功能按键来控制游戏的重新开始,退出,暂停,帮助等,所以在实现过程中,设计菜单项。

坦克,河流,树,家,墙等都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。

界面的构造在程序中由TankClient类的构造方法来完成,即没构造一个用户类都会产生这样一个包含各种游戏元素在内的界面。

由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的普通墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。

在程序中,此部分功能也是由TankClient类里的update函数和framPaint函数共同实现,将“动”的元素进行重画,而不动的元素如菜单项就不用重画,所以这也是为什么把菜单项设计进TankClient类的构造方法中。

当然,图形用户界面中也包括对各种界面元素的大小,位置和颜色等设计,细节问题这里就不赘述。

2.界面中的元素

界面中的元素都是在构造界面的时候用界面实例对象的add方法加入进去的,且“动”的元素要不断更新重画。

3.坦克

坦克主要由Tank类来实现。

坦克的属性:

速度(有X轴和Y轴速度之分),坦克大小,坦克所在新的位置(X坐标和Y坐标),坦克是否还活着,行动方向等。

所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行。

在设计过程中,坦克出现的位置由坐标而定。

用户方之后的位置由键盘监听方向,按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。

敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题,这个功能由Tank类里的changToOldDir()方法实现。

坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。

Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到F,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。

由于坦克在碰到墙,界面边界和“家”等阻碍物时要改变方向,所以在Tank里面必须对于每一种阻碍物要设计一个方法来作为应对策略,当然解决方法是把下一步的位置调整到上一步的位置。

用户方Tank还可以吃红心来增加自己的生命值,得到一个红心,增加100生命值。

所以在程序中坦克必须要有一个方法来判断当坦克接触到红心时,生命值增加的方法。

程序中用eat()方法来实现“吃”红心并且增加生命值,当然,这其中要使得坦克的生命值不会超过自己生命的极限值200,所以判断的时候,当生命小于等于100时,直接加100生命值,但是当生命值大于100时,就只能使生命值加满到极限值200.当然,说到生命值,一定要在图形用户界面中显示出来,所以在Tank类里面一定要设计一个方法,来画出生命的增减过程,在Tank类里面是用DrawBloodbBar()来刻画。

4.树林

树林主要是用来做修饰物体的,具有不透明性。

由一个Tree类来描述,Tree有两个属性,位置和长宽。

树的类里有一个自己的构造方法,当然还有一个必不可少的draw()方法。

5.河流

河流的作用与树林类似,这里不再赘述。

6.墙体

墙体分为普通墙和铁墙。

普通墙可以被子弹损坏,而铁墙则不会。

Ø普通墙

普通墙有以下几个属性:

墙的固定长度和宽度,墙的位置坐标,墙体是由图片加入到图形用户界面来表示的。

程序中用CommonWall类来描述普通墙,此类里有一个构造方法,用于传递参数,还有一个draw()方法,来画指定位置的墙,另外还有个getRect()方法来构造长方形实例。

Ø金属墙

金属墙的参数和普通墙完全类似,只不过金属墙不能被子弹穿破,但这个属性在接下来讨论的子弹的属性里面,由于上面已经给出里普通墙的属性,所以这里将不再赘述金属墙的属性了。

7.家:

家是由Home类来抽象的,具体的属性有:

家的大小,家的位置,家的存活状态,与树林和河流一样,家还有draw()和自己的构造方法,作用也和前面的一样,但是家还有一些新的方法,因为可以在游戏中重新开始游戏,所以要有设置方法让家重新“活”起来,当然,有时候要判断家现在的存活状态,所以就必须要isLive()和setLive()两个方法了。

除此之外,还要有一个游戏结束界面的清理工作和提示工作,gameover()方法就是解决这个问题的。

8.子弹:

子弹的属性:

子弹前进的X轴和Y轴的速度——初始速度都为10,子弹的长度和宽度——初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。

由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。

如:

imgs.put("L",bulletImages[0]);

类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。

darw()方法和move()方法来控制画子弹和移动子弹

接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接returntrue就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果。

具体代码:

publicbooleanhitTanks(Listtanks){//当子弹打到坦克时

for(inti=0;i

if(hitTank(tanks.get(i))){//对每一个坦克,调用hitTank

returntrue;

}

}

returnfalse;

}

子弹打到其他坦克上时用hitTank(Tankt)方法,子弹打到墙上时用hitWall(CommonWallw)方法,打到金属墙上hitWall(MetalWallw),打到家hitHome(),当然在这些方法里,都要作相应的操作来表示接受到子弹的后果,普通墙要移除对应的位置,所以在方法里面又要调用remove()方法来移除,如打到家上,就要吧home的生命设置为false,从而结束游戏。

实现如下:

publicbooleanhitHome(){//当子弹打到家时

if(this.live&&this.getRect().intersects(tc.home.getRect())){

this.live=false;

this.tc.home.setLive(false);//当家接受一枪时就死亡

returntrue;

}

returnfalse;

}

还有,当子弹射击到对方(用户方对敌方)时,当敌方射击到用户方,用户方要减少生命值,没接受一枪,就执行t.setLife(t.getLife()-50);//受一粒子弹寿命减少50,接受4枪就死,总生命值200,当然方法里面还要做其他很多的判断,如生命值是否小于0,如果是的话就执行t.setLive(false);从而结束游戏。

9.爆炸:

坦克的爆炸效果独立出来用一个类来描述,爆炸的属性:

位置和存活状态,另外,画爆炸效果的时候要取得用户界面控制,所以要定义privatestaticToolkittk=Toolkit.getDefaultToolkit();其他的方法只能的大同小异。

10.菜单功能

菜单功能包括游戏的重新开始,暂停,退出等。

这些功能的用户界面放在了TankClient的构造方法里,用到的是面板类和相应的监听功能,实现出来很简单。

⏹类的介绍

a)Direction是一个枚举类有L,U,R,D,STOP表示左,上,右,下和静止五个状态

b)River描述河流的类

属性:

riverWidth

河流的宽度

riverLength

河流的长度

x

X轴坐标

y

Y轴坐标

TankClienttc

TankClient对象

riverImags

河流的图片

River(intx,inty,TankClienttc)

河流的构造方法

draw(Graphicsg)

画河流的方法

RectanglegetRect()

长方形实例

intgetX()

取得x坐标

voidsetX(intx)

设置x坐标

intgetY()

取得y坐标

voidsetY(inty)

设置y坐标

intgetRiverWidth()

取得河流的宽度

intgetRiverLength()

取得河流的长度

c)Home表示用户方的家的类

属性:

width=30

家的静态全局宽度

length=30

家的静态全局长度

x

X轴坐标

y

Y轴坐标

TankClienttc

TankClient对象

homeImags

家的图片

booleanlive

初始存活状态为true表示家的存活状态

Home(intx,inty,TankClienttc)

家的构造方法

voiddraw(Graphicsg)

画出家的方法

RectanglegetRect()

长方形实例

voidgameOver

(Graphicsg)

游戏结束方法,做清理工作和相应的提示

booleanisLive()

判断是否存活

voidsetLive(booleanlive)

设置存活状态,以便从新开始游戏

d)Tree描述树林的类

属性:

width=30

树林的静态全局宽度

length=30

树林的静态全局长度

x

树林在界面中X轴坐标

y

树林在界面中Y轴坐标

TankClienttc

TankClient对象

Toolkittk

取得界面的控制

treeImags

树林的图片

Tree(intx,inty,TankClienttc)

家的构造方法

voiddraw(Graphicsg)

画出树林的方法

e)Bullets描述子弹的类

属性:

speedX=10

子弹的全局静态速度x轴方向的

speedY=10

子弹的全局静态速度y轴方向的

width=10

子弹的全局静态宽度

length=10

子弹的全局静态长度

Directiondiretion

子弹的方向

x

X轴坐标

y

Y轴坐标

TankClienttc

TankClient对象

bulletImages

子弹的图片

booleanlive

初始存活状态为true表示家的存活状态

Bullets(intx,inty,Directiondir)

子弹的构造方法,带三个参数

Bullets(intx,inty,booleangood,Directiondir,TankClienttc)

子弹的构造方法,带五个参数的

voiddraw(Graphicsg)

画出子弹的方法

move()

刻画子弹运动的方法

RectanglegetRect()

长方形实例

voidgameOver

(Graphicsg)

游戏结束方法,做清理工作和相应的提示的方法

booleanisLive()

判断是否存活

booleanhitTanks(Listtanks)·

子弹打到地方自己的时候的方法

booleanhitTank(Tankt)

子弹打到对方的方法

booleanhitWall(CommonWallw)

子弹打到普通墙的方法

booleanhitWall(MetalWallw)

子弹打到金属墙的方法

booleanhitHome()

子弹打到家的方法

f)GetBlood血包描述类

属性:

width=36

血包的静态全局宽度

length=36

血包的静态全局长度

x

X轴坐标

y

Y轴坐标

TankClienttc

TankClient类实例化对象

Randomr

用于产生随机数

Toolkittk

tk获得用户界面

bloodImags

家的图片

poition

位置数组

booleanlive

初始存活状态为false表示初始化时无血包

voiddraw(Graphicsg)

画出血包的方法

voidmove()

血包移动的方法

RectanglegetRect()

长方形实例

booleanisLive()

判断是否存活,是否有血包

voidsetLive(booleanlive)

设置存活状态,设置血包的存在

g)CommonWall普通墙的类

属性:

width=20

普通墙的静态全局宽度

length=20

普通墙的静态全局长度

x

普通墙在界面中X轴坐标

y

普通墙在界面中Y轴坐标

TankClienttc

TankClient类实例化对象,因为画墙要取得界面的控制权

Toolkittk

tk获得用户界面

wallImags

普通的图片

CommonWall(intx,inty,TankClienttc)

普通墙的构造方法,用于传递墙的位置参数和TankClient

voiddraw(Graphicsg)

画出普通墙的的方法

RectanglegetRect()

长方形实例

h)MetalWall金属墙的类

属性:

width=30

金属墙的静态全局宽度

length=30

金属墙的静态全局长度

x

金属墙在界面中X轴坐标

y

金属墙在界面中Y轴坐标

TankClienttc

TankClient类实例化对象

Toolkittk

tk获得用户界面

wallImags

金属墙的图片

MetalWall(intx,inty,TankClienttc)

金属墙的构造方法,用于传递墙的位置参数和TankClient

voiddraw(Graphicsg)

画出金属墙的的方法

RectanglegetRect()

长方形实例

i)BombTank坦克爆炸类

属性:

x

坦克爆炸效果在界面中X轴坐标

y

坦克爆炸效果在界面中Y轴坐标

TankClienttc

TankClient类实例化对象

Toolkittk

tk获得用户界面

Image[]imgs

爆炸效果的图片

BombTank(intx,inty,TankClienttc)

爆炸效果的构造方法,用于传递爆炸效果的位置参数和TankClient

voiddraw(Graphicsg)

画出爆炸效果的的方法

j)Tank描述Tank的类

属性:

speedX=6

坦克的全局静态速度x轴方向的

speedY=6

坦克的全局静态速度y轴方向的

width=35

坦克的全局静态宽度

length=35

坦克的全局静态长度

Directiondiretion

坦克的状态,初始化为静止

DirectionKdirection

坦克的方向,初始化为向上

Intx

X轴坐标

Inty

Y轴坐标

intoldX

旧状态的X轴坐标

intoldY

旧状态的Y轴坐标

booleanlive

坦克是否存活,初始化为活着的

TankClienttc

TankClient对象

intlife

初始化生命值为200

Randomr

随机数,用于控制坦克的方向

intstep

路径

Image[]tankImags

各个方向坦克的图片数组集合

Tank(intx,inty,booleangood)

坦克的构造方法1,带三个参数

Tank(intx,inty,booleangood,Directiondir,TankClienttc)

坦克的构造方法2,带五个参数的

voiddraw(Graphicsg)

画出坦克的方法

move()

描述坦克运动方向的方法

voidchangToOldDir()

转换到旧方向,

voidkeyPressed(KeyEvente)

键盘监听方法

voiddecideDirection()

决定移动方向方法

voidkeyReleased(KeyEvente)

监听键盘释放方法

Bulletsfire()

坦克开火方法

RectanglegetRect()

长方形实例的方法

booleanisLive()

判断是否存活的方法

voidsetLive(booleanlive)

设置坦克存活方法

booleanisGood()

用于返回是否是good状态

booleancollideWithWall(CommonWallw)

坦克碰到普通墙的解决方法

booleancollideWithWall(MetalWallw)

坦克碰到金属墙的解决方法

booleancollideRiver(Riverr)

坦克碰到河流的解决方法

booleancollideHome(Homeh)

坦克碰到家的解决方法

Boolean

tanks)

坦克撞到坦克的解决方法

intgetLife()

获得坦克的生命状态的方法

voidsetLife(intlife)

设置坦克的生命状态的方法

booleaneat(GetBloodb)

坦克吃红心血包的方法

intgetX()

确定X的位置的get方法

intgetY()

确定Y的位置的get方法

k)TankClient坦克用户类,继承Frame,实现ActionListener接口

实例化各个类的容器:

ListtheRiver=newArrayList();

Listtanks=newArrayList();

ListbombTanks=newArrayList();

Listbullets=newArrayList();

Listtrees=newArrayList();

ListhomeWall=newArrayList();//实例化对象容器

ListotherWall=newArrayList();

ListmetalWall=newArrayList();

下面列表只列出主要方法和变量

属性:

intFram_width

游戏用户界面的全局静态变量宽度,初始化为800

intFram_length

游戏用户界面的全局静态变量长度,初始化为600

voidupdate(Graphicsg)

图形用户界面的更新方法

voidframPaint(Graphicsg)

画图形用户界面的方法,需要重画的界面元素都在这个方法里面

voidactionPerformed(ActionEvente)

监听菜单项的方法

staticvoidmain(String[]args)

主函数,启动整个程序

用户类主要是综合调用各个类来协作完成完成游戏的设计。

⏹程序流程逻辑图

下图是程序运行的逻辑流程图,只是表示逻辑,并没有具体到每一个细节:

流程图:

⏹开发环境:

Myeclipse

三、测试分析

⏹阐述扩展包

本程序没有用到SUM的扩展包,也未涉及到数据库的建立

⏹程序效果图测试

1.菜单项测试

菜单项可以选择开始新游戏,退出,暂停,继续,帮助功能,对于开始新游戏,退出两个功能,要给出提示,用户是否真的想继续操作!

1)菜单效果图:

2)开始新游戏功能测试:

当点击确认后开始新游戏,当点击取消后恢复到原来的页面。

这里不再附图给出点击确定和取消后的效果。

3)暂停功能测试:

4)帮助模块测试图:

5)退出功能测试:

点击确认后将退出游戏,点击取消后不会退出游戏。

2.游戏信息测试:

游戏标题栏给出游戏名称和制作人相关信息

3.子

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1