java坦克大战系统

上传人:gfy****yf 文档编号:27501313 上传时间:2021-08-18 格式:DOC 页数:15 大小:146.50KB
返回 下载 相关 举报
java坦克大战系统_第1页
第1页 / 共15页
java坦克大战系统_第2页
第2页 / 共15页
java坦克大战系统_第3页
第3页 / 共15页
点击查看更多>>
资源描述
课程设计说明书No.i坦克大战游戏的实现与设计1课程设计的目的随着手机的日益普及,java功能在移动设备上的实现及java应用程序产生的影响力, 对丰富人们的生活内容,提供便捷的咨询起着不可忽视的作用。本项目介绍了坦克大战 的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。游戏是在 Eclipse3.2环境下编程。本项目重点运用了图形化用户界面GUI, Thread多线程的有关 知识,其中涉及了绘图工具的运用,事件处理操作以及图形的碰撞检测等知识点。通过 此课程设计,使学生巩固所学知识、培养学生动手能力,了解Java的面向对象的体系结 构。学生用Java语言设计一个完整的应用程序,综合应用所学知识完成软件的分析、设 计、调试和总结,提高学生对Java语言的综合应用能力和解决问题的能力。2.设计方案论证2.1设计思路本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具 体功能的实现。游戏是在Eclipse3.2环境下编程。它的主要功能有:(1) 能够朝四个方向移动(2) 能够发射子弹互相攻击(3) 敌人能够移动(4) 能够模拟爆炸(5) 能够产生障碍(6) 能够增长生命玩家控制主坦克(上方有血条的)的移动以及炮弹的发射。若玩家将敌方坦克全部 打掉并保证自己的老家不被打掉则视为玩家获胜;若期间由玩家控制的主坦克被打掉, 或者自己的老家被打掉则视为玩家失败。游戏中有金属墙,普通墙,河水等障碍物,玩 家无法穿越它们:但是玩家可以将普通墙打掉。游戏中的森林可以将坦克隐身,药箱可 以将坦克的血加满。#大学课程设计说明书No. 52.2设计方法2.2.1构建游戏主类在主类中构适一个主Frame框架,设置它的大小和位置,并将其显示。在主类中编 写一段代码,构适一个窗口。并添加窗口关闭的处理事件,将窗口设置成打小不可变。 主要代码如下: this.addWindowListcncr(ncw Window Adapted) public void windowCIosingf WindowEvent e) Systcm.cxit(O););this.sctRcsizablc(false);2.2.2构建坦克类Tank构進生窗口中所需要的Tank类,并将坦克加到窗口中,实现坦克的四个方向的移动 创建一个坦克类,用画图工具构适出简单的图形代表坦克,并将坦克加入到主窗口当中。 主要代码如下: public class Tank public void draw(Graphics g) Color c = g.gctColor(); g.sctColor(Color.RED); g.fillOval(x, y, 30,30); g.setColorfc);public class TankClient extends Frame public void paint(Graphics g) myTank.draw(g);让坦克朝四个方向运动起来,在主类TankClient中启用多线程机制,让系统不断的 进行重画。并在Tank类中建立处理按键的方法,实现坦克的手动移动:根据坦克类修 改TankClient主类,在主类中注册事件监听器,并调用Tank类中的方法。主类TankClient 中使用双缓冲机制消除坦克的闪烁现象。在Tank类当中添加的按键方法,代码如下: public void keyPrcsscd( KcyEvcnt c) int key = c.gctKcyCodc();switch(kcy) case KcyEvcnt. VK_LEFT:bL = true;break;locatcDirection();public void kcyRclcascd(KcyEvcnt c) int key = c.gctKcyCodc(); switch(kcy) ease KcyEvcnt.VK_LEFT : bL = false;break;locatcDircction();TankClient类中的多线程机制的主要代码如下: new Thrcad(ncw PaintThrcad().start();private class PaintThread implements Runnable public void run() whilc(truc) rcpaint();try Thrcad.slccp(50); catch (IntcrruptcdExccption c) c.printStackTracc();2.2.3添加炮弹Missile类在Missile类当中添加x, y, dir等属性以及常量。在Missile类当中添加构适方法, draw方法等必要方法。根据不同的方向,子弹要进行不同的运动。在TankClient当中 new 颗子弹出来。2.2.4实现坦克的互相攻击(1)让主战坦克打出炮弹1) 在Tank类当中增加对J键的处理,使每按下J键的时候,坦克打岀一发炮弹。ease KcyEvent.VK_J :break;#大学课程设计说明书NO.72)根据“坦克打出炮弹”这句话,确定Tank当中的fire方法,其返回值为Missile。 public Missile fire() Missile m = new Missilc(x, y, ptDir);return m:3) 为了解决坦克停下来也能开火的问题一一给坦克加一炮筒,根据炮筒方向和 位置设定子弹的方向和位置并new出来,然后返回。每次move之后根据Tank 的新方向确定炮筒的方向。iRthis.dir != Dircction.STOP) this.ptDir = ihis.dir;4) 为了能够打出多发炮弹,使用容器填装多发炮弹,每当抬起J键的时候就往 容器中加入新的炮弹List missiles = new ArrayList();5) 解决炮弹不消亡的问题,加入控制炮弹生死的量live(Missle),当炮弹已经死去就不需 要对其重画,当炮弹飞出边界就死亡,当炮弹死亡就从容器中移去。ix 0 | y TankClient.GAME_WIDTH | y TankClicnt.GAME_HE1GHT)live = false;public void draw(Graphics g) ift!ive) tc.missiles.rcmove(this);return;(2) 实现坦克的互相开火1) 加入区分敌我的Boolean B good,根据敌我设置不同的坦克2) 更新Tank的构适函数,加入good3) 在TankClient中new出敌人并画出4) 在Missile中加入hitTank(Tank t)方法,返回布尔类型5) 借用碰撞检测的辅助类Rectangle,为Tank和Missile类都添加getRect()方法。public Rectangle gclRcct() return new Rcctanglc(x, y, WIDTH, HEIGHT);6) 增加控制坦克生死的Boolean B live,如果live为fhlse就不画了。当炮弹击中敌人坦 克时,坦克被打死,子弹也死去。public boolean hitTank(Tank t) if(this.gctRcct().intcrsects(t.gctRccl() & t.isLive() t.sctLive(false);thisivc = false;return true;return false;(3) 添加多辆坦克1) 建一容器向里而添加敌人的TankList tanks = new ArrayList();涼加TankMint i=0; i10; i+) tanks.add(ncw Tank(50 + 40*(i+1), 50, false, this);2) 在Tank类当中添加hitTanks方法,打一系列Tank:在TankClient里面每发子弹都打#大学课程设计说明书No. 9tanksTank类当中hitTanks方法public boolean hitTanks( List tanks) for(inl i=0; itanks.size(); i+) if(hitTank(tanks.gct(i) return true;return false;在TankCIient里面每发子弹都打tanksior(inl i=0; i 38) this.firc();2) 让敌方坦克发射炮弹。本军坦克不打本军坦克,向炮弹添加表示好坏的Boolean goodo3) 修改炮弹的构造方法:修改Tank的fire方法:修改hitTank方法,坦克只能打击对方。2.2.5 创建 Explode 类加入位置属性x,y,加入Boolean变屋live(2) 加入draw方法,用直径不同的圆来模拟爆炸(3) 在TankCIient当中创建容器,将爆炸存放与容器当中,击毙一辆坦克就产生爆炸, 将爆炸逐一画出(如果死去就去除)Missile类当中的hitTank()方法public boolean hitTank(Tank t) iilhis.getRcct().intcrsccts(t.gctRcct() & t.isLivc() t.setLivc(false);this.livc = false;Explode c = new Explodc(x, y, tc);tc.cxplodcs.add(c);return true;return false;爆炸死后去除ifJlive) tc.cxplodcs.rcmovc(this); 死后去除return;#大学课程设计说明书No. 112.2.6 添加药箱 BloodBox创建BloodBox类添加血药箱,加入必要的属性和方法,让药箱沿着固定的轨迹运动。 private static Random r = new Random();int step = 0;private intO( pos= 100, 120 , 200, 300 , 760, 570 , 280, 570 , 600,40 , 700,60 , 680,225 ;public BloodBox() x = pos00;y = pos0l);private void movc() step-H-;if (step = posength) step = 0;x = posstcpOJ;y = pos(stcpl;当主战Tank与药箱接触的时候,血自动加满。public boolean cat(BloodBox b) if (this.livc & b.isLivcQ & this.gciRcct().intcrsccts(b.getRcct() this.lifc = 100;b.sctLivc(false);return true;return false;將大学课程设计说明书No.il2.2.7 添加 Home建立Home类,在Home类中为家添加普通墙壁,当墙壁中的home被打掉后游戏结束。2.2.8添加障碍物添加金属墙1) 建立MetalWall类,建立MetalWall对彖,用绘图工具画岀来2) 让每一颗子弹打击每一堵墙,添加hitMetalWallO方法。当子弹接触到墙时子弹消失。 public boolean hitMctalVall(MctalWall w) iRlhis.livc & this.gctRcct().intcrsccts(w.gclRcct() this.livc = false;return true;return false;3) 让坦克不能穿过墙。添加记录上一次位置的oldX, oldY:修改构适函数 每次 move之前记录上一次的位置。添加stay方法记录移动之前的位置,当坦克撞到榴时回 到移动前的位置,即当碰到墙时stay。public boolean collidesWithMctalWall (MetalWall w) this.livc & this.gctRcct().intcrsccts(v.gciRcct() this.stay();return true;return false;(2)添加普通墙建立OrdinaryWall类,往里添加相应属性以及相应方法。具体步骤参考2.7.1中添加金 属墙。不同之处在于Missile类当中的hitOrdinaryWallQ方法,挡子弹接触到墙壁时,墙 壁消失。(3) 添加河水River具体细节参考2.7.1中添加金属墙(4) 添加树林创建Tee类,用画图工具画出代表森林的模块,加入主窗口当中。(5) 加入图片替换主窗口中的各对象再将图片加入时,运用了系统提供的工具包ToolKit,用工具包拿到所需图片后再将它 放入容器中。然后再做相应的替换。下面是Missle类当中的图片加入private static Toolkit tk = Toolkit.gctDcfaultToolkit();private static Imagc missilclmagcs = null;private static Map imgs = new HashMap();static missilclmagcs =ncw Imagc tk.gctImagc(Missilc.class.gctClassLoadcr().gctRcsourcc(imagcs/missilcL.gif,),lk.gctImagc(Missilc.class.gctClassLoader().gctRcsourcc(imagcs/missilcU.gif),tk.gciImagc(Missilc.class.gctClassLoadcr().gciRcsourcc(imagcs/missilcR.gif),lk.gct!magc(Missilc.class.gctClassLoadcr().gciRcsourcc(imagcs/missilcD.gir),;imgs.put(L, missilcImagcsO);imgs.putCU, missilclmagcs 1 );imgs.put(R, missilelmages2);imgs.putCD, missilclmagcs3);其他类的图片载入类似Missile类。3 设计结果与分析主坦克的方向键前移:W或键盘方向键向上 后移:S或方向键向下 左移:A或键盘方向键向下 右移:D或方向键向右 普通开火键J超级开火键K游戏重新开始键F2图1游戏量终运行界面4.设计体会通过这次课程设计,通过此课程设计,初步了解了 java面向对象的特点,掌握了 Java的许多基本知识,提升了自己的动手能力。使我对JAVA这门课又做了一次系统的 复习,对各个知识点也都有了更深刻的理解,让我掌握的更扎实,掌握JAVA的应用、 编写、上机调试的基本方法,同时也增强了实际操作能力,了解了学生信息管理系统的 #大学课程设计说明书No. #工作流程以及工作模式,程序开发过程中涉及到了数据库的相关知识,使我对数据库的 使用也更加的熟练,另一方面也对编程语言有了新的认识,为以后的学习打下了基础。 本项目要学会图形化用户界面的构建,并且本项目用到了多线程Thread的知识。通过 启用多线程机制,不断调用java.awt.*中的paint(Graphics g)方法,将画面构适出来。其 中要使用双缓冲消除闪烁现象。程序中还使用了键盘监听器类KeyMonitor实现坦克的 控制操作。碰撞检测的辅助类Rectangle可以完成坦克之间,以及坦克与障碍物之间的 碰撞检测。初步了解反射,知道对于classloader,每一个.class实际就是一个Class对象。 学会使用Toolkit类,并使用该类加载得到图片。学会使用Random类,并使用其中的 nextlnt ()方法得到随机数。利用了容器类往里添加对象。5 .参考文献1 Cay S.Horstmann, Gary Comil,叶乃文等译.Java核心技术M.北京:机械工业出版社, 2006.5: 76-852 周竞涛,Eclipse完全手册M.北京:电子工业出版社,2006.8: 98-1103 王克宏,郝建文.Java技术教程M.北京:淸华大学出版社,2002.9: 56-694 朱战立,沈伟.Java程序设计实用教程M.北京:人民邮电出版社,2007.1: 134-150#大学
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!