您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > JAVA坦克大战课题项目报告
(论文首页纸)2014—2015学年第一学期课程名称:面向对象技术实验任课教师:康恺论文题目:JAVA版坦克大战学号:ITT13022姓名:徐寰巨年级:2013专业:物联网工程班级:1班提交日期:2015年1月13日一、课题介绍实现一个java版的坦克大战实现功能:1.图形用户界面2.有坦克、树林、河流、墙体等元素3.界面中有一个“家”,“家”被攻击则输游戏4.墙体分为普通墙和金属墙两种,子弹可以射穿普通墙,不能射穿金属墙5.坦克可以通过树林不能通过河流6.坦克可以发射子弹,敌我双方坦克的属性一样7.敌方之间不能互相打到8.子弹击中坦克有爆炸9.我方坦克捡血包能增加生命值10.游戏可以暂停、开始等二、成品操作步骤系统平台:windows7Jdk:1.6IDE:MyEclipseProfessional2013开始实例化用户TankClient构造图形用户界面和界面中各个元素TankClient构造方法构造菜单模块设置界面中普通墙,金属墙,树林,河流的初始位置以及界面信息以及界面关闭监听framPaint,画用户界面监听菜单模块update方法刷新界面河流River树林Tree普通墙CommonWall金属墙MetalWall用户方坦克敌方坦克子弹Bullet爆炸效果BoobTank“家”撞击到River,Tree,CommonWall,MetalWall,Home,Tank后,调用draw()方法刻画效果,调用其他相应方法刻画撞击的结果血包GetBlood结束调用各自的方法体完成相应功能,如draw(),move()等判断家是否被攻击和用户方坦克的生命值是否小于0是否三、分析与设计需求分析1.设计一个panel,将所有游戏的元素都放在这个panel里面,玩家可以通过键盘控制来对panel里面的元素进行操作2.在panel中布局树林、河流、墙体(普通墙体和金属墙体)、“家”等元素3.坦克分为几方坦克和敌方坦克(由于本人比较懒就都drawImage了一样的图片)。敌方坦克随机发射子弹、随机走动;己方坦克由用户控制4.子弹可以穿越树林和河流,打到敌方坦克(或敌方坦克打到己方坦克)会产生爆炸效果具体设计1.图形用户界面图形用户界面需要用到抽象窗口工具集即AWT和Swing来设计实现,由于游戏需要有功能按键来控制游戏的重新开始,退出,暂停,帮助等,所以在实现过程中,设计菜单项。坦克,河流,树,家,墙等都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。界面的构造在程序中由TankClient类的构造方法来完成,即每造一个用户类都会产生这样一个包含各种游戏元素在内的界面。由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的普通墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。在程序中,此部分功能也是由TankClient类里的update函数和framPaint函数共同实现。2.界面中的元素树林、河流:由一个Tree、River类来描述,有width和height两个属性,由drawImage()方法得到墙体:由CommonWall、MetalWall类来描述,应用到drawIamge()方法,由getRect()方法来获得长方形实例,MetalWall不能被子弹打穿“家”:由Home类来抽象,除了用到draw()方法之外,还要用到setLive()和gameover()来解决“家”的问题子弹:子弹的属性:子弹前进的X轴和Y轴的速度——初始速度都为10,子弹的长度和宽度——初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。如:imgs.put(L,bulletImages[0]);类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。darw()方法和move()方法来控制画子弹和移动子弹。接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接returntrue就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果,代码如下:publicbooleanhitTanks(ListTanktanks){for(inti=0;itanks.size();i++){if(hitTank(tanks.get(i))){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);如果生命值小于等于0就执行t.setLive(false);从而结束游戏。3.爆炸:坦克的爆炸效果独立出来用一个类来描述,爆炸的属性:位置和存活状态,另外,画爆炸效果的时候要取得用户界面控制,所以要定义privatestaticToolkittk=Toolkit.getDefaultToolkit()。4.菜单:开始、暂停、帮助等功能,用简单的监听就可以实现。四、遇到的问题和解决方法1.测试是,发现金属墙体也能被子弹穿过,修改后为不可穿过金属墙体原代码:publicbooleanhitWall(MetalWallw){if(this.live&&this.getRect().intersects(w.getRect())){this.live=false;this.tc.metalWall.remove(w);returntrue;}returnfalse;}修改后代码:publicbooleanhitWall(MetalWallw){if(this.live&&this.getRect().intersects(w.getRect())){this.live=false;returntrue;}returnfalse;}2.全局布局的时候,忽略了程序中的界面位置是严格嵌套设计的,当参数为Homehome=newHome(450,545,this),会出现下图状况:当将参数450改为373是恢复正常。3.设计Bullets类的时候忽略了子弹撞击物体时候不改变物体的状态(如坦克不会死)于是导致了游戏将会永远进行下去,针对这个对Bulltes类里面的hittank()方法里的t.setLive(false)语句进行了更改,将false改为true。五、总结类的介绍Direction:是一个枚举类有L,U,R,D,STOP表示左,上,右,下和静止五个状态River:riverWidth河流的宽度riverLength河流的长度xX轴坐标yY轴坐标TankClienttcTankClient对象riverImags河流的图片River(intx,inty,TankClienttc)河流的构造方法draw(Graphicsg)画河流的方法RectanglegetRect()长方形实例intgetX()取得x坐标voidsetX(intx)设置x坐标intgetY()取得y坐标voidsetY(inty)设置y坐标intgetRiverWidth()取得河流的宽度intgetRiverLength()取得河流的长度Home:width=30家的静态全局宽度length=30家的静态全局长度xX轴坐标yY轴坐标TankClienttcTankClient对象homeImags家的图片booleanlive初始存活状态为true表示家的存活状态Home(intx,inty,TankClienttc)家的构造方法voiddraw(Graphicsg)画出家的方法RectanglegetRect()长方形实例voidgameOver(Graphicsg)游戏结束方法,做清理工作和相应的提示booleanisLive()判断是否存活voidsetLive(booleanlive)设置存活状态,以便从新开始游戏Tree:width=30树林的静态全局宽度length=30树林的静态全局长度x树林在界面中X轴坐标y树林在界面中Y轴坐标TankClienttcTankClient对象Toolkittk取得界面的控制treeImags树林的图片Tree(intx,inty,TankClienttc)家的构造方法voiddraw(Graphicsg)画出树林的方法Bullets:speedX=10子弹的全局静态速度x轴方向的speedY=10子弹的全局静态速度y轴方向的width=10子弹的全局静态宽度length=10子弹的全局静态长度Directiondiretion子弹的方向xX轴坐标yY轴坐标TankClienttcTankClient对象bulletImages子弹的图片booleanlive初始存活状态为true表示家的存活状态Bullets(intx,inty,Directiondir)子弹的构造方法,带三个参数Bullets(intx,inty,booleangood,子弹的构造方法,带五个参数的Directiondir,TankClienttc)voiddraw(Graphicsg)画出子弹的方法move()刻画子弹运动的方法RectanglegetRect()长方形实例voidgameOver(Graphicsg)游戏结束方法,做清理工作和相应的提示的方法booleanisLive()判断是否存活booleanhitTanks(ListTanktanks)·子弹打到地方自己的时候的方法booleanhitTank(Tankt)子弹打到对方的方法booleanhitWall(CommonWallw)子弹打到普通墙的方法booleanhitWall(MetalWallw)子弹打到金属墙的方法booleanhitHome()子弹打到家的方法GetBlood:width=36血包的静态全局宽度length=36血包的静态全局长度xX轴坐标yY轴坐标TankClienttcTankClient类实例化对象Randomr用于产生随机数Toolkittktk获得用户界面bloodImags家的图片poition位置数组booleanlive初始存活状态为false表示初始化时无血包voiddraw(Graphicsg)画出血包的方法voidmove()血包移动的方法RectanglegetRect()长方形实例booleanisLive()判断是否存活,是否有血包voidsetLive(booleanlive)设置存活状态,设置血包的存在CommonWall:width=20普通墙的静态全局宽度length=20普通墙的静态全局长度x普通墙在界面中X轴坐标y普通墙在界面中Y轴坐标TankClienttcTankClient类实例化对象,因为画墙要取得界面的控制权Toolkittktk获得用户界面wallImags普通的图片CommonWall(in
本文标题:JAVA坦克大战课题项目报告
链接地址:https://www.777doc.com/doc-5520765 .html