项目-坦克大战-设计报告
坦克大战 实验报告

本科实验报告课程名称:Java语言程序设计实验项目:TankWar实验地点:致远楼B403专业班级:软件工程1219 学号:2012005496 学生姓名:柴丁方指导教师:任少斌2014年 1 月7 日import java.awt.*;import java.awt.event.*;public class TankWarClient extends Frame {//构造游戏开始的界面public void KaiShiJieMian() {this.setLocation(400,200); //游戏窗口的左上点在屏幕的位置this.setSize(800, 600);//游戏窗口的尺寸//使按窗口的“X”时,可以关闭程序较上一次实验添加的代码段为:public void paint (Graphics g) {Color c = g.getColor();//color类是 java。
awt 中的,因此可以直接 color cg.setColor(Color.green);// 类 java.awt.Graphics 中的方法,将此图形上下文的当前颜色设置为指定颜色。
g.fillOval(50, 50, 30, 30);//int x, int y,int width,int height,分别为坐标与椭圆的长宽g.setColor(c);}变更2:较上一次实验添加的代码段为:1.更改如下代码段中的“常量值”为“x”“y”,使所填充的椭圆位置可以随值改变,为静态的图形动起来打下了基础。
static int x=50,y=50;实验四:从版本0.4到版本0.41变更1:变更2:较上一次实验添加的代码段为:1.public class TankWarClient extends Frame {Image offScreenImage = null;}//先把内存的offScreenImage清空较上一次实验添加的代码段为:1.TankWarClient类中:2.3.较上一次实验修改的代码段为:public class Tank {public static final int XSPEED = 5;public static final int YSPEED = 5;private int x, y;private boolean bL=false, bU=false, bR=false, bD = false;enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};private Direction dir = Direction.STOP;//此处为构造函数。
坦克大战游戏概要设计

坦克大战游戏开发系统概要设计(第1.0版)目录坦克大战游戏开发............................................................................................................................. - 0 -第一章引言....................................................................................................................................... - 2 -1.1编写目的 .. (2)1.2项目背景 (2)1.3定义 (3)1.3.1 专门术语 ................................................................................................................................... - 3 -1.3.2 缩写 ........................................................................................................................................... - 3 -1.4参考资料 .. (3)第二章总体设计............................................................................................................................... - 4 -2.1需求规定 .. (4)2.1.1 对功能的规定............................................................................................................................ - 4 -2.1.2 对性能的规定............................................................................................................................ - 4 -2.1.3 输入/输出要求 .......................................................................................................................... - 4 -2.1.4 数据管理能力要求.................................................................................................................... - 5 -2.1.5 故障处理要求............................................................................................................................ - 5 -2.2其它专门要求 (5)2.3运行环境 (5)2.4功能需求与程序模块的关系 (6)2.5技术架构 ....................................................................................................................................... - 6 -第三章接口设计............................................................................................................................... - 7 -3.1外部接口 .. (7)3.1.1 用户界面 ................................................................................................................................... - 7 -3.2内部接口 .. (8)3.3.1结构........................................................................................................................................... - 8 -第四章运行设计............................................................................................................................... - 8 -4.1运行模块的组合 .. (8)4.2运行控制 (8)4.3运行时间 (8)第五章出错处理设计....................................................................................................................... - 9 -5.1出错输出信息 (9)5.2出错处理对策 (10)第六章维护设计............................................................................................................................. - 10 -第一章引言1.1 编写目的本说明书目的在于明确说明坦克大战游戏各功能的实现方式,指导开发员进行编码,并解决实现该系统的程序模块设计问题。
坦克大战报告

JAVA程序开发课程设计课程大作业专业:软件工程班级:14软工2学号: ***********名:***项目名称:坦克大战一、需求分析:1.基本功能:(1)我方坦克能上下移动(2)敌方坦克能自由移动(3)我方坦克能开火(4)敌方坦克能自由开火(5)子弹打中我方,会减血,我方打中敌方,敌死。
敌打敌不会受伤(6)有血条,主界面2.扩展功能(1)用图形来表示坦克和炮弹(2)用图形来表示中子弹后的爆炸效果(3)地图上存在金属墙,我方坦克和子弹不能穿过(4)地图上存在曹村,我方和敌方坦克能够自由穿过,子弹也一样(5)地图上会随机出现加血包(6)我方坦克遇到加血包,会增加生命(7)游戏开始时,会启动背景音乐(8)我方坦克死亡时,提示游戏结束二、系统设计:1. BgMusic(1)主要功能:添加背景音乐TankMap类通过调用该类,并读取BgMusic包下面的背景音乐文件(2)成员属性:1)filename,用于记录读取到的文件名,并处理2)nBytesRead,这是缓存,用于读取音乐文件,缓存下来(3)成员方法:1)run,播放背景音乐2)构造方法BgMusic,将读取到的文件名,存储到成员属性filename中2. Blood(1)主要功能:地图中添加血包(2)成员属性:1)x,y,width,height,血包的位置以及宽高2)rpos_x,rpos_y,用于记录血包移动后的位置3)tm,调用TankMap类,并在地图中放血包4)live,血包的存活,被坦克吃了就消失5) blood,用于记录血包的存活6)step,血包的步长7)stepMove,血包走过总的步长(3)成员方法:1)Blood,构造方法,将血包放到地图中2)draw,画血包3)move,血包的移动4)getRect,获取血包的位置3. Tank(1)主要功能:地图中添加我方坦克(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,坦克的宽高和x,y上的移动速度2)x,y,direction,我方坦克出现的初始位置和初始状态3)tm,调用TankMap类,并在地图中放坦克4)isLive,我方坦克是否存活5) isgood,坦克属于哪一方6)life,我方坦克的初始生命值7)step,使用Blood类,血包随机出现8)upimage,rightimage,downimage,leftimage,oldimage,存放坦克图片(3)成员方法:1)draw,绘制坦克2)move,根据移动方向,移动坦克,不允许坦克移除地图3)checkDirection,确定用户单击的方向键,修正坦克即将移动方向4)fire,发射子弹5)getRec,返回坦克当前位置,便于判断是否与敌方坦克或子弹重叠6)stay,坦克撞墙的处理7)eat,我方坦克吃血包4.EnemyTank(1)主要功能:地图中添加敌方坦克(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,坦克的宽高和x,y上的移动速度2)x,y,direction,我方坦克出现的初始位置和初始状态3)tm,调用TankMap类,并在地图中放坦克4)islive,我方坦克是否存活5)enemytank,存放坦克图片(3)成员方法:1)draw,绘制坦克2)move,根据移动方向,移动坦克,不允许坦克移除地图3)fire,发射子弹4.Explor(1)主要功能:子弹打中坦克,发生爆炸效果(2)成员属性:1)x,y,坦克出现的位置2)tm,调用TankMap类,并在地图中放爆炸3)islive,我方坦克是否存活(3)成员方法:1)draw,绘制爆炸2)Explor,爆炸的构造方法5.Help(1)主要功能:给用户游戏帮助(2)成员属性:1)help,将帮助的文字存放在字符串中(3)成员方法:1)getHelpDialog,调用帮助6.Shell(1)主要功能:设计子弹(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,子弹的宽高和x,y上的移动速度2)x,y,direction,子弹出现的位置和方向3)tm,调用TankMap类,并在地图中放子弹4)isLive,子弹是否打中坦克5)isgood,是否是我方6)Image,加载子弹图片(3)成员方法:1)draw,绘制子弹2)move,根据移动方向,移动坦克,得到子弹的移动3)getRec,获取坦克的位置4)hitTanks,子弹打坦克5)hitWalls,子弹打墙7.Wall(1)主要功能:给地图添加墙(2)成员属性:1)x,y,w,h,墙的位置和宽度高度2)tc,地图(3)成员方法:1)draw,画墙2)getRect,获取墙的位置8.TankMap(1)主要功能:地图(2)成员属性:1)MAPWIDTH,MAPHEIGHT,地图的宽高2)t,我方坦克3)bufferImage,缓冲,用于解决闪屏4)forestimage,草丛5)shells,EnemyTank,Blood,Explors泛型6)enemyCount,敌方坦克数量7)w1,w2,不可穿过的墙(3)成员方法:1)init,初始化地图2)paint,画血包,地图,坦克等3)addBloods,加血4)update,解决闪屏三、功能实现:1.功能1:我方,敌方坦克上下移动并开火(1)操作说明游戏启动时,按上下左右键可以是我方坦克移动,按F键可以开火(2)关键代码//绘制坦克public void draw(Graphics g){//根据不同方向加载不同图片,读取的时候需要处理异常try{switch(direction){case STOP:case UP:upimage=ImageIO.read(new File("src/images/up.gif"));oldimage=upimage;g.drawImage(upimage, x, y, null);break;case RIGHT:rightimage=ImageIO.read(new File("src/images/right.gif"));oldimage=rightimage;g.drawImage(rightimage, x, y, null);break;case DOWN:downimage=ImageIO.read(new File("src/images/down.gif"));oldimage=downimage;g.drawImage(downimage, x, y, null);break;case LEFT:leftimage=ImageIO.read(new File("src/images/left.gif"));oldimage=leftimage;g.drawImage(leftimage, x, y, null);break;}}catch (IOException e) {};g.drawImage(oldimage, x, y, null);move(direction);}//根据移动方向,移动坦克,不允许坦克移出地图public void move(Direction d){/*** 记录坦克原来的位置,撞墙可以回到原位置*/oldX=x;//记录坦克原来的位置,撞墙可以回到原位置oldY=y;if(d == Direction.STOP){}else if(d == Direction.UP){y-=yspeed;if(y<=HEIGHT)y=HEIGHT;}else if(d==Direction.RIGHT){x+=xspeed;if(x>=800-WIDTH)x=800-WIDTH;}else if(d==Direction.DOWN){y+=yspeed;if(y>=600-HEIGHT)y=600-HEIGHT;}else if(d==Direction.LEFT){x-=xspeed;}2.功能2:我方开火,敌方会爆炸,然后死亡。
局域网坦克大战课程设计报告

实训项目报告书项目名称局域网坦克大战年级班级2010级计101-4班项目完成人实训时间:2011 年12月12日至2011 年12月31 日填表说明一、本表由项目完成人填写,一式一份;二、实训结束前将填好的文稿打印后交实训指导教师进行鉴定和评定成绩,确认后的文档交院校存档保存;三、此表电子文档及学生项目实训的作品须打包存档,压缩文件包以学生学号命名,以班为单位收集,刻录光盘交院校存档;一、项目背景、目的及可行性分析引言随着时代的进步、社会的发展,网络已成为人们生活中不可或缺的一部分,工作学习之余,利用游戏等放松娱乐一下…….1、课题背景随着游戏产业的迅速发展,新游戏一个接一个的不断出现,游戏的类型也是多种多样,如竞技类、对战类、合作类、角色扮演类等等。
如果读者是学生的话也许会注意到,宿舍里玩的合作类小型游戏大多是两个人在一台机器上,如果想不在一台机器上,则可能需要上网寻求第三方服务器的支持。
2、局域网坦克大战的目的随着计算机的普及以及对电子游戏的认识,电子游戏已被越来越多的人选作放松、娱乐的休闲方式;电子游戏既不需要专门购买游戏器材,也不需要宽阔的游戏场地,只需要一台能独立完成任务的计算机即可,它可以是人们工作、学习时用的计算机,并不需要另行配置,这比起传统休闲游戏即省钱又省事。
局域网游戏更是可以将现实空间中零散的计算机,组织起来,使其在逻辑空间中集中起来,使游戏的组织、开展变得轻松。
如此轻松而又安逸的休闲方式,使得越来越多的人尝试,甚至已经将电子游戏作为主要休闲方式,既然有如此多的人使用,那其中必然存在巨大的商机,即使人们不愿意为一个小小的休闲游戏花费金钱,但在游戏中添加广告、游戏相关服务也包藏了巨大的财富;当然电子游戏的制作如今已是空前的火爆,大大小小的游戏公司横空出世,都想在电子游戏制作这个行业里占据一席之地,而一款成功的电子游戏需要精心的策划、分析、设计,只有这样才能获得游戏中包藏的财富,以及做出一款真正能够让玩家娱乐、放松的游戏,而不是骗取玩家钱财的工具。
拓展项目——坦克大战(共5则)

拓展项目——坦克大战(共5则)第一篇:拓展项目——坦克大战坦克大战明阳天下拓展项目简介团队的所有成员在规定的时间和规则的约束下,进行角色分配后,蒙上双眼依次进入模拟战场,在躲避地雷的同时用炮弹尽可能的击中对手,最终战场剩余人数最多的小组获胜。
项目规则1、每队队员同时蒙眼进入雷区,听由场外队员指挥捡炮弹,中途如有触碰地雷,该队员视为中弹身亡,由下一名队员顶替;2、场内队员蒙眼听从场外队员的指挥,捡起炮弹,击中对方队员身体任意部位,即可淘汰对方队员继续存活;3、场外队员只能在限定的区域内活动,不可触发到其他组的区域;4、最后场外留有人数最多组获胜。
项目目标有效沟通,战略与决策,在特殊的情况下如何和其他学员进行有效沟通;团队的力量如何发挥才能体现最大的力量;怎样才能是更合理的指挥方式;默契程度和信任度的考验。
北京明阳天下拓展培训机构是国内体验培训领域的“黄埔军校”。
在体验式培训、户外教育理论、专项主题研究、软件实操开发等软件设施方面已走在行业前列;而硬件拓展设备、拓展器材、拓展设施设计建造和大型独资实操基地等硬件设施方面同样领先全国。
强大的课程研发队伍,与国际接轨的先进培训理念,完善的硬件设备,优越的服务意识,明阳天下拓展始终秉承“专业致胜,效果为王”的理念,为成千上万的客户打造专业化、高标准的拓展培训方案。
第二篇:坦克大战大报告大作业题目:坦克大战程序一、需求分析功能需求坦克大战其中包括对主战坦克的编写、坦克的初始位置的编写、坦克的移动方向的编写、坦克的速度的编写、坦克的子弹速度的编写、敌军的子弹速度的编写、设置游戏难度的编写、子弹的编写、敌军坦克的编写、构造函数的编写,初始化敌军坦克的位置和状态的编写、键盘控制坦克的移动的编写、发弹的编写、判断是否被击中的编写、判断是否击中敌军的编写等。
通过上下左右键进行对坦克的移动,通过F键发射子弹,其它坦克可以随机移动。
构造主窗口中所需要的类,并将坦克加到窗口中,实现坦克的四个方向的移动并创建炮弹类,并让屏幕中的坦克能发射炮弹,让坦克可以朝对方信息统计功能,在游戏界面左上角,显示当前屏幕子弹数。
坦克大战设计报告

手机版疯狂坦克游戏设计与开发摘要Java良好的跨平台特性在移动平台的开发中显示出了巨大的威力。
Java语言面向对象的优势也使得开发游戏变得非常容易。
随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。
本论文着眼于J2ME技术的应用,开发一款可商用的手机游戏程序——坦克大战。
本程序的界面和运作方式继承于日本任天堂公司在20世纪80年代开发的Battle City游戏,将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。
本论文介绍了任天堂红白机的软硬件特性、J2ME的相关技术及本程序的结构分析和具体功能的实现。
关键词:J2ME,手机游戏,Java,坦克大战目录1 绪论 (3)1.1开发背景 (3)1.2 开发工具 (3)1.3 开发意义 (3)2 需求分析 (6)2.1功能需求分析 (6)2.2界面需求分析 (6)3 总体设计 (7)3.1主要功能 (7)3.2 程序流程 (8)4 详细设计和具体实现 (9)4.1游戏进入前的选择 (9)4.2主游戏逻辑及其涉及到的若干类 (10)4.3坦克的共同行为 (13)4.4玩家坦克的功能属性 (14)4.5敌人坦克的功能属性 (15)4.6子弹的运行和控制 (19)4.7记分系统 (21)5.测试与实现 (22)6 程序的总结和展望 (23)1 绪论1.1开发背景在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。
但是传统手机存在以下弊端:1. 传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。
2. 传统手机访问互联网是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。
java课设报告坦克大战

java课设报告坦克大战什么是Java课设报告坦克大战?Java课设报告坦克大战是一个基于Java编程语言开发的游戏项目。
它模拟了坦克战争的场景,玩家需要操控一辆坦克,与其他玩家或者电脑控制的敌人进行战斗,完成各种任务。
这个项目旨在提高学生的Java编程能力和团队协作能力。
第一步:需求分析和设计在开始编写代码之前,我们需要进行需求分析和设计。
首先,确定游戏的功能和玩法。
例如,游戏应该具有地图、坦克、子弹等基本元素,玩家可以使用键盘控制坦克的移动和攻击,坦克和子弹应该有相应的属性和行为,坦克应该能够与其他坦克进行交互等等。
其次,我们需要设计游戏的界面和用户交互方式,包括游戏的开始菜单、游戏画面、得分、生命值等界面元素。
最后,我们应该考虑游戏的可扩展性,使得我们能够在后续的开发过程中添加更多的功能和元素。
第二步:编写代码在设计完成后,我们开始编写Java代码。
首先,我们创建一个Java项目,并进行必要的配置,例如添加游戏所需的外部库和资源文件。
然后,我们开始编写代码。
我们可以将游戏的不同元素,例如地图、坦克、子弹等,抽象成不同的类,并为每个类定义相应的属性和方法。
我们还可以使用设计模式和面向对象的编程思想,使得代码更加清晰和可维护。
同时,我们需要为游戏添加适当的事件处理器,以响应用户的操作和更新游戏状态。
我们还可以使用Java图形库或者相关的游戏引擎,使游戏具有更好的视觉效果和用户体验。
第三步:测试和调试在代码编写完成后,我们需要进行测试和调试。
我们可以编写一些测试用例,验证游戏的各个功能和元素是否正常工作。
同时,我们需要定期检查并修复可能存在的bug和错误,确保游戏的稳定性和可玩性。
在这个过程中,我们可以与团队成员合作,互相交流和帮助,提高解决问题的效率和质量。
第四步:项目上线和发布在完成测试和调试后,我们可以将游戏部署到服务器上,并发布给玩家。
我们可以选择通过应用商店或者网站进行发布,或者将游戏打包成可执行文件,供玩家下载和安装。
坦克大战实验报告

坦克大战实验报告班级:1205 姓名:许广龙学号:121010182一、系统简介使用JAVA编写一个人机游戏,有开始启动面板(Stage 1),并有闪烁效果。
在开始面板中有游戏(G)和帮助(H)两个菜单。
其中游戏(G)菜单中有开始游戏(N)、退出游戏(E)、保存游戏(S)、继续游戏(C)选项;帮助(H)菜单中有关于坦克如何操作的提示信息。
玩家有1辆坦克(有3条命),电脑有6辆坦克,我的坦克可以通过键盘控制进行移动和发射子弹,敌人坦克可自由运动并自动发射子弹。
敌人坦克相互之间不能重叠,敌人坦克与我的坦克不能重叠,我的坦克与敌人坦克不能重叠。
当子弹击中坦克时坦克死亡,并显示爆炸效果。
当我的坦克生命为0时游戏结束(显示GAMEOVER),当敌方的所有坦克死亡时游戏结束(显示VICTORY)。
二、需求分析设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。
用户可以选择开始游戏(N),退出游戏(E),保存游戏(S),继续游戏(C),游戏帮助(H)。
界面中包含我的坦克和敌人坦克以及坦克发出的子弹和爆炸后的效果。
坦克:坦克分为两种,敌人坦克和我的坦克。
我的坦克和敌人坦克均可以发射子弹,可以改变路径行走,且在行走过程中碰到边界或碰到其它坦克会自动换方向,坦克之间不能相互穿越。
子弹:子弹可以由敌方坦克和我的坦克发射,且发射出去的子弹可以直线移动,直到碰到其它坦克或超越边界就消失。
坦克受到一颗子弹攻击便死亡,死亡后坦克消失。
爆炸:当子弹射击到坦克身上时,要产生爆炸效果。
方向:坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。
具体功能:1、坦克可以上下左右移动2、坦克可以发子弹(可以连发,最多5发子弹)3、当坦克中弹时,坦克消失,并显示爆炸效果。
4、我的坦克被击中后显示爆炸效果5、防止敌人坦克重叠运动、我的坦克与敌人坦克重叠运动、敌人坦克与我的坦克重叠运动6、玩游戏时可以保存游戏和继续游戏7、记录玩家的成绩三、系统设计程序流程图:总体框架:项目名:TankGame1主类文件:MyFrame.java坦克父类文件:Tank.java坦克子类(我的坦克):MyTank.java坦克子类(敌人坦克):EnemyTank.java我的面板:MyPanel.java子弹类:Shot.java开始面板:MyStartPanel.java记录类:Recorder.java爆炸类:Bomb.java四、详细设计(一) 、画坦克1、Tank类class Tank{int x,y;//坦克的位置int direct;//坦克的方向int color;//坦克的颜色,值为0时为的我的坦克,为1时为敌人的坦克int speed;public Tank(int x, int y) {this.x = x;this.y = y;}setter与getter方法(代码略)public void moveUp(){//向上移动,y坐标值减,方向值为0y-=speed;this.setDirect(0);}public void moveDown(){//向下移动,y坐标值增,方向值为2y+=speed;this.setDirect(0);}public void moveRight(){//向右移动,x坐标值增,方向值为1x+=speed;this.setDirect(0);}public void moveLeft(){//向左移动,x坐标值减,方向值为3x-=speed;this.setDirect(0);}}2、我的坦克类MyTankclass MyTank extends Tank{public MyTank(int x, int y) {super(x, y);}}3、主类MyFramepublic class MyFrame extends JFrame{MyPanel mp=null;public static void main(String[] args) {MyFrame tankGame1=new MyFrame();MyFrame.setVisible(true);}public MyFrame() {mp=new MyPanel();this.add(mp);this.setBounds(200,200,600,500);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}4、在MyFrame.java中创建MyPanel类class MyPanel extends JPanel{MyTank mytank=null;public MyPanel(){mytank=new MyTank(200,200);//创建我的坦克并设置其初始位置}//重载MyPanel类的paint函数以实现画坦克public void paint(Graphics g)//窗口大小改变或重绘窗口时,执行repaint()时会自动调用{super.paint(g);g.fillRect(0,0,600,500);this.drawTank(mytank.getX(),mytank.getY(),mytank.getDirect(),mytank.getColor(), 5, g); }//在MyPanel画坦克的函数,参数包括坦克的位置、方向、类型(用于设置颜色)、画笔:public void drawTank(int x, int y, int direct, int color, int size,Graphics g) {switch (color) {case 0://我的坦克的颜色g.setColor(Color.cyan);break;case 1:g.setColor(Color.yellow);break;case 2://敌人坦克的颜色g.setColor(Color.green);break;}switch (direct) {case 0:g.fill3DRect(x, y, size, 6 * size, false);g.fill3DRect(x + 3 * size, y, size, 6 * size, false);g.fill3DRect(x + size, y + size, 2 * size, 4 * size, false);g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);g.drawLine(x + 2 * size, y, x + 2 * size, y + 3 * size);break;case 3:g.fill3DRect(x, y, 6 * size, size, false);g.fill3DRect(x, y + 3 * size, 6 * size, size, false);g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);g.fillOval(x + 2 * size, y + size, 2 * size, 2 * size);g.drawLine(x, y + 2 * size, x + 3 * size, y + 2 * size);break;case 1:g.fill3DRect(x, y, 6 * size, size, false);g.fill3DRect(x, y + 3 * size, 6 * size, size, false);g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);g.fillOval(x + 2 * size, y + size, 2 * size, 2 * size);g.drawLine(x + 6 * size, y + 2 * size, x + 3 * size, y + 2 * size);break;case 2:g.fill3DRect(x, y, size, 6 * size, false);g.fill3DRect(x + 3 * size, y, size, 6 * size, false);g.fill3DRect(x + size, y + size, 2 * size, 4 * size, false);g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);g.drawLine(x + 2 * size, y + 6 * size, x + 2 * size, y + 3 * size);break;}}(二)、移动坦克(事件监听)在主类注册键盘事件监听,在MyPanel类中实现事件监听。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《JAVA程序开发课程设计》项目设计项目名称:TankWar 软件专业:软件工程班级:13软工1班姓名:毛晨光学号:1322120124一、需求分析:基本功能:1.玩家控制的坦克能够四处移动并且打击敌方坦克;2.敌方坦克能够随机四处移动并且打击玩家控制的坦克;3.玩家控制的坦克拥有血量,而敌方坦克没有;4.坦克受到攻击时血条会缩短;5.敌方坦克被消灭完之后,提示游戏胜利;6.用户方坦克被消灭后提示游戏结束;特色功能:1.坦克具有图片,不单单只是个圈圈。
2.增加了血包功能,地图上会随机出现一个血包,我方坦克开过会增加血量。
二、系统设计:1.TankMap类:实现游戏界面地图的初始化。
2.PainTread类:绘制和重绘功能。
3.DirectionHandler:监听用户的键盘输入。
4.Tank类:实现坦克的初始化,绘制,移动,发射等功能。
5.EnemyTank:实现敌方坦克的初始化,绘制,移动,发射等功能。
6.Shell类:实现炮弹的初始化,绘制,移动,攻击功能。
7.Explor类:实现爆炸的初始化。
绘制功能,爆炸效果由绘制半径从小到大再到小的圆实现。
8.Direction类:包含枚举。
9.Blood类:用于实现血包的功能。
三、功能实现。
一.绘制地图功能:public class TankMap extends Frame{//定义地图的尺寸。
public static final int MAPWIDTH=800;public static final int MAPHEIGHT=600;//我方坦克Tank t=null;//定义随机出现的血包Random r=new Random();Image bufferImage=null;public static java.util.List<Shell>shells=new ArrayList<Shell>();//地方坦克集合public static java.util.List<EnemyTank>->enemys=new ArrayList<EnemyTank>();public static java.util.List<Blood> bloods=new ArrayList<Blood>();//爆炸集合public.static.java.util.List<Explor>explors=new java.util.ArrayList<Explor>(); //敌方坦克数量默认10个public int enemyCount=5;//主方法public static void main(String[] args) {TankMap tv=new TankMap();tv.init();}public void drawImage(){}//地图初始化方法public void init(){//初始化地图this.setSize(MAPWIDTH,MAPHEIGHT);this.setTitle("TankWar");this.setVisible(true);//添加键盘监听器this.addKeyListener(new DirectionHandler());//添加穿口关闭监听器this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent arg0){System.exit(0);}});//初始化我方坦克t=new Tank(this);//初始化敌方坦克for(int i=0;i<enemyCount;i++){enemys.add(new EnemyTank(40+30*i,80,Color.YELLOW)); }//启动绘制线程new Thread(new PaintThread()).start();}//@Overridepublic void paint(Graphics g){//画地图Color c=g.getColor();g.setColor(Color.GREEN);g.fillRect(0,0,MAPWIDTH,MAPHEIGHT);g.setColor(Color.RED);g.drawString("当前炮弹数目:"+shells.size(),20,40);g.drawString("生命值:",20,60);g.fillRect(65,55,t.getLife(),5);g.setColor(c);//画坦克t.draw(g);if(r.nextInt(10)==9 && bloods.size()==0)bloods.add(new Blood());if(r.nextInt(60)==7 && bloods.size()==1)bloods.remove(0);for(int i=0;i<enemys.size();i++){EnemyTank et=enemys.get(i);et.draw(g);}//画爆炸for(int i=0;i<explors.size();i++){Explor e=explors.get(i);e.draw(g);}//绘制血包for(int i=0;i<bloods.size();i++){Blood b=bloods.get(i);b.bloodb(t);b.draw(g);}//画炮弹for(int i=0;i<shells.size();i++){Shell s=shells.get(i);if(s.islive&&s.isgood){s.hitTanks(enemys);}else if(s.islive&&!s.isgood){s.hitTank(t);}s.draw(g);}}//双缓冲,防止游戏地图“频闪”public void update(Graphics g){paint(g);if(bufferImage==null){bufferImage=this.createImage(MAPWIDTH,MAPHEIGHT);}Graphics gbuffer=bufferImage.getGraphics();Color c=gbuffer.getColor();gbuffer.setColor(Color.GREEN);gbuffer.fillRect(0, 0, MAPWIDTH, MAPHEIGHT);gbuffer.setColor(Color.RED);gbuffer.drawString("当前炮弹数目:"+shells.size(),20,40);gbuffer.drawString("生命值:", 20, 60);gbuffer.fillRect(65,55,t.getLife(),5);gbuffer.setColor(c);paint(gbuffer);g.drawImage(bufferImage, 0, 0, null);}//内部类,主要通过调用repaint方法,实现绘图功能class PaintThread implements Runnable{@Overridepublic void run(){while(true){repaint();try{Thread.sleep(260);}catch(InterruptedException e){e.printStackTrace();}}}}//内部类,键盘监听器class DirectionHandler extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent arg0){t.checkDirection(arg0);}}二.绘制坦克功能:public class Tank {//坦克的尺寸和移动速度public static final int WIDTH=50,HEIGHT=50,xspeed=5,yspeed=5;//坦克的初始位置public int x=400,y=300;//坦克的初始化方向,STOP即停止,Direction是自定义的枚举常量,见枚举源代码public Direction direction=Direction.STOP;//地图TankMap tm;//坦克是否存活boolean isLive=true;//坦克属于哪一方,true为用户方,false为敌方boolean isgood=true;//坦克初始化生命值int life=100;//定义坦克的初始化方向,以便插图坦克的图片public int zhuanxiang=1;//获取和设置存活状况public boolean isLive(){return isLive;}public void setLive(boolean isLive){this.isLive=isLive;}//获取和设置生命值public int getLife(){return life;}public void setLife(int life){this.life=life;}//构造方法public Tank(){};public Tank(TankMap t){tm=t;}//绘制坦克//根据坦克的移动方向,插入不同的坦克的图片public void draw(Graphics g){if(zhuanxiang==1){ImageIcon icon=new ImageIcon("Etank_shang.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}else if(zhuanxiang==-2){ImageIcon icon=new ImageIcon("Etank_you.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}else if(zhuanxiang==2){ImageIcon icon=new ImageIcon("Etank_zuo.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}else{ImageIcon icon=new ImageIcon("Etank_xia.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}/*Color c=g.getColor();g.setColor(Color.RED);g.fillOval(x,y,WIDTH,HEIGHT);g.setColor(c);*/move(direction);}//根据方向,移动坦克,不允许坦克移出地图尺寸public void move(Direction d){if(d==Direction.STOP){}else if(d==Direction.UP){zhuanxiang=1;y -= yspeed;if(y<=20)y=20;}else if(d==Direction.RIGHT){zhuanxiang=-2;x+=xspeed;if(x>=800-WIDTH)x=800-WIDTH;}else if(d==Direction.DOWN){zhuanxiang=-1;y+=yspeed;if(y>=600-HEIGHT)y=600-HEIGHT;}else if(d==Direction.LEFT){zhuanxiang=2;x-=xspeed;if(x<=0)x=0;}}//确定用户单机的方向键,修正坦克即将移动的方向public void checkDirection(KeyEvent k){if(k.getKeyCode()==KeyEvent.VK_UP){direction=Direction.UP;}else if(k.getKeyCode()==KeyEvent.VK_RIGHT){direction=Direction.RIGHT;}else if(k.getKeyCode()==KeyEvent.VK_DOWN){ direction=Direction.DOWN;}else if(k.getKeyCode()==KeyEvent.VK_LEFT){direction=Direction.LEFT;}if(k.getKeyCode()==KeyEvent.VK_F){fire();}}//发射炮弹的方法public void fire(){tm.shells.add(newShell(this.x+WIDTH/2,this.y+HEIGHT/2,this.direction,tm,Color.RED,true));}//返回坦克当前位置矩形,便于判断是否与敌方坦克或炮弹重叠public Rectangle getRec(){return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);}}三.敌方坦克的绘制方法public class EnemyTank extends Tank{//初始化敌方坦克的属性public static final int WIDTH=50,HEIGHT=50,xspeed=5,yspeed=5;public int x=400,y=300;public Direction direction=Direction.DOWN;public boolean islive=true;Color color=Color.YELLOW;TankMap tm;//随机数产生器,供敌方坦克随机产生前进方向使用Random r=new Random();public int zhuanxiang;//方向更改限制,避免敌方坦克每移动一次就更改方向int randomCount=r.nextInt(10)+5;//构造方法public EnemyTank(){}public EnemyTank(int wx,int wy,Color c){x=wx;y=wy;color=c;}@Overridepublic void draw(Graphics g){//根据敌方坦克的移动方向插入不同的坦克图片if(zhuanxiang==1){ImageIcon icon=new ImageIcon("Etank_shang.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}else if(zhuanxiang==-2){ImageIcon icon=new ImageIcon("Etank_you.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}else if(zhuanxiang==2){ImageIcon icon=new ImageIcon("Etank_zuo.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}else{ImageIcon icon=new ImageIcon("Etank_xia.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}move();}public void move(){//当方向更改限制为0时,产生一个随机方向if(randomCount==0){Direction dirs[]=Direction.values();direction = dirs[r.nextInt(dirs.length-1)];randomCount = r.nextInt(10)+5;}//方向更改限制减1randomCount--;//随机发射炮弹,当产生的随机数大于35时,发射炮弹if(r.nextInt(40)>36){fire();}//确定敌方的坦克的移动if(direction==Direction.UP){y-=yspeed;zhuanxiang=1;if(y<=HEIGHT)y=HEIGHT;}else if(direction==Direction.RIGHT){x+=xspeed;zhuanxiang=-2;if(x>=800-WIDTH)x=800-WIDTH;}else if(direction==Direction.DOWN){y+=yspeed;zhuanxiang=-1;if(y>=600-HEIGHT)y=600-HEIGHT;}else if(direction==Direction.LEFT){x-=xspeed;zhuanxiang=2;if(x<=0)x=0;}}@Overridepublic void fire(){tm.shells.add(newShell(this.x+WIDTH/2,this.y+HEIGHT/2,this.direction,tm,Color.BLUE,false) );}public Rectangle getRec(){return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);}}四.炮弹绘制方法public class Shell {//初始化炮弹的基本属性public final int WIDTH=5,HEIGHT=5,xspeed=14,yspeed=14;public int x,y;Direction dir=Direction.STOP;public boolean islive=true;TankMap tm=null;Color color=Color.RED;boolean isgood=true;boolean isLive=true;//构造方法public Shell(){}public Shell(int xd,int yd,Direction d,TankMap t){x=xd;y=yd;dir=d;tm=t;}public Shell(int xd,int yd,Direction d,TankMap t,Color c,boolean g){ x=xd;y=yd;dir=d;tm=t;color=c;isgood=g;}//绘制炮弹public void draw(Graphics g){if(islive){Color c=g.getColor();g.setColor(color);g.fillOval(x,y,WIDTH,HEIGHT);g.setColor(c);move(dir);}else{tm.shells.remove(this);}}//炮弹的移动,如果炮弹移动出了地图尺寸,则设定炮弹死亡public void move(Direction d){if(d==Direction.UP){y-=yspeed;if(y<=0)islive=false;}else if(d==Direction.RIGHT){x+=xspeed;if(x>=800)islive=false;}else if(d==Direction.DOWN){y+=yspeed;if(y>=600)islive=false;}else if(d==Direction.LEFT){x-=xspeed;if(x<=0)islive=false;}}public Rectangle getRec(){return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);}//打击坦克方法public boolean hitTank(Tank t){if(this.isLive&&t.isLive&&this.getRec().intersects(t.getRec())){//用户坦克生命值减20t.setLife(t.getLife()-20);//如果用户坦克生命值《=0,游戏结束if(t.getLife()<=0){t.setLive(false);t.direction=Direction.STOP;JOptionPane.showMessageDialog(tm,"Game Over!");System.exit(0);}//炮弹死亡this.isLive=false;//产生爆炸Explor e=new Explor(x-3,y-3,this.tm);tm.explors.add(e);return true;}return false;}//用户坦克打击敌方坦克的方法public boolean hitTanks(List<EnemyTank>enemyTanks){ EnemyTank e;for(int i=0;i<enemyTanks.size();i++){e=enemyTanks.get(i);if(this.getRec().intersects(e.getRec())){System.out.println("hittanks");e.setLive(false);tm.enemys.remove(e);this.isLive=false;Explor ex=new Explor(x-3,y-3,this.tm);tm.explors.add(ex);return true;}}return true;}}五.爆炸类源代码:public class Explor {//初始化爆炸属性int x,y;TankMap tm;boolean islive=true;int diameter[]={5,9,13,18,25,31,21,12,6};int step=0;//构造方法public Explor(){}public Explor(int x,int y,TankMap t){this.x=x;this.y=y;this.tm=t;}//绘制爆炸public void draw(Graphics g){//如果爆炸已经发生过,从地图的爆炸集合中移出该爆炸if(!this.islive){tm.explors.remove(this);return;}//判断爆炸是否发生完if(step==diameter.length){this.islive=false;step=0;return;}Color c=g.getColor();g.setColor(Color.ORANGE);g.fillOval(x, y, diameter[step], diameter[step]);step++;g.setColor(c);}}六.枚举方向源代码package tank;//定义枚举public enum Direction{UP,RIGHT,DOWN,LEFT,STOP;}七.随机血包产生的方法public class Blood{public final int WIDTH=30,HEIGHT=30;public int x= new Random().nextInt(800),y= new Random().nextInt(600);TankMap tm;public void draw(Graphics g){ImageIcon icon=new ImageIcon("blood.gif");Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);}public boolean bloodb(Tank t){if(t.isLive&&this.getRec().intersects(t.getRec())){if(t.getLife()<=60){System.out.println("blood up");t.setLife(t.getLife()+40);tm.bloods.remove(this);}else{System.out.println("blood up");t.setLife(100);tm.bloods.remove(this);}}return false;}public Rectangle getRec(){return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT); }}四、总结。