4227.java坦克大战游戏的实现与设计

4227.java坦克大战游戏的实现与设计

ID:6683476

大小:132.00 KB

页数:13页

时间:2018-01-22

上传者:U-5097
4227.java坦克大战游戏的实现与设计_第1页
4227.java坦克大战游戏的实现与设计_第2页
4227.java坦克大战游戏的实现与设计_第3页
4227.java坦克大战游戏的实现与设计_第4页
4227.java坦克大战游戏的实现与设计_第5页
资源描述:

《4227.java坦克大战游戏的实现与设计》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

课程设计说明书No.13坦克大战游戏的实现与设计1.课程设计的目的随着手机的日益普及,java功能在移动设备上的实现及java应用程序产生的影响力,对丰富人们的生活内容,提供便捷的咨询起着不可忽视的作用。本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。游戏是在Eclipse3.2环境下编程。本项目重点运用了图形化用户界面GUI,Thread多线程的有关知识,其中涉及了绘图工具的运用,事件处理操作以及图形的碰撞检测等知识点。通过此课程设计,使学生巩固所学知识、培养学生动手能力,了解Java的面向对象的体系结构。学生用Java语言设计一个完整的应用程序,综合应用所学知识完成软件的分析、设计、调试和总结,提高学生对Java语言的综合应用能力和解决问题的能力。2.设计方案论证2.1设计思路本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。游戏是在Eclipse3.2环境下编程。它的主要功能有:(1)能够朝四个方向移动(2)能够发射子弹互相攻击(3)敌人能够移动(4)能够模拟爆炸(5)能够产生障碍 (6)能够增长生命玩家控制主坦克(上方有血条的)的移动以及炮弹的发射。若玩家将敌方坦克全部打掉并保证自己的老家不被打掉则视为玩家获胜;若期间由玩家控制的主坦克被打掉,或者自己的老家被打掉则视为玩家失败。游戏中有金属墙,普通墙,河水等障碍物,玩家无法穿越它们;但是玩家可以将普通墙打掉。游戏中的森林可以将坦克隐身,药箱可以将坦克的血加满。##大学 课程设计说明书No.132.2设计方法2.2.1构建游戏主类在主类中构造一个主Frame框架,设置它的大小和位置,并将其显示。在主类中编写一段代码,构造一个窗口。并添加窗口关闭的处理事件,将窗口设置成打小不可变。主要代码如下:this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});this.setResizable(false);2.2.2构建坦克类Tank构造主窗口中所需要的Tank类,并将坦克加到窗口中,实现坦克的四个方向的移动创建一个坦克类,用画图工具构造出简单的图形代表坦克,并将坦克加入到主窗口当中。主要代码如下:publicclassTank{……publicvoiddraw(Graphicsg){Colorc=g.getColor();g.setColor(Color.RED);g.fillOval(x,y,30,30);g.setColor(c);}}publicclassTankClientextendsFrame{……##大学 课程设计说明书No.13publicvoidpaint(Graphicsg){myTank.draw(g);}}让坦克朝四个方向运动起来,在主类TankClient中启用多线程机制,让系统不断的进行重画。并在Tank类中建立处理按键的方法,实现坦克的手动移动;根据坦克类修改TankClient主类,在主类中注册事件监听器,并调用Tank类中的方法。主类TankClient中使用双缓冲机制消除坦克的闪烁现象。在Tank类当中添加的按键方法,代码如下:publicvoidkeyPressed(KeyEvente){intkey=e.getKeyCode();switch(key){caseKeyEvent.VK_LEFT:bL=true;break;……}locateDirection();}publicvoidkeyReleased(KeyEvente){intkey=e.getKeyCode();switch(key){caseKeyEvent.VK_LEFT:bL=false;break;……}##大学 课程设计说明书No.13locateDirection();}TankClient类中的多线程机制的主要代码如下:newThread(newPaintThread()).start();……privateclassPaintThreadimplementsRunnable{publicvoidrun(){while(true){repaint();try{Thread.sleep(50);}catch(InterruptedExceptione){e.printStackTrace();}}}}2.2.3添加炮弹Missile类在Missile类当中添加x,y,dir等属性以及常量。在Missile类当中添加构造方法,draw方法等必要方法。根据不同的方向,子弹要进行不同的运动。在TankClient当中new一颗子弹出来。2.2.4实现坦克的互相攻击(1)让主战坦克打出炮弹1)在Tank类当中增加对J键的处理,使每按下J键的时候,坦克打出一发炮弹。caseKeyEvent.VK_J:fire();##大学 课程设计说明书No.13break;2)根据“坦克打出炮弹”这句话,确定Tank当中的fire方法,其返回值为Missile。publicMissilefire(){……Missilem=newMissile(x,y,ptDir);returnm;}3)为了解决坦克停下来也能开火的问题——给坦克加一炮筒,根据炮筒方向和位置设定子弹的方向和位置并new出来,然后返回。每次move之后根据Tank的新方向确定炮筒的方向。if(this.dir!=Direction.STOP){this.ptDir=this.dir;}4)为了能够打出多发炮弹,使用容器填装多发炮弹,每当抬起J键的时候就往容器中加入新的炮弹Listmissiles=newArrayList();5)解决炮弹不消亡的问题,加入控制炮弹生死的量live(Missle),当炮弹已经死去就不需要对其重画,当炮弹飞出边界就死亡,当炮弹死亡就从容器中移去。if(x<0||y<0||x>TankClient.GAME_WIDTH||y>TankClient.GAME_HEIGHT){live=false;}publicvoiddraw(Graphicsg){if(!live){tc.missiles.remove(this);return;}……##大学 课程设计说明书No.13}(2)实现坦克的互相开火1)加入区分敌我的Boolean量good,根据敌我设置不同的坦克2)更新Tank的构造函数,加入good3)在TankClient中new出敌人并画出4)在Missile中加入hitTank(Tankt)方法,返回布尔类型5)借用碰撞检测的辅助类Rectangle,为Tank和Missile类都添加getRect()方法。publicRectanglegetRect(){returnnewRectangle(x,y,WIDTH,HEIGHT);}6)增加控制坦克生死的Boolean量live,如果live为false就不画了。当炮弹击中敌人坦克时,坦克被打死,子弹也死去。publicbooleanhitTank(Tankt){if(this.getRect().intersects(t.getRect())&&t.isLive()){t.setLive(false);this.live=false;returntrue;}returnfalse;}(3)添加多辆坦克1)建一容器向里面添加敌人的TankListtanks=newArrayList();添加Tankfor(inti=0;i<10;i++){tanks.add(newTank(50+40*(i+1),50,false,this));}##大学 课程设计说明书No.132)在Tank类当中添加hitTanks方法,打一系列Tank;在TankClient里面每发子弹都打tanksTank类当中hitTanks方法publicbooleanhitTanks(Listtanks){for(inti=0;i38)this.fire();}2)让敌方坦克发射炮弹。本军坦克不打本军坦克,向炮弹添加表示好坏的Boolean量good。3)修改炮弹的构造方法;修改Tank的fire方法;修改hitTank方法,坦克只能打击对方。2.2.5创建Explode类(1)加入位置属性x,,y,加入Boolean变量live(2)加入draw方法,用直径不同的圆来模拟爆炸(3)在TankClient当中创建容器,将爆炸存放与容器当中,击毙一辆坦克就产生爆炸,将爆炸逐一画出(如果死去就去除)Missile类当中的hitTank()方法publicbooleanhitTank(Tankt){if(this.getRect().intersects(t.getRect())&&t.isLive()){t.setLive(false);this.live=false;Explodee=newExplode(x,y,tc);tc.explodes.add(e);returntrue;}returnfalse;}爆炸死后去除if(!live){tc.explodes.remove(this);//死后去除return;}##大学 课程设计说明书No.132.2.6添加药箱BloodBox创建BloodBox类添加血药箱,加入必要的属性和方法,让药箱沿着固定的轨迹运动。privatestaticRandomr=newRandom();intstep=0;privateint[][]pos={{100,120},{200,300},{760,570},{280,570},{600,40},{700,60},{680,225}};publicBloodBox(){x=pos[0][0];y=pos[0][1];}privatevoidmove(){step++;if(step==pos.length){step=0;}x=pos[step][0];y=pos[step][1];}当主战Tank与药箱接触的时候,血自动加满。publicbooleaneat(BloodBoxb){if(this.live&&b.isLive()&&this.getRect().intersects(b.getRect())){this.life=100;b.setLive(false);returntrue;}returnfalse;}##大学 课程设计说明书No.132.2.7添加Home建立Home类,在Home类中为家添加普通墙壁,当墙壁中的home被打掉后游戏结束。2.2.8添加障碍物(1)添加金属墙1)建立MetalWall类,建立MetalWall对象,用绘图工具画出来2)让每一颗子弹打击每一堵墙,添加hitMetalWall()方法。当子弹接触到墙时子弹消失。publicbooleanhitMetalWall(MetalWallw){if(this.live&&this.getRect().intersects(w.getRect())){this.live=false;returntrue;}returnfalse;}3)让坦克不能穿过墙。添加记录上一次位置的oldX,oldY;修改构造函数每次move之前记录上一次的位置。添加stay方法记录移动之前的位置,当坦克撞到樯时回到移动前的位置,即当碰到墙时stay。publicbooleancollidesWithMetalWall(MetalWallw){if(this.live&&this.getRect().intersects(w.getRect())){this.stay();returntrue;}returnfalse;}(2)添加普通墙建立OrdinaryWall类,往里添加相应属性以及相应方法。具体步骤参考2.7.1##大学 课程设计说明书No.13中添加金属墙。不同之处在于Missile类当中的hitOrdinaryWall()方法,挡子弹接触到墙壁时,墙壁消失。(3)添加河水River具体细节参考2.7.1中添加金属墙(4)添加树林创建Tree类,用画图工具画出代表森林的模块,加入主窗口当中。(5)加入图片替换主窗口中的各对象再将图片加入时,运用了系统提供的工具包ToolKit,用工具包拿到所需图片后再将它放入容器中。然后再做相应的替换。下面是Missle类当中的图片加入privatestaticToolkittk=Toolkit.getDefaultToolkit();privatestaticImage[]missileImages=null;privatestaticMapimgs=newHashMap();static{missileImages=newImage[]{tk.getImage(Missile.class.getClassLoader().getResource("images/missileL.gif")),tk.getImage(Missile.class.getClassLoader().getResource("images/missileU.gif")),tk.getImage(Missile.class.getClassLoader().getResource("images/missileR.gif")),tk.getImage(Missile.class.getClassLoader().getResource("images/missileD.gif")),};imgs.put("L",missileImages[0]);imgs.put("U",missileImages[1]);imgs.put("R",missileImages[2]);imgs.put("D",missileImages[3]);}其他类的图片载入类似Missile类。##大学 课程设计说明书No.133.设计结果与分析主坦克的方向键前移:W或键盘方向键向上后移:S或方向键向下左移:A或键盘方向键向下右移:D或方向键向右普通开火键J超级开火键K游戏重新开始键F2图1游戏最终运行界面4.设计体会通过这次课程设计,通过此课程设计,初步了解了java面向对象的特点,掌握了Java的许多基本知识,提升了自己的动手能力。使我对JAVA这门课又做了一次系统的复习,对各个知识点也都有了更深刻的理解,让我掌握的更扎实,掌握JAVA的应用、编写、上机调试的基本方法,##大学 课程设计说明书No.13同时也增强了实际操作能力,了解了学生信息管理系统的工作流程以及工作模式,程序开发过程中涉及到了数据库的相关知识,使我对数据库的使用也更加的熟练,另一方面也对编程语言有了新的认识,为以后的学习打下了基础。本项目要学会图形化用户界面的构建,并且本项目用到了多线程Thread的知识。通过启用多线程机制,不断调用java.awt.*中的paint(Graphicsg)方法,将画面构造出来。其中要使用双缓冲消除闪烁现象。程序中还使用了键盘监听器类KeyMonitor实现坦克的控制操作。碰撞检测的辅助类Rectangle可以完成坦克之间,以及坦克与障碍物之间的碰撞检测。初步了解反射,知道对于classloader,每一个.class实际就是一个Class对象。学会使用Toolkit类,并使用该类加载得到图片。学会使用Random类,并使用其中的nextInt()方法得到随机数。利用了容器类往里添加对象。5.参考文献[1]CayS.Horstmann,GaryCornll,叶乃文等译..Java核心技术[M].北京:机械工业出版社,2006.5:76-85[2]周竞涛,Eclipse完全手册[M].北京:电子工业出版社,2006.8:98-110[3]王克宏,郝建文.Java技术教程[M].北京:清华大学出版社,2002.9:56-69[4]朱战立,沈伟.Java程序设计实用教程[M].北京:人民邮电出版社,2007.1:134-150##大学

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭