全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华北科技学院计算机系综合性实验报告华北科技学院计算机学院综合性实验实 验 报 告 课程名称 JAVA程序设计 实验学期 2013 至 2014 学年 第 1 学期学生所在院部 计算机学院 年级 2012级 专业班级 学生姓名 学号 任课教师 鞠宏军 实验成绩 计算机学院制Java程序设计课程综合性实验报告开课实验室:基础七 2013 年 12 月 30日实验题目基于Java的坦克大战小游戏一、 实验目的通过编写Java的应用系统综合实例坦克大战,总结、回顾和实践面向对象的编程思想以及编程方法,并通过编写程序来掌握Java语言编程技巧,将学习到的知识融会贯通,同时提高调试程序的能力,养成良好的编程习惯,并增强对程序设计整体思路的把握。程序使用Eclipse集成开发环境完成,熟悉并掌握在Eclipse开发环境下编写Java程序。二、 设备与环境硬件:多媒体计算机软件:Windows系列操作系统、JDK开发包、Eclipse开发环境三、实验内容及要求1.实验要求1、系统的功能模块设计。要求画出功能模块框图。2、系统的详细设计。3、应用到的关键技术的详细说明。可附相关的关键程序代码。4、系统页面设计要求清晰、实用、美观。2.实验内容功能模块图:功能提示1. 游戏要有图形用户界面,界面能够反映游戏所有的细节。2. 界面中要有坦克,墙,树林,河流。3. 界面中要有一个“家”,“家”被攻击中则输了游戏。4. 坦克分两种,敌方和我方。5. 墙也分为两种,可以穿透的普通墙,不可以穿透的铁墙。6. 树和河流均只有一种,树林坦克可以通过。7. 坦克可以发射子弹,敌我方的子弹属性一样。8. 我方子弹可以杀死敌方坦克,敌方子弹也可以杀死我方坦克,但需要多枪子弹才可以杀死。9. 敌方之间不可以杀死对方。10. 子弹击中坦克要有爆炸,但击中墙不能爆炸。11. 我方可以吃血包增加生命。游戏可以暂停,重新开始,游戏帮助等功能。具体如下图具体设计1. 图形用户界面图形用户界面要用到Java课程里知识,需要用到抽象窗口工具集即AWT和Swing来设计实现,由于游戏需要有功能按键来控制游戏的重新开始,退出,暂停,帮助等,所以在实现过程中,设计菜单项。 坦克,河流,树,家,墙等都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。界面的构造在程序中由TankClient类的构造方法来完成,即没构造一个用户类都会产生这样一个包含各种游戏元素在内的界面。由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的普通墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。在程序中,此部分功能也是由TankClient类里的update函数和framPaint函数共同实现,将“动”的元素进行重画,而不动的元素如菜单项就不用重画,所以这也是为什么把菜单项设计进TankClient类的构造方法中。当然,图形用户界面中也包括对各种界面元素的大小,位置和颜色等设计,细节问题这里就不赘述。2. 界面中的元素界面中的元素都是在构造界面的时候用界面实例对象的add方法加入进去的,且“动”的元素要不断更新重画。3. 坦克坦克主要由Tank类来实现。坦克的属性:速度(有X轴和Y轴速度之分),坦克大小,坦克所在新的位置(X坐标和Y坐标),坦克是否还活着,行动方向等。所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行。在设计过程中,坦克出现的位置由坐标而定。用户方之后的位置由键盘监听方向,按指定方向以恒定的速度前进此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题,这个功能由Tank类里的changToOldDir()方法实现。坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到F,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。 由于坦克在碰到墙,界面边界和“家”等阻碍物时要改变方向,所以在Tank里面必须对于每一种阻碍物要设计一个方法来作为应对策略,当然解决方法是把下一步的位置调整到上一步的位置。用户方Tank还可以吃红心来增加自己的生命值,得到一个红心,增加100生命值。所以在程序中坦克必须要有一个方法来判断当坦克接触到红心时,生命值增加的方法。程序中用eat()方法来实现“吃”红心并且增加生命值,当然,这其中要使得坦克的生命值不会超过自己生命的极限值200,所以判断的时候,当生命小于等于100时,直接加100生命值,但是当生命值大于100时,就只能使生命值加满到极限值200.当然,说到生命值,一定要在图形用户界面中显示出来,所以在Tank类里面一定要设计一个方法,来画出生命的增减过程,在Tank类里面是用DrawBloodbBar()来刻画。源程序import java.awt.*;import java.awt.event.*;import java.util.*;public class Tank public static int speedX = 6, speedY =6; / 静态全局变量速度-可以作为扩张来设置级别,速度快的话比较难public static int count = 0;public static final int width = 35, length = 35; / 坦克的全局大小,具有不可改变性private Direction direction = Direction.STOP; / 初始化状态为静止private Direction Kdirection = Direction.U; / 初始化方向为向上TankClient tc;private boolean good;private int x, y;private int oldX, oldY;private boolean live = true; / 初始化为活着private int life = 200; / 初始生命值private static Random r = new Random();private int step = r.nextInt(10)+5 ; / 产生一个随机数,随机模拟坦克的移动路径private boolean bL = false, bU = false, bR = false, bD = false;private static Toolkit tk = Toolkit.getDefaultToolkit();/ 控制面板private static Image tankImags = null; / 存储全局静态static tankImags = new Image tk.getImage(BombTank.class.getResource(Images/tankD.gif),tk.getImage(BombTank.class.getResource(Images/tankU.gif),tk.getImage(BombTank.class.getResource(Images/tankL.gif),tk.getImage(BombTank.class.getResource(Images/tankR.gif), ;public Tank(int x, int y, boolean good) / Tank的构造函数1 this.x = x;This. y = y;this.oldX = x;this.oldY = y;this.good = good;public Tank(int x, int y, boolean good, Direction dir, TankClient tc) / Tank的构造函数2this(x, y, good);this.direction = dir;this.tc = tc;public void draw(Graphics g) if (!live) if (!good) tc.tanks.remove(this); / 删除无效的return;if (good)new DrawBloodbBar().draw(g); / 创造一个血包switch (Kdirection) /根据方向选择坦克的图片case D:g.drawImage(tankImags0, x, y, null);break;case U:g.drawImage(tankImags1, x, y, null);break;case L:g.drawImage(tankImags2, x, y, null);break;case R:g.drawImage(tankImags3, x, y, null);break;move(); /调用move函数void move() this.oldX = x;this.oldY = y;switch (direction) /选择移动方向case L:x -= speedX;break;case U:y -= speedY;break;case R:x += speedX;break;case D:y += speedY;break;case STOP:break;if (this.direction != Direction.STOP) this.Kdirection = this.direction;if (x 0)x = 0;if (y TankClient.Fram_width) /超过区域则恢复到边界x = TankClient.Fram_width - Tank.width;if (y + Tank.length TankClient.Fram_length)y = TankClient.Fram_length - Tank.length;if (!good) Direction directons = Direction.values();if (step = 0) step = r.nextInt(12) + 3; /产生随机路径int rn = r.nextInt(directons.length);direction = directonsrn; /产生随机方向step-;if (r.nextInt(40) 38)/产生随机数,控制敌人开火this.fire();private void changToOldDir() x = oldX;y = oldY;public void keyPressed(KeyEvent e) /接受键盘事件int key = e.getKeyCode();switch (key) case KeyEvent.VK_R: /当按下R时,重新开始游戏 tc.tanks.clear(); /清理tc.bullets.clear();tc.trees.clear();tc.otherWall.clear();tc.homeWall.clear();tc.metalWall.clear();tc.homeTank.setLive(false);if (tc.tanks.size() = 0) /当在区域中没有坦克时,就出来坦克 for (int i = 0; i 20; i+) if (i 9) /设置坦克出现的位置tc.tanks.add(new Tank(150 + 70 * i, 40, false,Direction.R, tc);else if (i 15)tc.tanks.add(new Tank(700, 140 + 50 * (i -6), false,Direction.D, tc);elsetc.tanks.add(new Tank(10, 50 * (i - 12), false,Direction.L, tc); tc.homeTank = new Tank(300, 560, true, Direction.STOP, tc);/设置自己出现的位置if (!tc.home.isLive() /将home重置生命tc.home.setLive(true);new TankClient(); /重新创建面板break;case KeyEvent.VK_RIGHT: /监听向右键bR = true;break;case KeyEvent.VK_LEFT:/监听向左键bL = true;break;case KeyEvent.VK_UP: /监听向上键bU = true;break;case KeyEvent.VK_DOWN:/监听向下键bD = true;break;decideDirection();/调用函数确定移动方向void decideDirection() if (!bL & !bU & bR & !bD) /向右移动direction = Direction.R;else if (bL & !bU & !bR & !bD) /向左移direction = Direction.L;else if (!bL & bU & !bR & !bD) /向上移动direction = Direction.U;else if (!bL & !bU & !bR & bD) /向下移动direction = Direction.D;else if (!bL & !bU & !bR & !bD)direction = Direction.STOP; /没有按键,就保持不动public void keyReleased(KeyEvent e) /键盘释放监听int key = e.getKeyCode();switch (key) case KeyEvent.VK_F:fire();break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_DOWN:bD = false;break;decideDirection(); /释放键盘后确定移动方向public Bullets fire() /开火方法if (!live)return null;int x = this.x + Tank.width / 2 - Bullets.width / 2; /开火位置int y = this.y + Tank.length / 2 - Bullets.length / 2;Bullets m = new Bullets(x, y + 2, good, Kdirection, this.tc); /没有给定方向时,向原来的方向发火tc.bullets.add(m); return m;public Rectangle getRect() return new Rectangle(x, y, width, length);public boolean isLive() return live;public void setLive(boolean live) this.live = live;public boolean isGood() return good;public boolean collideWithWall(CommonWall w) /碰撞到普通墙时if (this.live & this.getRect().intersects(w.getRect() this.changToOldDir(); /转换到原来的方向上去return true;return false;public boolean collideWithWall(MetalWall w) /撞到金属墙if (this.live & this.getRect().intersects(w.getRect() this.changToOldDir(); return true;return false;public boolean collideRiver(River r) /撞到河流的时候if (this.live & this.getRect().intersects(r.getRect() this.changToOldDir();return true;return false;public boolean collideHome(Home h) /撞到家的时候if (this.live & this.getRect().intersects(h.getRect() this.changToOldDir();return true;return false;public boolean collideWithTanks(java.util.List tanks) /撞到坦克时for (int i = 0; i tanks.size(); i+) Tank t = tanks.get(i);if (this != t) if (this.live & t.isLive()& this.getRect().intersects(t.getRect() this.changToOldDir();t.changToOldDir();return true;return false;public int getLife() return life;public void setLife(int life) this.life = life;private class DrawBloodbBar public void draw(Graphics g) Color c = g.getColor();g.setColor(Color.RED);g.drawRect(375, 585, width, 10);int w = width * life / 200;g.fillRect(375, 585, w, 10);g.setColor(c);public boolean eat(GetBlood b) if (this.live & b.isLive() & this.getRect().intersects(b.getRect() if(this.life=100)this.life = this.life+100; /每吃一个,增加100生命点elsethis.life = 200;b.setLive(false);return true;return false;public int getX() return x;public int getY() return y;4. 树林树林主要是用来做修饰物体的,具有不透明性。由一个Tree类来描述,Tree有两个属性,位置和长宽。树的类里有一个自己的构造方法,当然还有一个必不可少的draw()方法。源程序:import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit;/设置界面树和丛林public class Tree public static final int width = 30;public static final int length = 30;int x, y;TankClient tc ;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image treeImags = null;static treeImags = new Imagetk.getImage(CommonWall.class.getResource(Images/tree.gif),;public Tree(int x, int y, TankClient tc) /Tree的构造方法,传递x,y和tc对象this.x = x;this.y = y;this.tc = tc;public void draw(Graphics g) /画出树g.drawImage(treeImags0,x, y, null);5. 河流河流的作用与树林类似。6. 墙体墙体分为普通墙和铁墙。普通墙可以被子弹损坏,而铁墙则不会。 普通墙普通墙有以下几个属性:墙的固定长度和宽度,墙的位置坐标,墙体是由图片加入到图形用户界面来表示的。程序中用CommonWall类来描述普通墙,此类里有一个构造方法,用于传递参数,还有一个draw()方法,来画指定位置的墙,另外还有个getRect()方法来构造长方形实例。源程序:import java.awt.*;public class CommonWall public static final int width = 20; /设置墙的固定参数public static final int length = 20;int x, y;TankClient tc;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image wallImags = null;static wallImags = new Image / 储存commonWall的图片tk.getImage(CommonWall.class.getResource(Images/commonWall.gif), ;public CommonWall(int x, int y, TankClient tc) / 构造函数this.x = x;this.y = y;this.tc = tc; / 获得界面控制public void draw(Graphics g) / 画commonWallg.drawImage(wallImags0, x, y, null);public Rectangle getRect() /构造指定参数的长方形实例return new Rectangle(x, y, width, length); 金属墙金属墙的参数和普通墙完全类似,只不过金属墙不能被子弹穿破,但这个属性在接下来讨论的子弹的属性里面,由于上面已经给出里普通墙的属性,所以这里将不再赘述金属墙的属性了。7. 家:家是由Home类来抽象的,具体的属性有:家的大小,家的位置,家的存活状态,与树林和河流一样,家还有draw()和自己的构造方法,作用也和前面的一样,但是家还有一些新的方法,因为可以在游戏中重新开始游戏,所以要有设置方法让家重新“活”起来,当然,有时候要判断家现在的存活状态,所以就必须要isLive()和setLive()两个方法了。除此之外,还要有一个游戏结束界面的清理工作和提示工作,gameover()方法就是解决这个问题的。8. 子弹:子弹的属性:子弹前进的X轴和Y轴的速度初始速度都为10,子弹的长度和宽度初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。如:imgs.put(L, bulletImages0);类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。darw()方法和move()方法来控制画子弹和移动子弹接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接return true就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果。具体代码:public boolean hitTanks(List tanks) /当子弹打到坦克时for (int i = 0; i tanks.size(); i+) if (hitTank(tanks.get(i) /对每一个坦克,调用hitTankreturn true;return false;子弹打到其他坦克上时用hitTank(Tank t) 方法,子弹打到墙上时用hitWall(CommonWall w)方法,打到金属墙上hitWall(MetalWall w),打到家hitHome(),当然在这些方法里,都要作相应的操作来表示接受到子弹的后果,普通墙要移除对应的位置,所以在方法里面又要调用remove()方法来移除,如打到家上,就要吧home的生命设置为false,从而结束游戏。实现如下:public boolean hitHome() /当子弹打到家时if (this.live & this.getRect().intersects(tc.home.getRect() this.live = false;this.tc.home.setLive(false); /当家接受一枪时就死亡return true;return false;还有,当子弹射击到对方(用户方对敌方)时,当敌方射击到用户方,用户方要减少生命值,没接受一枪,就执行t.setLife(t.getLife() - 50); / 受一粒子弹寿命减少50,接受4枪就死,总生命值200,当然方法里面还要做其他很多的判断,如生命值是否小于0,如果是的话就执行t.setLive(false);从而结束游戏。9. 爆炸:坦克的爆炸效果独立出来用一个类来描述,爆炸的属性:位置和存活状态,另外,画爆炸效果的时候要取得用户界面控制,所以要定义private static Toolkit tk = Toolkit.getDefaultToolkit();其他的方法只能的大同小异。import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit;public class BombTank private int x, y;private boolean live = true; / 初始状态为活着的private TankClient tc;private static Toolkit tk = Toolkit.getDefaultToolkit();private static Image imgs = / 存储爆炸图片 从小到大的爆炸效果图tk.getImage(BombTank.class.getClassLoader().getResource(images/1.gif),tk.getImage(BombTank.class.getClassLoader().getResource(images/2.gif),tk.getImage(BombTank.class.getClassLoader().getResource(images/3.gif),tk.getImage(BombTank.class.getClassLoader().getResource(images/4.gif),tk.getImage(BombTank.class.getClassLoade
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度润滑油零售商与生产商联合销售合同3篇
- 2024年简化版建筑劳务分包协议模板版B版
- 二零二五年度主题餐厅租赁合同标准模板6篇
- 二零二五年大理石石材市场调研与分析服务协议2篇
- 二零二五年度危化品运输司机合同2篇
- 2025年度信息安全服务销售合同重要性及网络安全保障
- 二零二五年度二手车买卖合同含车辆行驶里程验证约定3篇
- 2024版企业信用风险缓释担保服务合同模板3篇
- 2024版早餐厅承包管理合同协议书范本
- 二零二五年度GRC构件采购合同示例6篇
- 02S501-2 双层井盖图集标准
- 广东省湛江市寸金培才学校2022-2023学年下学期七年级数学期末试卷
- 顽固性高血压的基因治疗新进展
- (正式版)JTT 1495-2024 公路水运危险性较大工程安全专项施工方案审查规程
- 停车场管理系统说明书
- 医院药剂科年终总结
- (2024年)AED(自动体外除颤器)使用指南
- 麻醉药品精神药品管理
- 抽错血标本护理不良事件
- 科技成果转化培训资料
- 社会稳定风险评估 投标方案(技术标)
评论
0/150
提交评论