java坦克大战实训步骤与过程
坦克大战报告

JAVA程序开发课程设计课程大作业专业:软件工程班级:14软工2学号: ***********名:***项目名称:坦克大战一、需求分析:1.基本功能:(1)我方坦克能上下移动(2)敌方坦克能自由移动(3)我方坦克能开火(4)敌方坦克能自由开火(5)子弹打中我方,会减血,我方打中敌方,敌死。
敌打敌不会受伤(6)有血条,主界面2.扩展功能(1)用图形来表示坦克和炮弹(2)用图形来表示中子弹后的爆炸效果(3)地图上存在金属墙,我方坦克和子弹不能穿过(4)地图上存在曹村,我方和敌方坦克能够自由穿过,子弹也一样(5)地图上会随机出现加血包(6)我方坦克遇到加血包,会增加生命(7)游戏开始时,会启动背景音乐(8)我方坦克死亡时,提示游戏结束二、系统设计:1. BgMusic(1)主要功能:添加背景音乐TankMap类通过调用该类,并读取BgMusic包下面的背景音乐文件(2)成员属性:1)filename,用于记录读取到的文件名,并处理2)nBytesRead,这是缓存,用于读取音乐文件,缓存下来(3)成员方法:1)run,播放背景音乐2)构造方法BgMusic,将读取到的文件名,存储到成员属性filename中2. Blood(1)主要功能:地图中添加血包(2)成员属性:1)x,y,width,height,血包的位置以及宽高2)rpos_x,rpos_y,用于记录血包移动后的位置3)tm,调用TankMap类,并在地图中放血包4)live,血包的存活,被坦克吃了就消失5) blood,用于记录血包的存活6)step,血包的步长7)stepMove,血包走过总的步长(3)成员方法:1)Blood,构造方法,将血包放到地图中2)draw,画血包3)move,血包的移动4)getRect,获取血包的位置3. Tank(1)主要功能:地图中添加我方坦克(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,坦克的宽高和x,y上的移动速度2)x,y,direction,我方坦克出现的初始位置和初始状态3)tm,调用TankMap类,并在地图中放坦克4)isLive,我方坦克是否存活5) isgood,坦克属于哪一方6)life,我方坦克的初始生命值7)step,使用Blood类,血包随机出现8)upimage,rightimage,downimage,leftimage,oldimage,存放坦克图片(3)成员方法:1)draw,绘制坦克2)move,根据移动方向,移动坦克,不允许坦克移除地图3)checkDirection,确定用户单击的方向键,修正坦克即将移动方向4)fire,发射子弹5)getRec,返回坦克当前位置,便于判断是否与敌方坦克或子弹重叠6)stay,坦克撞墙的处理7)eat,我方坦克吃血包4.EnemyTank(1)主要功能:地图中添加敌方坦克(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,坦克的宽高和x,y上的移动速度2)x,y,direction,我方坦克出现的初始位置和初始状态3)tm,调用TankMap类,并在地图中放坦克4)islive,我方坦克是否存活5)enemytank,存放坦克图片(3)成员方法:1)draw,绘制坦克2)move,根据移动方向,移动坦克,不允许坦克移除地图3)fire,发射子弹4.Explor(1)主要功能:子弹打中坦克,发生爆炸效果(2)成员属性:1)x,y,坦克出现的位置2)tm,调用TankMap类,并在地图中放爆炸3)islive,我方坦克是否存活(3)成员方法:1)draw,绘制爆炸2)Explor,爆炸的构造方法5.Help(1)主要功能:给用户游戏帮助(2)成员属性:1)help,将帮助的文字存放在字符串中(3)成员方法:1)getHelpDialog,调用帮助6.Shell(1)主要功能:设计子弹(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,子弹的宽高和x,y上的移动速度2)x,y,direction,子弹出现的位置和方向3)tm,调用TankMap类,并在地图中放子弹4)isLive,子弹是否打中坦克5)isgood,是否是我方6)Image,加载子弹图片(3)成员方法:1)draw,绘制子弹2)move,根据移动方向,移动坦克,得到子弹的移动3)getRec,获取坦克的位置4)hitTanks,子弹打坦克5)hitWalls,子弹打墙7.Wall(1)主要功能:给地图添加墙(2)成员属性:1)x,y,w,h,墙的位置和宽度高度2)tc,地图(3)成员方法:1)draw,画墙2)getRect,获取墙的位置8.TankMap(1)主要功能:地图(2)成员属性:1)MAPWIDTH,MAPHEIGHT,地图的宽高2)t,我方坦克3)bufferImage,缓冲,用于解决闪屏4)forestimage,草丛5)shells,EnemyTank,Blood,Explors泛型6)enemyCount,敌方坦克数量7)w1,w2,不可穿过的墙(3)成员方法:1)init,初始化地图2)paint,画血包,地图,坦克等3)addBloods,加血4)update,解决闪屏三、功能实现:1.功能1:我方,敌方坦克上下移动并开火(1)操作说明游戏启动时,按上下左右键可以是我方坦克移动,按F键可以开火(2)关键代码//绘制坦克public void draw(Graphics g){//根据不同方向加载不同图片,读取的时候需要处理异常try{switch(direction){case STOP:case UP:upimage=ImageIO.read(new File("src/images/up.gif"));oldimage=upimage;g.drawImage(upimage, x, y, null);break;case RIGHT:rightimage=ImageIO.read(new File("src/images/right.gif"));oldimage=rightimage;g.drawImage(rightimage, x, y, null);break;case DOWN:downimage=ImageIO.read(new File("src/images/down.gif"));oldimage=downimage;g.drawImage(downimage, x, y, null);break;case LEFT:leftimage=ImageIO.read(new File("src/images/left.gif"));oldimage=leftimage;g.drawImage(leftimage, x, y, null);break;}}catch (IOException e) {};g.drawImage(oldimage, x, y, null);move(direction);}//根据移动方向,移动坦克,不允许坦克移出地图public void move(Direction d){/*** 记录坦克原来的位置,撞墙可以回到原位置*/oldX=x;//记录坦克原来的位置,撞墙可以回到原位置oldY=y;if(d == Direction.STOP){}else if(d == Direction.UP){y-=yspeed;if(y<=HEIGHT)y=HEIGHT;}else if(d==Direction.RIGHT){x+=xspeed;if(x>=800-WIDTH)x=800-WIDTH;}else if(d==Direction.DOWN){y+=yspeed;if(y>=600-HEIGHT)y=600-HEIGHT;}else if(d==Direction.LEFT){x-=xspeed;}2.功能2:我方开火,敌方会爆炸,然后死亡。
辽宁工业大学JAVA课程设计坦克大战

辽宁工业大学《Java语言程序设计》课程设计(论文)题目:坦克游戏院(系):软件学院专业班级:软件工程133班学号:学生姓名:指导教师:翟宝峰参考网址 : 教师职称:副教授起止时间:2014.6.9——2014.6.20课程设计(论文)任务及评语院(系):软件学院教研室:软件教研室目录第1章课程设计目的与要求 (1)1.1设计目的 (1)1.2实验环境 (1)1.3预备知识 (1)1.4设计要求 (1)第2章课程设计内容 (2)2.1 课题描述 (2)2.2 系统设计 (3)2.2.1功能分析 (3)2.2.2面向对象设计 (4)2.2.2类成员描述 (5)2.3程序实现 (6)2.3.1源码分析 (6)2.3.2运行结果 (13)第3章总结 (15)参考文献 (16)第1章课程设计目的与要求1.1设计目的将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程《JAVA语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握JAVA语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序和修改程序。
1.2实验环境硬件要求能运行Windows 操作系统的微机系统。
JAVA语言应用程序开发软件使用:VJAVA 系统,或其他JAVA语言应用程序开发软件。
JAVA课程设计 坦克大战

得分显示:在游戏 界面实时显示得分 情况,方便玩家了 解游戏进度
减少内存占用:优 化数据结构,减少 不必要的内存分配
提高渲染效率: 优化渲染算法, 减少渲染时间
优化网络通信:减 少网络延迟,提高 网络通信效率
优化AI算法:提高 AI算法的效率和准 确性,提高游戏体 验
界面布局:合 理规划界面布 局,提高用户
玩家需要控制坦克,消灭敌 人,保护自己的基地
游戏支持多人在线对战,玩 家可以与朋友一起挑战
玩家控制 坦克,在 战场上与 敌人战斗
坦克可以 发射炮弹, 摧毁敌人 或障碍物
玩家需要 躲避敌人 的攻击, 保护自己 的坦克
游戏有各 种关卡, 难度逐渐 增加
玩家可以 通过升级 坦克,提 高战斗力
游戏支持 多人在线 对战,增 加游戏乐 趣
生命值耗尽:当 玩家的生命值降 至0时,游戏结束
时间耗尽:当游 戏时间耗尽时, 游戏结束
胜利条件:当玩 家达到胜利条件 时,游戏结束
失败条件:当玩 家达到失败条件 时,游戏结束
得分规则:击毁敌 方坦克得分,被敌 方坦克击毁扣分
得分方式:根据击 毁敌方坦克的数量 和难度计算得分
得分限制:得分上 限为1000分,达到 上限后不再增加得 分
,a click to unlimited possibilities
汇报人:
01
02
03
04
05
06
游戏类型:坦克大战
游戏背景:二战时期
游戏目标:摧毁敌方坦克,保 护自己的基地
游戏玩法:玩家控制坦克,通 过射击和躲避来消灭敌方坦克
游戏包含多个关卡,每个关 卡有不同的难度和挑战
设计一款坦克大战游戏
游戏界面:包括 菜单、地图、角 色、道具等元素
开题报告-基于Java的坦克大战游戏的设计与实现

毕业设计开题报告计算机科学与技术基于Java的坦克大战游戏的设计与实现一、综述本课题国内外研究动态,说明选题的依据和意义本课题国内外动态:最早的电脑游戏可以追溯到1972年,WillCrowther用当时最流行的DEC的PDP-10主机编写了一段简单的FORTRAN程序。
在这个程序里,Crowther设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。
这个程序在后来被认为是最早的电脑游戏程序。
而如今,游戏产业已经发展成为一个拥有巨大利润的成熟产业。
从上世纪60年代初的街机,到六七十年代之间的家用游戏机,再到八九十年代的掌上游戏机,日本经过30多年的发展,终于把电子游戏培育成第一时尚娱乐产业,垄断全球业界长达10余年。
对于日本来说,电玩业已是国家经济的重要支柱之一,在GNP中占有1/5的举足轻重地位。
日本游戏业在最辉煌的1998年,曾经占领全球电子游戏市场硬件90%以上,软件50%以上。
根据美国市场调查公司NPD Group调查统计,美国2004年游戏总销售金额(包括家用、掌上型主机及软件)为99亿美元,占了全球游戏市场的45%。
其中游戏软件销售的具体数字是:视频游戏软件的销售额达52亿美元(1.6亿套),PC游戏软件销售额达11亿美元(4500万套),掌机游戏销售额达10亿美元(4230万套)。
2004年一共大约有2.48亿套游戏售出。
据估计,美国每个家庭平均购买过2部游戏。
目前中国游戏市场已经成为国际公认最具发展潜力的市场,产业产值每年都以近50%的增长率高速增长。
游戏行业虽然在我国起步晚,但发展的势头迅猛。
国家信息产业部已将游戏产品的技术开发列为“863计划”重点项目之一。
游戏编程涉及图形图像、实时输入获取、逻辑控制、音乐音效编程、人工智能等方面。
不同于一般的图形应用程序,游戏图像对硬件有着严格甚至于苛刻的要求。
游戏开发人员总是想着如何发挥现有的硬件的极限性能以实现更华丽更逼真的游戏图形效果。
JAVA实现经典游戏坦克大战的示例代码

JAVA实现经典游戏坦克⼤战的⽰例代码⽬录前⾔主要设计功能截图代码实现总结前⾔⼩时候⼤家都玩过坦克⼤战吧,熟悉的旋律和丰富的关卡陪伴了我们⼀整个寒暑假,还记得传说中的经典坦克⼤战吗?那些怀旧的记忆,伴随着我们⼀起⾛过来的经典坦克⼤战,刚开始那战战兢兢,屡屡被敌⼈坦克击毁的情景历历在⽬。
现在好了,再也不⽤担⼼敌⼈坦克了,可以横冲直撞,横扫敌⼈坦克了。
快哉《坦克⼤战》游戏以坦克战⽃为主题,⽤java语⾔实现,采⽤了swing技术进⾏了界⾯化处理,设计思路⽤了⾯向对象思想。
主要需求可以⽣成不同的地图,消灭地图上的所有坦克为胜利;可以设置关卡地图,不断增加难度。
主要设计1、要有难度关卡:第⼀关,第⼆关,第三关,第四关,第五关;第⼀关地图最简单,第五关地图最难;2、坦克要有⾎条,打多次才会死3、地图要我有我⽅坦克四辆(相当于4条命)和多辆敌⽅坦克4、我⽅坦克的炮弹数量是固定的,设置为5005、地图右边显⽰基本信息6、地图上要在砖块,铁块,河流功能截图游戏开始页⾯代码实现窗⼝布局public class GameFrame extends JFrame {/*** serialVersionUID*/private static final long serialVersionUID = -1176914786963603304L;public GameFrame() {super();this.setSize(800, 700);this.setTitle("坦克⼤战");this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setResizable(false);// 显⽰器屏幕⼤⼩Dimension screenSizeInfo = Toolkit.getDefaultToolkit().getScreenSize();int leftTopX = ((int) screenSizeInfo.getWidth() - this.getWidth()) / 2;int leftTopY = ((int) screenSizeInfo.getHeight() - this.getHeight()) / 2;// 设置显⽰的位置在屏幕中间this.setLocation(leftTopX, leftTopY);}}地图渲染核⼼算法@Servicepublic class PaintService {@Autowiredprivate GameContext context;private Brick rightBrick = new Brick(700, 50);private Iron rightIron = new Iron(700, 50);private Water rightWater = new Water(700, 50);/*** 画出东西(包括坦克、障碍物。
java写的坦克大战简易版说课讲解

MyTankGame2.javapackage test;import javax.swing.*;import java.awt.*;import java.awt.event.*;//import java.io.*;import java.util.*;class MyTankGame2 extends JFrame implements ActionListener {MyPanel mp=null;//定义一个开始的面板MyStartPanel msp=null;//做出我需要的菜单JMenuBar jmb=null;//开始游戏JMenu jm1=null;JMenuItem jmi1=null;//退出系统JMenuItem jmi2=null;//存盘退出JMenuItem jmi3=null;JMenuItem jmi4=null;public static void main(String[] args){//System.out.println("Hello World!");MyTankGame2 mtg=new MyTankGame2();}//构造方法public MyTankGame2(){//创建菜单及菜单选项jmb=new JMenuBar();jm1=new JMenu("游戏(G)");//设置助记符jm1.setMnemonic('G');jmi1=new JMenuItem("开始新游戏(N)");jmi2=new JMenuItem("退出游戏(E)");jmi3=new JMenuItem("存盘退出游戏");jmi4=new JMenuItem("继续上局游戏");jmi4.addActionListener(this);jmi4.setActionCommand("continueGame");jmi3.addActionListener(this);jmi3.setActionCommand("saveExit");jmi2.setMnemonic('E');//对jmi1进行响应jmi1.addActionListener(this);jmi1.setActionCommand("newGame");jmi2.addActionListener(this);jmi2.setActionCommand("exit");jm1.add(jmi1);jm1.add(jmi2);jm1.add(jmi3);jm1.add(jmi4);jmb.add(jm1);msp=new MyStartPanel();Thread t=new Thread(msp);t.start();this.setJMenuBar(jmb);this.add(msp);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setSize(600,450);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {//对用户不同的点击进行不同的处理if(e.getActionCommand().equals("newGame")){mp=new MyPanel("newGame");Thread t=new Thread(mp);t.start();//先删除旧的面板this.remove(msp);this.add(mp);//注册监听this.addKeyListener(mp);//显示this.setVisible(true);}else if(e.getActionCommand().equals("exit")){//保存击毁敌人的数量Recorder.keepRecording();System.exit(0);}//对存盘退出做处理else if(e.getActionCommand().equals("saveExit")){//工作Recorder re=new Recorder();re.setEts(mp.ets);//保存击毁敌人的数量和敌人的坐标re.keepRecAndEnemyTank();//退出System.exit(0);}else if(e.getActionCommand().equals("continueGame")){ //mp=new MyPanel("con");//mp.flag=;Thread t=new Thread(mp);t.start();//先删除旧的面板this.remove(msp);this.add(mp);//注册监听this.addKeyListener(mp);//显示this.setVisible(true);}}}class MyStartPanel extends JPanel implements Runnable{ int times=0;public void paint(Graphics g){super.paint(g);g.fillRect(0, 0, 400, 300);//提示信息if(times%2==0){g.setColor(Color.yellow);//开关信息的字体Font myFont=new Font("华文新魏",Font.BOLD,30);g.setFont(myFont);g.drawString("stage:1", 150, 140);}}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){//休眠try {Thread.sleep(100);} catch (Exception e) {// TODO: handle exception}times++;//重画this.repaint();}}}//我的面板class MyPanel extends JPanel implements KeyListener,Runnable {//定义我的坦克Hero hero=null;//判断继续上局还是新游戏//定义敌人的坦克组Vector<EnemyTank> ets=new Vector<EnemyTank>();Vector<Node> nodes=new Vector<Node>();//定义炸弹集合Vector<Bomb> bombs=new Vector<Bomb>();int enSize=5;//定义三张图片Image image1=null;Image image2=null;Image image3=null;//构造方法public MyPanel(String flag){//恢复记录Recorder.getRecording();hero=new Hero(30,231);if(flag.equals("newGame")){//初始化敌人的坦克for(int i=0;i<enSize;i++){//创建一辆敌人的坦克对象EnemyTank et=new EnemyTank((i+1)*50,0);et.setColor(0);et.setDirect(2);//将MyPanel的敌人坦克向量交给该敌人坦克et.setEts(ets);//启动敌人的坦克Thread t=new Thread(et);t.start();//给敌人的坦克添加一颗子弹Shot s=new Shot(et.x+10, et.y+30, 2,1);et.ss.add(s);new Thread(s).start();ets.add(et);//加入}}else{nodes=new Recorder().getNodesAndEnNums();//初始化敌人的坦克for(int i=0;i<nodes.size();i++){Node node=nodes.get(i);//创建一辆敌人的坦克对象EnemyTank et=new EnemyTank(node.x,node.y);et.setColor(0);et.setDirect(node.direct);//将MyPanel的敌人坦克向量交给该敌人坦克et.setEts(ets);//启动敌人的坦克Thread t=new Thread(et);t.start();//给敌人的坦克添加一颗子弹Shot s=new Shot(et.x+10, et.y+30, 2,1);et.ss.add(s);new Thread(s).start();ets.add(et);//加入}}/*try {image1=ImageIO.read(new File("/bomb_1.gif"));image2=ImageIO.read(new File("/bomb_2.gif"));image3=ImageIO.read(new File("/bomb_3.gif"));} catch (Exception e) {e.printStackTrace();// TODO: handle exception}*///播放开战声音AePlayWave apw=new AePlayWave("F:\\myjava\\day9\\坦克大战\\TankGamae13\\src\\111.wav");apw.start();//初始化图片image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource( "/bomb_1.gif"));image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource( "/bomb_2.gif"));image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource( "/bomb_3.gif"));}//画出提示信息public void showInfo(Graphics g){//画出提示信息坦克(该坦克不参与战斗)this.drawTank(100, 320, g, 0, 0);g.setColor(Color.black);g.drawString(Recorder.getEnNum()+"", 128, 343);this.drawTank(165, 320, g, 0, 1);g.setColor(Color.black);g.drawString(Recorder.getMyLife()+"", 195, 343);//画出玩家的总成绩g.setColor(Color.black);Font f=new Font("宋体",Font.BOLD,20);g.setFont(f);g.drawString("您的总成绩", 410, 25);this.drawTank(420, 60, g, 0, 0);g.setColor(Color.black);g.drawString(Recorder.getAllEnNum()+"", 455, 80);}//重写paint函数public void paint(Graphics g){super.paint(g);g.fillRect(0,0,400,300);//画出提示信息this.showInfo(g);//画出自己的坦克if(hero.isLive){this.drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);}//从ss中取出每一颗子弹并绘制for(int i=0;i<hero.ss.size();i++){Shot myShot =hero.ss.get(i);//画出子弹if(myShot!=null&&myShot.isLive==true){g.draw3DRect(myShot.x, myShot.y, 1, 1, false);}if(myShot.isLive==false){//从ss中删除掉该子弹hero.ss.remove(myShot);}}//画出炸弹for(int i=0;i<bombs.size();i++){Bomb b=bombs.get(i);if(b.life>6){g.drawImage(image1, b.x, b.y, 30, 30,this);}else if(b.life>3){g.drawImage(image2, b.x, b.y, 30, 30,this);}else{g.drawImage(image3, b.x, b.y, 30, 30,this);}//让b的生命值减小b.lifeDown();if(b.life==0){//把炸弹从向量中去掉bombs.remove(b);}}//画出敌人的坦克for(int i=0;i<ets.size();i++){ EnemyTank et=ets.get(i);if(et.isLive){this.drawTank(et.getX(),et.getY(), g, et.getDirect(), 0);//顺便画出敌人的子弹for(int j=0;j<et.ss.size();j++){//取出子弹Shot enemyShot=et.ss.get(j);if(enemyShot.isLive){g.draw3DRect(enemyShot.x, enemyShot.y, 1, 1, false);}else{//如果死亡了,就从Vextor中删除掉et.ss.remove(enemyShot);}}}}}//判断我的子弹是否会击中敌人的坦克public void hitEnemyTank(){//判断是否会击中for(int i=0;i<hero.ss.size();i++){//取出子弹Shot myShot=hero.ss.get(i);//判断子弹是否有效if(myShot.isLive){//取出每一个敌人坦克与之匹配for(int j=0;j<ets.size();j++){//取出坦克EnemyTank et=ets.get(j);if(et.isLive){if(this.hitTank(myShot, et)){ //减少敌人数量Recorder.reduceEnNum();//增加我的记录Recorder.addEnEnum();}}}}}}//我是否被击中public void hitMe(){//取出每一个敌人的坦克for(int i=0;i<this.ets.size();i++){//取出坦克EnemyTank et=ets.get(i);//取出每颗子弹for(int j=0;j<et.ss.size();j++){//取出子弹Shot enemyShot=et.ss.get(j);if(hero.isLive){if(this.hitTank(enemyShot, hero)){//待写}}}}}//画出一个专门判断子弹是否击中敌人坦克的函数public boolean hitTank(Shot s ,Tank et){boolean b2=false;//判断该坦克的方向switch(et.direct){//敌人坦克的方向是向上或者向下case 0:case 2:if(s.x>et.x&&s.x<et.x+20&&s.y>et.y&&s.y<et.y+30){//击中//子弹死亡s.isLive=false;//敌人坦克死亡et.isLive=false;b2=true;//System.out.println("hytfyfrujyg");//创建一颗炸弹放入VectorBomb b=new Bomb(et.x, et.y);bombs.add(b);}break;case 1:case 3:if(s.x>et.x&&s.x<et.x+30&&s.y>et.y&&s.y<et.y+20){//击中//子弹死亡s.isLive=false;//敌人坦克死亡et.isLive=false;b2=true;Bomb b=new Bomb(et.x, et.y);bombs.add(b);}break;}return b2;}//画出坦克的函数(扩展)public void drawTank(int x,int y,Graphics g,int direction,int type) {//判断类型switch(type){case 0:g.setColor(Color.CYAN);break;case 1:g.setColor(Color.yellow);break;}//判断方向switch(direction){//向上走case 0://g.setColor(Color.CYAN);//画出我的坦克(到时再封装成一个函数)//1.画出左边的矩形g.fill3DRect(x,y,5,30,false);//2.画出右边边的矩形g.fill3DRect(x+15,y,5,30,false);//3画出中间的矩形g.fill3DRect(x+5,y+5,10,20,false);//4画圆形g.fillOval(x+5,y+10,10,10);//5.画出线g.drawLine(x+10,y+15,x+10,y);break;case 1://向右g.fill3DRect(x, y, 30,5, false);g.fill3DRect(x, y+15, 30,5 ,false);g.fill3DRect(x+5, y+5, 20, 10, false);g.fillOval(x+10, y+5, 10, 10);g.drawLine(x+15, y+10, x+30, y+10);break;case 2://向下g.fill3DRect(x,y,5,30,false);//2.画出右边边的矩形g.fill3DRect(x+15,y,5,30,false);//3画出中间的矩形g.fill3DRect(x+5,y+5,10,20,false);//4画圆形g.fillOval(x+5,y+10,10,10);//5.画出线g.drawLine(x+10,y+15,x+10,y+30);break;case 3://向左g.fill3DRect(x, y, 30,5, false);g.fill3DRect(x, y+15, 30,5 ,false);g.fill3DRect(x+5, y+5, 20, 10, false);g.fillOval(x+10, y+5, 10, 10);g.drawLine(x+15, y+10, x, y+10);break;}}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Override//w上,s下,a左,右边public void keyPressed(KeyEvent e) {// TODO Auto-generated method stubif(e.getKeyCode()==KeyEvent.VK_W){//设置我的坦克的方向上this.hero.setDirect(0);if(this.hero.y>0){this.hero.moveUp();}}else if(e.getKeyCode()==KeyEvent.VK_D){//设置我的坦克的方向右边this.hero.setDirect(1);if(this.hero.x<370){this.hero.moveRight();}}else if(e.getKeyCode()==KeyEvent.VK_S){//设置我的坦克的方向 xia边this.hero.setDirect(2);if(this.hero.y<=271){this.hero.moveDown();}}else if(e.getKeyCode()==KeyEvent.VK_A){//设置我的坦克的方向左边this.hero.setDirect(3);if(this.hero.x>0){this.hero.moveLeft();}}if(e.getKeyCode()==KeyEvent.VK_K){//玩家按了一个k键,开火if(this.hero.ss.size()<=5){this.hero.shotEnemy();}}//必须用repaintPanelthis.repaint();}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub }@Overridepublic void run() {// TODO Auto-generated method stub//每隔100毫秒去重画while(true){try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.hitEnemyTank();this.hitMe();//重绘this.repaint();}}}Members.javapackage test;import java.io.*;import java.util.Vector;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;class AePlayWave extends Thread {private String filename;public AePlayWave(String wavfile) {filename = wavfile;}public void run() {File soundFile = new File(filename);AudioInputStream audioInputStream = null;try {audioInputStream = AudioSystem.getAudioInputStream(soundFile);} catch (Exception e1) {e1.printStackTrace();return;}AudioFormat format = audioInputStream.getFormat();SourceDataLine auline = null; info = new (SourceDataLine.class, format);try {auline = (SourceDataLine) AudioSystem.getLine(info);auline.open(format);} catch (Exception e) {e.printStackTrace();return;}auline.start();int nBytesRead = 0;byte[] abData = new byte[512];try {while (nBytesRead != -1) {nBytesRead = audioInputStream.read(abData, 0, abData.length);if (nBytesRead >= 0)auline.write(abData, 0, nBytesRead);}} catch (IOException e) {e.printStackTrace();return;} finally {auline.drain();auline.close();}}}class Node//恢复点{int x,y,direct;public Node(int x,int y,int direct){this.x=x;this.y=y;this.direct=direct;}}//记录类,同时也可以保存一些设置class Recorder{//记录每关有多少敌人private static int enNum=5;//设置我有多少可用的人private static int myLife=3;//记录总共消灭了多少敌人private static int allEnNum=0;//从文件中恢复记录点static Vector<Node> nodes=new Vector<Node>();private static FileWriter fw=null;private static BufferedWriter bw=null;private static FileReader fr=null;private static BufferedReader br=null;private Vector <EnemyTank> ets=new Vector<EnemyTank>();public Vector<EnemyTank> getEts() {return ets;}public void setEts(Vector<EnemyTank> ets) {this.ets = ets;}//完成读取任务public Vector<Node> getNodesAndEnNums(){try {fr=new FileReader("F:\\myRecording.txt");br=new BufferedReader(fr);String n="";//先读取第一行n=br.readLine();allEnNum=Integer.parseInt(n);while((n=br.readLine())!=null){String []xyz=n.split(" ");Node node=new Node(Integer.parseInt(xyz[0]),Integer.parseInt(xyz[1]),Integer.parseInt(xyz[2]));nodes.add(node);}} catch (Exception e) {e.printStackTrace();// TODO: handle exception}finally{try {br.close();fr.close();} catch (Exception e2) {// TODO: handle exception}}return nodes;}//保存击毁敌人坦克的数量和敌人坦克的坐标,方向public void keepRecAndEnemyTank(){try {//创建fw=new FileWriter("F:\\myRecording.txt");bw=new BufferedWriter(fw);bw.write(allEnNum+"\r\n");//保存当前还活着的坐标和方向for(int i=0;i<ets.size();i++){//取出第一个坦克EnemyTank et=ets.get(i);if(et.isLive){String record=et.x+" "+et.y+" "+et.direct;//写入到文件bw.write(record+"\r\n");}}} catch (Exception e) {// TODO: handle exception}finally{//关闭流try {bw.close();fw.close();} catch (Exception e2) {// TODO: handle exception}}}//从文件中读取记录public static void getRecording(){try {fr=new FileReader("F:\\myRecording.txt");br=new BufferedReader(fr);String n=br.readLine();allEnNum=Integer.parseInt(n);} catch (Exception e) {e.printStackTrace();// TODO: handle exception}finally{try {br.close();fr.close();} catch (Exception e2) {// TODO: handle exception}}}//把玩家击毁敌人的坦克数量保存到文件中public static void keepRecording(){try {//创建fw=new FileWriter("F:\\myRecording.txt");bw=new BufferedWriter(fw);bw.write(allEnNum+"\r\n");} catch (Exception e) {// TODO: handle exception}finally{//关闭流try {bw.close();fw.close();} catch (Exception e2) {// TODO: handle exception}}}public static int getAllEnNum() {return allEnNum;}public static void setAllEnNum(int allEnNum) { Recorder.allEnNum = allEnNum;}public static int getEnNum() {return enNum;}public static void setEnNum(int enNum) {Recorder.enNum = enNum;}public static int getMyLife() {return myLife;}public static void setMyLife(int myLife) { Recorder.myLife = myLife;}//减少敌人数public static void reduceEnNum(){enNum--;}//消灭敌人public static void addEnEnum(){allEnNum++;}}//炸弹类class Bomb{int x,y;//炸弹的生命int life=9;boolean isLive=true;public Bomb(int x,int y){this.x=x;this.y=y;}//减少生命值public void lifeDown(){if(life>0){life--;}else{this.isLive=false;}}}//子弹类class Shot implements Runnable{int x,y;int direct;int speed=1;//是否还活着boolean isLive=true;public Shot(int x,int y,int direct,int speed) {this.x=x;this.y=y;this.direct=direct;this.speed=speed;}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}switch(direct){case 0://向上y-=speed;break;case 1://向右x+=speed;break;case 2://下y+=speed;break;case 3:x-=speed;break;}//子弹何时死亡??????if(x<0||x>400||y<0||y>300){this.isLive=false;break;}//System.out.println(x+""+y);}}}//坦克类class Tank{int x=0;int y=0;//定义方向的值0上,右2,下3,左int direct=0;//坦克的速度int speed=1;int color=0;boolean isLive=true;public int getColor() {return color;}public void setColor(int color) {this.color = color;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}public Tank(int x,int y){this.x=x;this.y=y;}public int getX(){return x;}public int getY(){return y;}public void setX(int x){this.x=x;}public void setY(int y){this.y=y;}}//敌人的坦克 ,做成线程class EnemyTank extends Tank implements Runnable {//boolean isLive=true;int times=0;//定义一个向量,可以访问到MyPanel上所有敌人的坦克Vector<EnemyTank> ets=new Vector<EnemyTank>();//定义一个向量,可以存放敌人的子弹Vector <Shot> ss=new Vector<Shot>();//敌人添加子弹应当在刚刚创建坦克和敌人的坦克子弹死亡之后public EnemyTank(int x, int y){super(x, y);}//得到MyPanel的敌人坦克向量public void setEts(Vector<EnemyTank>vv){this.ets=vv;}//判断是否碰到了别人的敌人的坦克public boolean isTouchOtherEnemy(){boolean b=false;//..。
坦克大战设计

湖北大学J A V A课程设计论文题目坦克大战游戏姓名张诚学号 ****************姓名柳谦学号 ****************专业年级计算机科学与技术1401 指导教师王雷春职称副教授2016年 5月目录绪论 (4)1背景 (4)2课程设计目标及目的 (5)2.1课程设计的目标 (5)2.2课程设计的目的 (5)2.3可行性分析 (5)2.3.1技术可行性 (5)2.3.2经济可行性分析 (6)3概要设计 (6)4详细设计 (7)4.1项目与类的结构图 (7)4.2 各类实现的功能概要 (7)4.2.1 barrier包 (7)4.2.2 lightButton包 (7)4.2.3 Tankwar包 (7)4.2.4 mapediter包 (8)4.3 主要类的的UML图及主要成员变量和函数说明 (8)4.3.1 Barrier类 (8)4.3.2 LightButton类 (11)4.3.3 Mapediter类 (13)4.3.4 Main类 (15)4.3.5 Boom类 (18)4.3.6 Item类 (18)4.3.7 Missle类 (21)4.3.8 PanelShow类 (25)4.3.9 Tank类 (26)4.3.10 TankWar 类 (33)5运行结果 (40)6总结 (47)7参考文献 (47)8附录 (48)坦克大战摘要坦克大战是一款最初由日本南梦宫Namco游戏公司1985年在任天堂FC平台上,推出的一款多方位平面射击游戏。
一经推出,人气十分高涨,然后又陆续推出了GB,PC等版本,玩法也大大扩充,由最初的单人2D过关演变到如今的多人3D联网对战游戏,我们小时候应该都体验过,之前C#课程中已经了解过有关信息,如今就想同样以Java为载体编写一款坦克大战。
本课题展示了如何使用Java编写出能够实际运行的单人版坦克大战游戏。
课题介绍了项目的功能、类的设计和逻辑难点等重要点。
JAVA实现坦克大战1.0版本

JAVA实现坦克⼤战1.0版本 1package tankGame;2import java.awt.*;3import javax.swing.*;4import java.awt.event.*;5import java.util.*;6/**7 * 功能:我⽅坦克可以发⼦弹8 *9 * */10public class MyTankGame1 extends JFrame {1112public static void main(String[] args) {13// TODO Auto-generated method stub14 MyTankGame1 mtg =new MyTankGame1();15 }16//构造函数17public MyTankGame1(){18 MyPanel mp=new MyPanel();1920//线程启动21 Thread t=new Thread(mp);22 t.start();2324this.add(mp);25this.addKeyListener(mp);//注册监听26this.setSize(400,300);27this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);28this.setVisible(true);29 }3031 }3233//我的⾯板34class MyPanel extends JPanel implements KeyListener,Runnable{35 Hero hero=null;//定义我的坦克36 Vector<Enermy> enermy=new Vector<Enermy>() ;//定义敌⼈的坦克组37int enSize=3;38//构造函数39public MyPanel(){40 hero=new Hero(100,100);4142for(int i=0;i<enSize;i++){43//创建⼀辆敌⼈的坦克对象44 Enermy en=new Enermy((i+1)*50, 0);45 en.setColor(0);46 en.setDerect(3);47//加⼊48 enermy.add(en);49 }5051 }52public void paint(Graphics g){//重新paint53super.paint(g);54 g.fillRect(0, 0, 400, 300);55//画出我的坦克56this.drawTank(hero.getX(), hero.getY(), g,this.hero.derect, 1);57//画出⼦弹58if(hero.s!=null&&hero.s.isLive==true){59 g.fillOval(hero.s.x ,hero.s.y, 2, 2);60 }6162//画出敌⼈的坦克63for(int i=0;i<enermy.size();i++){64this.drawTank(enermy.get(i).getX(), enermy.get(i).getY(), g, enermy.get(i).derect, 0);65//System.out.println(enermy.get(i).derect);//默认值为066 }67 }68public void drawTank(int x,int y,Graphics g,int direct,int type){69//判断是什么类型的坦克,敌⼈的还是我⽅的70switch(type){71case 0:72 g.setColor(Color.CYAN);73break;74case 1:75 g.setColor(Color.yellow);76break;77 }78//判断⽅向79switch(direct){80//坦克头向上81case 0:82//画出我的坦克,到时再封装为⼀个函数 83//画出左边的矩形84 g.fill3DRect(x, y, 5, 30,false);85//画出有右边的矩形86 g.fill3DRect(x+15, y, 5, 30,false);87//画出中间的矩形88 g.fill3DRect(x+5, y+5, 10, 20,false);89//画出圆形90 g.fillOval(x+5, y+10, 10, 10);91//画炮头92 g.drawLine(x+10, y-5, x+10, y+15);93break;9495//坦克头向右96case 1:9798//画出上边的矩形99 g.fill3DRect(x, y, 30, 5,false);100//画出下边的矩形101 g.fill3DRect(x, y+15, 30, 5,false);102//画出中间的矩形103 g.fill3DRect(x+5, y+5, 20, 10,false);104//画出圆形105 g.fillOval(x+10, y+5, 10, 10);106//画炮头107 g.drawLine(x+15, y+10, x+35, y+10); 108break;109110//坦克头向下111case 2:112113 g.fill3DRect(x, y, 5, 30,false);114//画出有右边的矩形115 g.fill3DRect(x+15, y, 5, 30,false);116//画出中间的矩形117 g.fill3DRect(x+5, y+5, 10, 20,false);118//画出圆形119 g.fillOval(x+5, y+10, 10, 10);120//画炮头121 g.drawLine(x+10, y+15,x+10, y+35); 122break;123124//坦克头向左125case 3:126127//画出上边的矩形128 g.fill3DRect(x, y, 30, 5,false);129//画出下边的矩形130 g.fill3DRect(x, y+15, 30, 5,false);131//画出中间的矩形132 g.fill3DRect(x+5, y+5, 20, 10,false);133//画出圆形134 g.fillOval(x+10, y+5, 10, 10);135//画炮头136 g.drawLine( x-5, y+10,x+15, y+10);137break;138 }139140141 }142 @Override143public void keyPressed(KeyEvent e) {144// TODO Auto-generated method stub145if(e.getKeyCode()==KeyEvent.VK_W){146//设置我的坦克⽅向147this.hero.setDerect(0);148this.hero.moveUp();149 }else if (e.getKeyCode()==KeyEvent.VK_D){ 150this.hero.setDerect(1);151this.hero.moveRight();152 }else if (e.getKeyCode()==KeyEvent.VK_S){ 153this.hero.setDerect(2);154this.hero.moveDown();155 }else if (e.getKeyCode()==KeyEvent.VK_A){ 156this.hero.setDerect(3);157this.hero.moveLeft();158 }159this.repaint();160//判断玩家是否按下j161if(e.getKeyCode()==KeyEvent.VK_J){162//开⽕,调⽤shotEnermy163this.hero.shotEnermy();164 }165166 }167 @Override168public void keyReleased(KeyEvent e) { 169// TODO Auto-generated method stub 170171 }172 @Override173public void keyTyped(KeyEvent e) {174// TODO Auto-generated method stub 175176 }177 @Override178public void run() {//实现每隔100ms去重绘179// TODO Auto-generated method stub 180while(true){181try {182 Thread.sleep(100);183 } catch (InterruptedException e) {184// TODO Auto-generated catch block 185 e.printStackTrace();186 }187this.repaint();188 }189 }190 }成员类1package tankGame;2//⼦弹类3class Shot implements Runnable{4int x,y,direct;5int speed=1;6boolean isLive=true;7public Shot(int x,int y,int direct){8this.x=x;9this.y=y;10this.direct=direct;11 }12 @Override13public void run() {14// TODO Auto-generated method stub15while(true){16try {17 Thread.sleep(50);18 } catch (InterruptedException e) {19// TODO Auto-generated catch block20 e.printStackTrace();21 }22switch(direct){23case 0:24 y-=speed;25break;26case 1:27 x+=speed;28break;29case 2:30 y+=speed;31break;32case 3:33 x-=speed;34break;35 }36 System.out.println("X"+x+"Y"+y);37if (x<0||x>400||y<0||y>300){38this.isLive=false;39break;40 }41 }42 }43 }44//坦克类45class Tank46 {47int x=0;//坦克的横坐标48int y=0;//坦克的纵坐标49int derect;//0上 1右 2下 3左50int speed=1;//设置坦克的速度51int color;//设置坦克颜⾊52public int getColor() {53return color;54 }55public void setColor(int color) {56this.color = color;57 }58public int getDerect() {59return derect;60 }61public void setDerect(int derect) {62this.derect = derect;63 }64public int getX() {65return x;66 }67public void setX(int x) {68this.x = x;69 }70public int getY() {71return y;72 }73public void setY(int y) {74this.y = y;75 }7677public Tank(int x,int y){78this.x=x;79this.y=y;80 }81 }82class Hero extends Tank{83 Shot s=null;//⼦弹是和坦克关联的84public Hero (int x,int y){85super(x,y);86 }87public void shotEnermy(){//⼦弹和坦克⽅向相关 8889switch(this.derect){90case 0:91 s=new Shot(x+10,y-9,0);92break;93case 1:94 s=new Shot(x+38,y+9,1);95break;96case 2:97 s=new Shot(x+10,y+37,2);98break;99100case 3:101 s=new Shot(x-9,y+9,3);102break;103 }104 Thread t=new Thread(s);105 t.start();106 }107//坦克向上移动108public void moveUp(){109 y-=speed;110 }111//坦克向右移动112public void moveRight(){113 x+=speed;114 }//坦克向下移动115public void moveDown(){116 y+=speed;117 }118//坦克向左移动119public void moveLeft(){120 x-=speed;121 }122123124 }125class Enermy extends Tank{126public Enermy (int x,int y){127super(x,y);128 }129 }效果如下:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java坦克大战实训步骤与过程
1.环境准备:
(1)准备好必要的工具:jdk、MyEclipse、图片素材;
(2)安装和配置好工具:安装jdk,MyEclipse,并把需要的图片素材放到指定文件夹;
2.实践步骤:
(1)创建项目:使用MyEclipse新建一个Java工程,设置好包结构;
(2)编写程序:使用MyEclipse开发实现坦克大战的所有功能;
(3)编译程序:根据Java程序的实际需求,使用MyEclipse编译我们的代码;(4)运行程序:使用MyEclipse运行坦克大战程序,以查看程序的正确性。
3.检查和修改:
(1)检查Bug:使用MyEclipse进行Debug调试程序,查看是否有Bug;(2)修改代码:如果有Bug,使用MyEclipse改正程序,以达到预期的效果。