坦克大战小游戏程序设计.docx

上传人:b****2 文档编号:23095576 上传时间:2023-04-30 格式:DOCX 页数:28 大小:1,017.05KB
下载 相关 举报
坦克大战小游戏程序设计.docx_第1页
第1页 / 共28页
坦克大战小游戏程序设计.docx_第2页
第2页 / 共28页
坦克大战小游戏程序设计.docx_第3页
第3页 / 共28页
坦克大战小游戏程序设计.docx_第4页
第4页 / 共28页
坦克大战小游戏程序设计.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

坦克大战小游戏程序设计.docx

《坦克大战小游戏程序设计.docx》由会员分享,可在线阅读,更多相关《坦克大战小游戏程序设计.docx(28页珍藏版)》请在冰豆网上搜索。

坦克大战小游戏程序设计.docx

坦克大战小游戏程序设计

课程设计(论文)任务及评语

院(系):

管理学院教研室:

电子商务教研室

课程设计(论文)题目

坦克大战游戏设计

课程设计(论文)任务

1.掌握Java编程、面向对象的基础知识。

2.较熟练地编写Java应用程序Application。

3.做好充分的准备之后,按照面向对象的设计思想,根据坦克大战游戏的实际需求设计相关的类与接口,实现多态、重载等开发工作。

4.按时、按要求完成课程设计说明书的编写,字数为4000字以上。

5.按时上交课程设计说明书打印稿、电子稿和相应的应用系统。

6.依据你的课程设计内容,准备课程设计答辩。

指导教师评语及成绩

成绩:

指导教师签字:

2012年1月7日

目录

第1章课程设计的目的与要求1

1.1课程设计目的1

1.2课程设计的实验环境1

1.3课程设计的预备知识1

1.4课程设计主要内容1

第2章课程设计内容2

2.1需求分析2

2.2程序具体设计2

2.3类的介绍6

2.3.1Direction类6

2.3.2River类6

2.3.3Home类6

2.3.4Tree类7

2.3.5Bullets类7

2.3.6GetBlood类8

2.3.7CommonWall类9

2.3.8MetalWall类9

2.3.9BombTank类10

2.3.10Tank类10

2.3.11TankClient类12

2.3.12主要方法和变量12

2.4程序流程逻辑图13

第3章系统的功能测试与调整14

3.1菜单项测试14

3.2游戏信息测试16

3.3快捷键的测试19

3.4游戏级别的设置22

参考文献24

 

第1章课程设计的目的与要求

1.1课程设计目的

《JAVA面性对象程序设计》是电子商务专业的必修专业基础课程,其实践性、应用性很强。

实践教学环节是必不可少的一个重要环节。

本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA面性对象程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。

1.2课程设计的实验环境

硬件要求能运行Windows9.X操作系统的微机系统。

JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。

1.3课程设计的预备知识

熟悉JAVA语言以及ECLIPSE开发工具。

1.4课程设计主要内容

坦克大战游戏是在Eclipse环境下编程的游戏,其中包括对主战坦克的编写、坦克的初始位置的编写、坦克的移动方向的编写、坦克的速度的编写、坦克的子弹速度的编写、敌军的子弹速度的编写、设置游戏难度的编写、子弹的编写、敌军坦克的编写、构造函数的编写等等。

通过上下左右键进行对坦克的移动,通过空格发射子弹,其他坦克可以随机移动。

构造主窗口中所需要的类,并将坦克加到窗口中,实现坦克的四个方向的移动并创建炮弹类,并让屏幕中的坦克能发射炮弹,让坦克可以朝对方开火,并将对方击毙。

 

第2章课程设计内容

2.1需求分析

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

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

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

坦克:

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

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

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

树:

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

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

河流:

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

墙:

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

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

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

“家”:

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

子弹:

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

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

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

爆炸:

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

方向:

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

2.2程序具体设计

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

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

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

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

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

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

坦克主要由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()来刻画。

墙体分为普通墙和铁墙。

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

普通墙有以下几个属性:

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

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

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

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

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

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

子弹的属性:

子弹前进的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);从而结束游戏。

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

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

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

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

2.3类的介绍

2.3.1Direction类

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

2.3.2River类

描述河流的类

属性:

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()

取得河流的长度

2.3.3Home类

表示用户方的家的类

属性:

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)

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

2.3.4Tree类

描述树林的类

属性:

width=30

树林的静态全局宽度

length=30

树林的静态全局长度

x

树林在界面中X轴坐标

y

树林在界面中Y轴坐标

TankClienttc

TankClient对象

Toolkittk

取得界面的控制

treeImags

树林的图片

Tree(intx,inty,TankClienttc)

家的构造方法

voiddraw(Graphicsg)

画出树林的方法

2.3.5Bullets类

描述子弹的类

属性:

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()

子弹打到家的方法

2.3.6GetBlood类

血包描述类

属性:

width=36

血包的静态全局宽度

length=36

血包的静态全局长度

x

X轴坐标

y

Y轴坐标

TankClienttc

TankClient类实例化对象

Randomr

用于产生随机数

Toolkittk

tk获得用户界面

bloodImags

家的图片

poition

位置数组

booleanlive

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

voiddraw(Graphicsg)

画出血包的方法

voidmove()

血包移动的方法

RectanglegetRect()

长方形实例

booleanisLive()

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

voidsetLive(booleanlive)

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

2.3.7CommonWall类

普通墙的类

属性:

width=20

普通墙的静态全局宽度

length=20

普通墙的静态全局长度

x

普通墙在界面中X轴坐标

y

普通墙在界面中Y轴坐标

TankClienttc

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

Toolkittk

tk获得用户界面

wallImags

普通的图片

CommonWall(intx,inty,TankClienttc)

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

voiddraw(Graphicsg)

画出普通墙的的方法

RectanglegetRect()

长方形实例

2.3.8MetalWall类

金属墙的类

属性:

width=30

金属墙的静态全局宽度

length=30

金属墙的静态全局长度

x

金属墙在界面中X轴坐标

y

金属墙在界面中Y轴坐标

TankClienttc

TankClient类实例化对象

Toolkittk

tk获得用户界面

wallImags

金属墙的图片

MetalWall(intx,inty,TankClienttc)

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

voiddraw(Graphicsg)

画出金属墙的的方法

RectanglegetRect()

长方形实例

2.3.9BombTank类

坦克爆炸类

属性:

x

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

y

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

TankClienttc

TankClient类实例化对象

Toolkittk

tk获得用户界面

Image[]imgs

爆炸效果的图片

BombTank(intx,inty,TankClienttc)

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

voiddraw(Graphicsg)

画出爆炸效果的的方法

2.3.10Tank类

描述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)

坦克碰到家的解决方法

BooleancollideWithTanks(java.util.List

tanks)

坦克撞到坦克的解决方法

intgetLife()

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

voidsetLife(intlife)

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

booleaneat(GetBloodb)

坦克吃红心血包的方法

intgetX()

确定X的位置的get方法

intgetY()

确定Y的位置的get方法

2.3.11TankClient类

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

实例化各个类的容器:

ListtheRiver=newArrayList();

Listtanks=newArrayList();

ListbombTanks=newArrayList();

Listbullets=newArrayList();

Listtrees=newArrayList

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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