java实现坦克大战课程设计_第1页
java实现坦克大战课程设计_第2页
java实现坦克大战课程设计_第3页
java实现坦克大战课程设计_第4页
java实现坦克大战课程设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java实现坦克大战小游戏摘要Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。我 的课程设计是用java来做一个简单的坦克大战小游戏。我将这个程序细分 了多个部分,每个部分都建了独立的类,比如:坦克的模型类,河道,树 和坦克方向等等。之所以将之细分,是遵循了壮刖的万事万物皆对象的原 理。在实现每个类时,最简单但也是最繁琐就是建立界面及实例化坦克, 因为这牵扯了界面布局,监听的建立等;而有一些类,比如;河道、墙、坦 克,这些类这可以依样画葫芦的编写。在编写过程,借鉴了他人的一些图片模型,实现的功能也并不是和经 典的FC坦克大战相同,但是每个坦克之间的互动还是实现了的。关键词:万事万

2、物皆对象界而布局坦克之间的互动3 / 45USE JAVA TO REALIZE BATTLE CITY MINI-GAMEABSTRACTJava is a object oriented program design language what can compose cross platform application software My curriculum design is using JAVA language to make a simple small game called Tank Bat tie I break down this program into mult

3、ipie parts, each part is to establish an independent class, such as: Tank Model class, River Course class, Tree class, The Direction of Tank class and so on. The reason divides into multi pie parts, is because follow the principle of JAVA that everything is an object When implements every class, the

4、 mos t simple but also the mos t t roublesome is build int erf ace and instantiate Tank class, because it is involved of the interface layout, monitoring the establishment. While there are some classes, such as: River Course class, Wall class and Tank class, can write like stick closely to the patte

5、rn given.In the preparation process, I refer some pictures of models of others, the function of the retaliate isn, t like FC Tank Battie, but the interaction between ach tank is realizedKey words: every thing is an object, the interface layout, theinteraction between each tank1课程目的及要求11、1课程目标112 课 程

6、 的 实 现 环境1要设-23 详细设计34 测 试 结 果 及 心 得 体会5 参考文献1课程的目的及要求1、1课程目标JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学 生较系统地掌握程序设计及其在网络开发中的广泛应用,基木方法及技巧, 为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践 应用方面打下一定基础。利用java实现坦克大战小游戏。1、2课程的实现环境硬件要求能运行Windows 9. X操作系统的微机系统。JAVA程序设计语 言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。利用java的一些类和接口,详细可在详细设计中见到。1 / 452

7、概要设计2、1自定义类说明类名:Tank;作用:实现玩家能够操纵己方坦克继承的父类:无;实现的接口:无;主要的方法:draw();move();-些键盘监听。类名:Missile作用:对所有的坦克的子弹进行设置继承的父类:无;实现的接口:无;主要的方法:draw() ;move();碰到不同物体的不同处理。类名:Blood作用:实例化坦克的血条继承的父类:无;实现的接口:无;主要的方法:draw() ;move();类名:Wall作用:实例化墙继承的父类:无;实现的接口:无;主要的方法:draw ();类名:TankClient作用:该游戏的界面布局及各类的实例化继承的父类:Frame;实现的

8、接口: Runnable;主要的方法:paint();update();lauchFrame();PaintThread();KeyMonitor();3详细设计以下将各类的方法以表格的形式详细叙述:类名方法方法的作用TankDraw ()设置坦克的形状,及随 血条的变化而发生的外 观变化Move ()控制坦克的移动,玩家 可操纵自己的坦克,而 电脑操控的坦克则随机 移动(碰到墙会反方向 走)Fire ()用了方法重载,区分玩家坦克及电脑坦克的子弹的不同类名方法方法的作用MissileDraw ()设置子弹的外观Move ()设置子弹的运行轨迹hitTank ( ); hitTanks;hit

9、Wall子弹碰到三种不同物体的不同结果类名方法方法的作用BloodDraw ()设置血条的位置及外观Move ()使得血条跟随坦克移动类名方法方法的作用ExplodeDraw();循环的方法将对应图片覆盖在对象上5 / 45类名方法方法的作用WallDraw ()设置墙的形状类名方法方法的作用TankClientPaint ()指明子弹、爆炸、坦克 的数量以及坦克的生命 值Update ()刷新界面LauchFrame ()压而板,控件PaintThread ()线程控制KeyMonitor ()键盘监听# / 4519 / 454测试结果及心得体会4. 1程序运行情况当程序正常运行的时候,它

10、能清晰的显示游戏界而。玩家可以通过键盘方向键控制红色的坦克移动,通过键盘A键控制子弹发射,如下图4、1:missiles counts explodes counl.O tanks count3 tanks life. 40图4、14、2程序的异常处理 当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被 中断时,抛出该异常。有时候,一种方法可能希望测试当前线程是否己被 中断,如果己被中断,则立即抛出此异常。利用try,catch来捕获出现的 异常。tryThread, sleep (1000) ;/线程暂停一秒(1000 毫秒)catch 仃nterruptedException

11、 ex)ex. printStackTrace() ;/输出出错信息4、3心得体会本次Jam课程设计我的题目是时钟,题目不算难,但我做的很艰苦。主要就是动手能力太差,理论知识掌握的不全而,自以为会不少,但真做 起来,却不知道从哪下手了。又回去温习理论知识,请教老师,上网查资 料,忙的不亦乐乎。不过经过努力总算是做出来了,还通过此次课程设计, 将我本学期所学的JAVA知识得到巩固和应用。在设计的过程中我遇到的很 多问题,在老师的帮助和自己的思考下还是很好的完成了。这此课程设计 我懂得了写程序不能脱离实际,只凭主观办事,要努力拓宽知识面,拓展 思维。事情就是如此,努力代表收获。通过这次课程设计,我

12、才真正领悟到 “艰苦奋斗”这一词的真正含义,我才感受到早期电子设计者为现代的社 会付出。设计确实有些辛苦,但苦中也有乐,在如今单一的理论学习中, 很少有机会能有实践的机会,但现在可以,这些天的设计中得到的东西却 不比理论课上得到的少多少,我感觉我和Java的距离更加近了;我想说, 确实很累,但当我看到自己所做的成果时,心中也不免产生兴奋;学习 有成果了么。对Java编程有了一个基木的了解。这些天温习的内容越多,敲得代码 越多,自己的学习积极性也越在提高,感觉也越充实。越来越发现现在学 习的只是Java的基础,但涉及的而还是很广泛的,这些都为以后进一步学 习Java的高级特性打下了扎实的基础。随

13、着课程难度的慢慢加强,今后遇 到的困难也必将会越来越多,但我相信自己一定能做好这些的。在本次Java课程设计中,我要非常感谢我的指导老师丁老师,不但在 课堂上教给了我很多的Java的编程知识,编程思想,而且在这次课程设计 中更教会了我动手的能力,真正的编出了自己的东西,还要感谢我的同学, 他们在我遇到困难时也给了我很多帮助。参考文献II David Flanagan编.Java实例技术手册附录源程序代码:/Tank 类package com. bjsxt tank;import java. awt*;import java awt event *;import java .util.*; pu

14、blic class Tank publicstaticfinalintXSPEED=5;publicstaticfinalintYSPEED=5;publicstaticfinalintWIDTH =二 30;publicstaticfinalintHEIGHT=30;private boolean live = true;private BloodBar bb = new BloodBar();private int life = 100;TankClient tc;private boolean good;private int x, y;private int oldX, oldY;p

15、rivate static Random r = new Random();private boolean bL二false, bUfalse, bR=false, bD 二 false;private Direction dir = Direction. STOP;private Direction ptDir = Direction.D;private int step = r. nextlnt (12) + 3;public Tank(int x, int y, boolean good) this x = x;this, y = y;this oldX 二 x;this oldY 二

16、y;this good 二 good;Direction dir,public Tank(int x, int y, boolean good,TankClienttc) this(x, y, good);this dir 二 dir;this tc = tc;public void draw(Graphics g) if (!live) if (!good) tc. tanks remove (this);return;Color c = g. getColor();if (good) g. setColor (Color. RED); else g.setColor(Color. BLUE

17、);g. fillOval(x, y, WIDTH, HEIGHT);g. setColor (c);if (good) bb. draw (g);switch(ptDir) case L:+ Tank. HEIGHT/2, x,+ Tank. HEIGHT/2, x,g. drawLine (x + Tank. WIDTH/2, y y + Tank. HEIGHT/2);break;case LU:g. drawLine (x + Tank. WIDTH/2, yy);break;case U:g. drawLine (x + Tank. WIDTH/2, y+ Tank. WIDTH/2

18、, y);break;case RU:g. drawLine (x + Tank. WIDTH/2, y+ Tank. WIDTH, y);break;case R:g. drawLine (x + Tank. WIDTH/2, y+ Tank. WIDTH, y + Tank. HEIGHT/2);break;case RD:g. drawLine (x + Tank. WIDTH/2, y+ Tank. WIDTH, y + Tank. HEIGHT);break;case D:g. drawLine (x + Tank. WIDTH/2, y+ Tank. WIDTH/2, y + Ta

19、nk. HEIGHT);break;case LD:+ Tank. HEIGHT/2,+ Tank. HEIGHT/2,+ Tank. HEIGHT/2,+ Tank. HEIGHT/2,+ Tank. HEIGHT/2,+ Tank. HEIGHT/2,g. drawLine (x + TankWIDTH/2, y y + Tank. HEIGHT); break;move ();void move () this oldX 二 x;this oldY 二 y;switch(dir) case L:x -= XSPEED; break;case LU:x -= XSPEED; y -= YS

20、PEED; break;case U:y -= YSPEED; break;case RU:x +二 XSPEED;y 一二 YSPEED;break;case R:x +二 XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;if(this, dir != Direction. STOP) this ptDir 二 thisdir;if(x 0) x = 0;if(y TankClien

21、t. GMffi_WIDTH) x = TankClient. GAME_WIDTH - Tank. WIDTH;if(y + Tank. HEIGHT TankClient. GAME_HEIGHT) y TankClient. GAME_HEIGHT - Tank. HEIGHT;if (! good) DirectionH dirs = Direction, values ();if (step = 0) step = r.nextlnt(12) + 3;int rn = r. nextInt(dirs, length);dir = dirsrn;step ;if (r. nextlnt

22、 (40) 38) this, fire ();private void stay() x = oldX;y = oldY;public void keyPressed(KeyEvent e) int key = e. getKeyCode ();switch(key) case KeyEvent VK_F2 :if (!this, live) this live 二 true;this, life = 100;break;case KeyEvent. VK_LEFT :bL = true;break;case KeyEvent. VK_UP :bU = true;break;case Key

23、Event. VK_RIGHT :bR = true;break;case KeyEvent. VK_D0WN :bD = true;break;locateDirection ();void locateDirection () 辻(bL & !bU & !bR & !bD) dir 二 Direction.L;else辻(bL & bU & !bR & !bD) dir = Direction. LU;else辻(!吐 & bU & !bR & !bD) dir = Direction. U;else辻(!吐 & bU & bR & !bD) dir = Direction. RU;els

24、e辻(!吐 & !bU & bR & !bD) dir = Direction. R;else辻(!肛 & !bU & bR & bD) dir = Direction. RD;else辻(!比 & !bU & !bR & bD) dir = Direction. D;else辻(bL & !bU & !bR & bD) dir = Direction.LD;else辻(!吐 & !bU & !bR & !bD) dir = Direction. STOP;public void keyReleased(KeyEvent e) int key = e.getKeyCode();switch(k

25、ey) case KeyEvent. VK_C0NTR0L:fireO;break;case KeyEvent VK_LEFT :bL = false;break;case KeyEvent VK_UP :bU = false;break;case KeyEvent. VK_RIGHT :bR = false;break;case KeyEvent. VK_DOTO :bD = false;break;case KeyEvent VK_A :superFire ();break;locateDirection();public Missile fire() if(!live) return n

26、ull;int x = this, x + Tank. WIDTH/2 - Missile. WIDTH/2;int y = this, y + Tank. HEIGHT/2 - Missile. HEIGHT/2;Missile m = new Missile(x, y, good, ptDir, thistc);tc. missiles add(m);return m;public Missile fire(Direction dir) if(!live) return null;int x = this, x + Tank. WIDTH/2 - Missile. WIDTH/2;int

27、y = this, y + Tank. HEIGHT/2 - Missile. HEIGHT/2;Missile m 二 new Missile(x, y, good, dir, this tc);tc. missiles add(m);return m;public Rectangle getRect() return new Rectangle(x, y, WIDTH, HEIGHT); public boolean isLive() return live;public void setLive(boolean live) thislive 二 live;public boolean i

28、sGoodO return good;/*撞墙* param w被撞的墙* return 撞上了返回 true,否则 false*/public boolean collidesWithWall(Wall w) if (this .live & this .get Rec t()int ersects (w getRect() this st ay ();return true;return false;public boolean collidesWithTanks(java.util. List tanks) for (int i=0; itanks. size () ; i+) Tank

29、 t 二 tanks get (i);if(this != t) this getRect() intersects(t getRect() this st ay ();t. stay ();return true;return false;private void superFire() Direction dirs = Direction. values();for(int i=0; i8; i+) fire(dirsi);public int getLife() return life;public void setLife(int life) this life 二 life;# /

30、45private class BloodBar public void draw(Graphics g) Color c = g getColor();g. setColor (Color. RED);g. drawRect (x, y-10, WIDTH, 10);int w 二 WIDTH * 1辻e/100 ;g. f illRect (x, y-10, w, 10);g setColor (c);public boolean eat(Blood b) if(t his .live & b i sLive () & this get.Rect ()int ersects(b. getR

31、ect () this. 1 i.fe = 100;b setLive(false);return true;return false;/missile 类package com bjsxt tank;import java. awt*;import java .util. List;public class Missile public static finalint XSPEED10;public static finalint YSPEED 二 10;public static finalint WIDTH 二 10;public static finalint HEIGHT 二 10;

32、int x, y;Direction dir;private boolean good;private boolean live = true;private TankClient tc;public Missile(int x, int y, Direction dir)this, y = y;this dir = dir;public Missile(int x, int y, boolean good, Direction dir, TankClient tc) this (x, y, dir);this good 二 good;this tc = tc;public void draw

33、(Graphics g) 辻(!live) tc. missiles remove(this);return;Color c = g.getColor();if (good) g. setColor (Color. RED); else g. setColor(Color. BLACK);g. fillOval(x, y, WIDTH, HEIGHT);g setColor (c);move ();this x = x;25 / 45private void move() switch(dir) case L:x -= XSPEED; break;case LU:x -= XSPEED; y

34、-= YSPEED; break;case U:y -= YSPEED;break;case RU:x += XSPEED; y -= YSPEED; break;case R:x +二 XSPEED;break;case RD:x +二 XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;辻(x 0| y Tankclient. GAME_WIDTH | Y TankClient. GAME_HEIGHT) live = false;pu

35、blic boolean isLive() return live;public Rectangle getRect() return new Rectangle (x, y, WIDTH, HEIGHT);public boolean hitTank(Tank t) if(this.1 ive & this getRect()intersects (tgetRect() &t. isLive() & this, good != t. isGoodO) if (t. isGoodO) t. setLife (t. getLife () -20);辻(t. getL辻e() = 0) t. se

36、tLive (false); else t. setLive (false);this. live = false;Explode e 二 new Explode(x, y, tc);tc.explodes add(e);return true;return false;public boolean hitTanks(List tanks) for(int i=0; itankssize(); i+) if(hitTank(tanks.get (i) return true;return false;public boolean hitWall(Wall w) if(t his .live &

37、 this .get Rec t()int ersec ts(w getRect() this live = false;return true;return false;/blood 类package com. bjsxt tank;import javaawt*;public class Blood int x, y, w, h;TankClient tc;int step = 0;private boolean live 二 true;/指明血块运动的轨迹,由POS中各个点构成private intJ LJ pos = 350, 300, 360, 300, 375, 275,400,

38、200, 360, 270, 365, 290, 340, 280;public Blood() x = pos0 0;y = pos0 1;w = h = 15;public void draw(Graphics g) if(!live) return;Color c = g. getColor ();g. setColor(Color. MAGENTA);g. f illRect (x, y, w, h);g. setColor (c);move ();private void move() step +;if (step = pos length)step = 0;x = posstep

39、 0;y = posstep 1;public Rectangle getRect () return new Rectangle(x, y, w , h);public boolean isLive() return live;public void setLive(boolean live) this live = live;/explode 类package com. bjsxt tank;import javaawt*;public class Explode int x, y;private boolean live = true;private TankClient tc ;pri

40、vate static Toolkit tk = Toolkit. getDefaultToolkit();private static Image imgs = tk getImage(Explode class getClassLoader() getResource (,zimages/0. g辻),tk getImage(Explode class getClassLoader() getResource(,zimages/1. gif),tk getlmage(Explode class getClassLoader() getResourceCimages/2. gif),tk.

41、getlmage(Explode class getClassLoader() getResource(,zimages/3. g辻),tk. getlmage(Explode class getClassLoader () getResource(,zimages/4. gifz,),tk. getlmage(Explode class getClassLoader() getResourceCimages/5. gif),tk. getlmage(Explode class getClassLoader() getResourceCimages/6. gifz,),tk. getImage

42、(Explode class getClassLoader() getResource(z,images/7 gif), tk getImage(Explode class getClassLoader() getResourceCimages/8. g辻),tk getlmage(Explode. class getClassLoader() getResourceCimages/9. gif),tk getlmage(Explode class getClassLoader() getResource (images/lO. g辻);int step = 0;private static

43、boolean init = false;public Explode(int x, int y, TankClient tc) this x = x;this, y = y;this tc = tc;public void draw(Graphics g) if(!init) for (int i = 0; i explodes = new ArrayList();List missiles = new ArrayList();LisTank tanks = new ArrayList();Image offScreenlmage = null;Blood b 二 new Blood();p

44、ublic void paint(Graphics g) /*指明子弹-爆炸-坦克的数量*以及坦克的生命值*/g. drawString(missiles count: + missiles, size(), 10, 50);g. drawString(explodes count: + explodes.size(), 10, 70);g. drawString (vtankscount: + tanks.size(), 10, 90);g drawString (tankslife:,z + myTank getLife(), 10,no);if (tanks, size () = 0)

45、for(int i=0; i5; i+) tanks, add(new Tank(50 + 40*(i+l), 50,false, Direction. D, this);for(int i=0; imissiles. size(); i+) Missile m = missiles.get (i);m. hitTanks(tanks);m. hitTank(myTank);m. hitWall (wl);m. hitWall (w2);m. draw(g);/if(!m. isLive () missiles, remove(m);/else m. draw(g);for(int i=0; iexplodes.size(); i+) Explode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论