1、 基于 java 实现电子时钟 1Java 实现坦克大战小游戏摘要Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言。我的课程设计是用 java 来做一个简单的坦克大战小游戏。我将这个程序细分了多个部分,每个部分都建了独立的类,比如:坦克的模型类,河道,树和坦克方向等等。之所以将之细分,是遵循了 java 的万事万物皆对象的原理。在实现每个类时,最简单但也是最繁琐就是建立界面与实例化坦克,因为这牵扯了界面布局,监听的建立等;而有一些类,比如;河道、墙、坦克,这些类这可以依样画葫芦的编写。在编写过程,借鉴了他人的一些图片模型,实现的功能也并不是和经典的 FC 坦克大战相同,但是每个坦
2、克之间的互动还是实现了的。关键词:万事万物皆对象 界面布局 坦克之间的互动基于 java 实现电子时钟 2USE 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 Battle. I
3、break down this program into multiple 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 multiple parts, is because follow the principle of JAVA that everything is an object.
4、 When implements every class, the most simple but also the most troublesome is build interface 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 lik
5、e stick closely to the pattern given.In the preparation process, I refer some pictures of models of others, the function of the retaliate isnt like FC Tank Battle, but the interaction between ach tank is realized. Key words: everything is an object, the interface layout, the interaction between each
6、 tank基于 java 实现电子时钟 3目 录1 课程目的与要求11、1 课程目标11、2 课程的实现环境12 概要设计23 详细设计34 测试结果与心得体会5 参考文献附录源程序代码基于 java 实现电子时钟 第 1 页 共 8 页1 课程的目的与要求1、1 课程目标JAVA 程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。利用 java 实现坦克大战小游戏。1、2 课程的实现环境硬件要求能运行 Windows 9.X 操作系统的
7、微机系统。JAVA 程序设计语言及相应的集成开发环境,J2SDK 和 ECLIPSE 开发工具。利用 java 的一些类和接口,详细可在详细设计中见到。基于 java 实现电子时钟 第 2 页 共 8 页2 概要设计2、1 自定义类说明类名:Tank;作用:实现玩家能够操纵己方坦克继承的父类:无; 实现的接口:无;主要的方法:draw();move();一些键盘监听。类名:Missile作用:对所有的坦克的子弹进行设置继承的父类:无; 实现的接口:无;主要的方法:draw();move();碰到不同物体的不同处理。类名:Blood作用:实例化坦克的血条继承的父类:无; 实现的接口:无;主要的方
8、法:draw();move();类名:Wall作用:实例化墙继承的父类:无; 实现的接口:无;主要的方法:draw();类名:TankClient作用:该游戏的界面布局及各类的实例化继承的父类:Frame; 实现的接口:Runnable;主要的方法:paint();update();lauchFrame();PaintThread();KeyMonitor();基于 java 实现电子时钟 第 3 页 共 8 页3 详细设计以下将各类的方法以表格的形式详细叙述:类名 方法 方法的作用Draw() 设置坦克的形状,及随血条的变化而发生的外观变化Move() 控制坦克的移动,玩家可操纵自己的坦克,
9、而电脑操控的坦克则随机移动(碰到墙会反方向走)TankFire() 用了方法重载,区分玩家坦克与电脑坦克的子弹的不同类名 方法 方法的作用Draw() 设置子弹的外观Move() 设置子弹的运行轨迹MissilehitTank() ;hitTanks;hitWall子弹碰到三种不同物体的不同结果类名 方法 方法的作用Draw() 设置血条的位置及外观BloodMove() 使得血条跟随坦克移动类名 方法 方法的作用Explode Draw(); 循环的方法将对应图片覆基于 java 实现电子时钟 第 4 页 共 8 页盖在对象上类名 方法 方法的作用Wall Draw() 设置墙的形状类名 方
10、法 方法的作用Paint() 指明子弹、爆炸、坦克的数量以及坦克的生命值Update() 刷新界面LauchFrame() 压面板,控件PaintThread() 线程控制TankClientKeyMonitor() 键盘监听基于 java 实现电子时钟 第 5 页 共 8 页4 测试结果与心得体会4、1 程序运行情况当程序正常运行的时候,它能清晰的显示游戏界面。玩家可以通过键盘方向键控制红色的坦克移动,通过键盘 A 键控制子弹发射,如下图 4、1:图 4、14、2 程序的异常处理当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛基于 java 实现电子时钟 第 6 页
11、 共 8 页出该异常。有时候,一种方法可能希望测试当前线程是否已被中断,如果已被中断,则立即抛出此异常。利用 trycatch 来捕获出现的异常。tryThread.sleep(1000); /线程暂停一秒(1000 毫秒)catch (InterruptedException ex)ex.printStackTrace(); /输出出错信息4、3 心得体会本次 Java 课程设计我的题目是时钟,题目不算难,但我做的很艰苦。主要就是动手能力太差,理论知识掌握的不全面,自以为会不少,但真做起来,却不知道从哪下手了。又回去温习理论知识,请教老师,上网查资料,忙的不亦乐乎。不过经过努力总算是做出来了
12、,还通过此次课程设计,将我本学期所学的 JAVA 知识得到巩固和应用。在设计的过程中我遇到的很多问题,在老师的帮助和自己的思考下还是很好的完成了。这此课程设计我懂得了写程序不能脱离实际,只凭主观办事,要努力拓宽知识面,拓展思维。 事情就是如此,努力代表收获。通过这次课程设计,我才真正领悟到“艰苦奋斗”这一词的真正含义,我才感受到早期电子设计者为现代的社会付出。设计确实有些辛苦,但苦中也有乐,在如今单一的理论学习中,很少有机会能有实践的机会,但现在可以,这些天的设计中得到的东西却不比理论课上得到的少多少,我感觉我和 Java 的距离更加近了;我想说,确实很累,但当我看到自己所做的成果时,心中也不
13、免产生兴奋; 学习有成果了么。 对 Java 编程有了一个基本的了解。这些天温习的内容越多,敲得代码越多,自己的学习积极性也越在提高,感觉也越充实。越来越发现现在学习的只是 Java 的基础,但涉及的面还是很广泛的,这些都为以后进一步学习 Java 的高级特性打下了扎实的基础。随着课程难度的慢慢加强,今后遇到的困难也必将会越来越多,但我相信自己一定能做好这些的。 在本次 Java 课程设计中,我要非常感谢我的指导老师丁老师,不但在课堂上教给基于 java 实现电子时钟 第 7 页 共 8 页了我很多的 Java 的编程知识,编程思想,而且在这次课程设计中更教会了我动手的能力,真正的编出了自己的
14、东西,还要感谢我的同学,他们在我遇到困难时也给了我很多帮助。 参考文献1 David Flanagan 编. Java 实例技术手册 基于 java 实现电子时钟 第 8 页 共 8 页附录源程序代码:/Tank 类package com.bjsxt.tank;import java.awt.*;import java.awt.event.*;import java.util.*;public class Tank public static final int XSPEED = 5;public static final int YSPEED = 5;public static final
15、int WIDTH = 30;public static final int HEIGHT = 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;private static Random r = new Random();private boolean bL=false, bU=false, bR=false, b
16、D = false;private Direction dir = Direction.STOP;private Direction ptDir = Direction.D;private int step = r.nextInt(12) + 3;基于 java 实现电子时钟 第 9 页 共 8 页public Tank(int x, int y, boolean good) this.x = x;this.y = y;this.oldX = x;this.oldY = y;this.good = good;public Tank(int x, int y, boolean good, Dir
17、ection dir, TankClient tc) 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);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);基于 java 实现电子时钟 第 10 页
18、共 8 页if(good) bb.draw(g);switch(ptDir) case L:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT/2);break;case LU:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y);break;case U:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y);break;case RU:g.drawLine(x + Tank.
19、WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y);break;case R:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT/2);break;case RD:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT);break;case D:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x
20、 + Tank.WIDTH/2, y + Tank.HEIGHT);基于 java 实现电子时钟 第 11 页 共 8 页break;case LD:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, 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 -= YSPEED;break;case U:y -= YSPEED;break;case
21、 RU:x += XSPEED;y -= YSPEED;break;case R:基于 java 实现电子时钟 第 12 页 共 8 页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 = this.dir;if(x TankClient.GAME_WIDTH) x = TankClient.G
22、AME_WIDTH - Tank.WIDTH;if(y + Tank.HEIGHT TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;if(!good) Direction dirs = Direction.values();if(step = 0) step = r.nextInt(12) + 3;基于 java 实现电子时钟 第 13 页 共 8 页int rn = r.nextInt(dirs.length);dir = dirsrn;step -;if(r.nextInt(40) 38) this.fire
23、();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 KeyEvent.VK_RIGHT :基于 java 实现电子
24、时钟 第 14 页 共 8 页bR = true;break;case KeyEvent.VK_DOWN :bD = true;break;locateDirection();void locateDirection() if(bL else if(bL else if(!bL else if(!bL else if(!bL else if(!bL else if(!bL else if(bL else if(!bL public void keyReleased(KeyEvent e) int key = e.getKeyCode();switch(key) case KeyEvent.VK
25、_CONTROL:fire();break;case KeyEvent.VK_LEFT :bL = false;基于 java 实现电子时钟 第 15 页 共 8 页break;case KeyEvent.VK_UP :bU = false;break;case KeyEvent.VK_RIGHT :bR = false;break;case KeyEvent.VK_DOWN :bD = false;break;case KeyEvent.VK_A :superFire();break;locateDirection();public Missile fire() if(!live) retu
26、rn null;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, this.tc);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;基于 java 实
27、现电子时钟 第 16 页 共 8 页int 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) this.live = liv
28、e;public boolean isGood() return good;/* 撞墙* param w 被撞的墙* return 撞上了返回 true,否则 false*/public boolean collidesWithWall(Wall w) if(this.live return true;return false;public boolean collidesWithTanks(java.util.List tanks) for(int i=0; i TankClient.GAME_WIDTH | y TankClient.GAME_HEIGHT) live = false;基于
29、 java 实现电子时钟 第 22 页 共 8 页public boolean isLive() return live;public Rectangle getRect() return new Rectangle(x, y, WIDTH, HEIGHT);public boolean hitTank(Tank t) if(this.live if(t.getLife() tanks) for(int i=0; itanks.size(); i+) if(hitTank(tanks.get(i) 基于 java 实现电子时钟 第 23 页 共 8 页return true;return fa
30、lse;public boolean hitWall(Wall w) if(this.live return true;return false;/blood 类package com.bjsxt.tank;import java.awt.*;public class Blood int x, y, w, h;TankClient tc; int step = 0;private boolean live = true;/指明血块运动的轨迹,由 pos 中各个点构成private int pos = 350, 300, 360, 300, 375, 275, 400, 200, 360, 27
31、0, 365, 290, 340, 280基于 java 实现电子时钟 第 24 页 共 8 页;public Blood() x = pos00;y = pos01;w = h = 15;public void draw(Graphics g) if(!live) return;Color c = g.getColor();g.setColor(Color.MAGENTA);g.fillRect(x, y, w, h);g.setColor(c);move();private void move() step +;if(step = pos.length)step = 0;x = posst
32、ep0;y = posstep1;public Rectangle getRect() return new Rectangle(x, y, w , h);public boolean isLive() return live;基于 java 实现电子时钟 第 25 页 共 8 页public void setLive(boolean live) this.live = live;/explode 类package com.bjsxt.tank;import java.awt.*;public class Explode int x, y;private boolean live = true
33、;private TankClient tc ;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image imgs = tk.getImage(Explode.class.getClassLoader().getResource(“images/0.gif“),tk.getImage(Explode.class.getClassLoader().getResource(“images/1.gif“),tk.getImage(Explode.class.getClassLoader().getReso
34、urce(“images/2.gif“),tk.getImage(Explode.class.getClassLoader().getResource(“images/3.gif“),tk.getImage(Explode.class.getClassLoader().getResource(“images/4.gif“),tk.getImage(Explode.class.getClassLoader().getResource(“images/5.gif“),tk.getImage(Explode.class.getClassLoader().getResource基于 java 实现电子
35、时钟 第 26 页 共 8 页(“images/6.gif“),tk.getImage(Explode.class.getClassLoader().getResource(“images/7.gif“),tk.getImage(Explode.class.getClassLoader().getResource(“images/8.gif“),tk.getImage(Explode.class.getClassLoader().getResource(“images/9.gif“),tk.getImage(Explode.class.getClassLoader().getResource(
36、“images/10.gif“);int step = 0;private static 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 imgs.length; i+) g.drawImage(imgsi, -100, -100, null);init = true;if(!live) tc.explodes.remove(thi
37、s);return;基于 java 实现电子时钟 第 27 页 共 8 页if(step = imgs.length) live = false;step = 0;return;g.drawImage(imgsstep, x, y, null);step +;/wall 类package com.bjsxt.tank;import java.awt.*;public class Wall int x, y, w, h;TankClient tc ;public Wall(int x, int y, int w, int h, TankClient tc) this.x = x;this.y = y;this.w = w;this.h = h;this.tc = tc;public void draw(Graphics g) Color c = g.getColor();g.setColor(Color.DARK_GRAY);