现在代码已经越写越多了,这里我们又新建一个包com.TankGame4,复制原来的两个java文件,首先我们来实现一个功能:防止敌人的坦克重叠运动。我们把判断是否碰撞的函数写到EnemyTank类中
Members.java

//敌人的坦克,把敌人做成线程类
class EnemyTank extends Tank implements Runnable
{//定义一个向量,可以访问到MyPanel上所有敌人的坦克Vector<EnemyTank> ets = new Vector<EnemyTank>();//.......//得到MyPanel的敌人坦克向量public void setEts(Vector<EnemyTank> vv){this.ets=vv;}//.....
}

接下来到MyPanel类的构造函数

public MyPanel(){//...//初始化敌人的坦克for(int i=0;i<enSize;i++){//.......//将MyPanel的敌人坦克向量交给该敌人坦克et.setEts(ets);//...}

接下来大概计算我们的坦克与敌人坦克相遇的各种情形时的距离

根据这四种情况写代码(代码虽然多,但是思路差不多)
在EnemyTank类写isTouchOtherEnemy()函数

//判断是否碰到了敌人的坦克public boolean isTouchOtherEnemy(){boolean b=false;switch(this.direct){case 0://我的坦克向上//取出所有的敌人坦克for(int i=0;i<ets.size();i++){//取出第一个坦克EnemyTank et = ets.get(i);//如果不是自己if(et!=this){//如果敌人的方向是向下或者向上if(et.direct==0 || et.direct==2){//左点if(this.x>=et.x && this.x<=et.x+20 && this.y>=et.y && this.y<=et.y+30){return true;}if(this.x+20>=et.x && this.x+20<=et.x+20 && this.y>=et.y && this.y<=et.y+30){return true;}}if(et.direct==3 || et.direct==1){if(this.x>=et.x && this.x<=et.x+30 && this.y>=et.y && this.y<=et.y+20){return true;}if(this.x+20>=et.x && this.x+20<=et.x+30 && this.y>=et.y && this.y<=et.y+20){return true;}}}}break;case 1://坦克向右//取出所有的敌人坦克for(int i=0;i<ets.size();i++){//取出第一个坦克EnemyTank et = ets.get(i);//如果不是自己if(et!=this){//如果敌人的方向是向下或者向上if(et.direct==0 || et.direct==2){//上点if(this.x+30>=et.x && this.x+30<=et.x+20 && this.y>=et.y && this.y<=et.y+30){return true;}//下点if(this.x+30>=et.x && this.x+30<=et.x+20 && this.y+20>=et.y && this.y+20<=et.y+30){return true;}}if(et.direct==3 || et.direct==1){if(this.x+30>=et.x && this.x+30<=et.x+30 && this.y>=et.y && this.y<=et.y+20){return true;}if(this.x+30>=et.x && this.x+30<=et.x+30 && this.y+20>=et.y && this.y+20<=et.y+20){return true;}}}}break;case 2://坦克向下 //取出所有的敌人坦克for(int i=0;i<ets.size();i++){//取出第一个坦克EnemyTank et = ets.get(i);//如果不是自己if(et!=this){//如果敌人的方向是向下或者向上if(et.direct==0 || et.direct==2){//我的左点if(this.x>=et.x && this.x<=et.x+20 && this.y+30>=et.y && this.y+30<=et.y+30){return true;}//我的右点if(this.x+20>=et.x && this.x+20<=et.x+20 && this.y+30>=et.y && this.y+30<=et.y+30){return true;}}if(et.direct==3 || et.direct==1){if(this.x>=et.x && this.x<=et.x+30 && this.y+30>=et.y && this.y+30<=et.y+20){return true;}if(this.x+20>=et.x && this.x+20<=et.x+30 && this.y+30>=et.y && this.y+30<=et.y+20){return true;}}}}break;case 3://向左//取出所有的敌人坦克for(int i=0;i<ets.size();i++){//取出第一个坦克EnemyTank et = ets.get(i);//如果不是自己if(et!=this){//如果敌人的方向是向下或者向上if(et.direct==0 || et.direct==2){if(this.x>=et.x && this.x<=et.x+20 && this.y>=et.y && this.y<=et.y+30){return true;}if(this.x>=et.x && this.x<=et.x+20 && this.y+20>=et.y && this.y+20<=et.y+30){return true;}}if(et.direct==3 || et.direct==1){if(this.x>=et.x && this.x<=et.x+30 && this.y+20>=et.y && this.y+20<=et.y+20){return true;}if(this.x>=et.x && this.x<=et.x+30 && this.y+20>=et.y && this.y+20<=et.y+20){return true;}}}}break;}return b;}

好像有点乱哦,但仔细分析还是根据前几篇所说的矩形左上角或右上角的来确定是否碰撞
接下来我们需要去增加一个条件,我们之前在run函数写过

public void run() {while(true){switch(this.direct){case 0://说明坦克正在向上移动for(int i=0;i<30;i++){   //保证坦克不出边界if(y>0){y-=speed;}//......

if语句我们需要再增加一个条件,敌人坦克当快相撞时会停止继续运动,即

if(y>0 &&!this.isTouchOtherEnemy())

将其他if语句全部加上这个条件,这样坦克不重叠的工作就做好了
下一步继续完善游戏,我们给游戏设置分关:
1.做一个开始的Panel 2.闪烁效果
在TankGame4.java文件写MyStartPanel类
先在TankGame4类定义:

//定义一个开始的面板
MyStartPanel msp=null;

再到它的构造函数初始化

        msp=new MyStartPanel();this.setSize(600, 500);  //设大一点,下面有用途this.add(msp);//作为刚运行时界面
//就是一个提示作用
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, 150);}}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){//休眠try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}times++;//重画this.repaint();}}
}

上面的闪烁文字效果是靠实现接口的方式的,所以我们还需要在MyPanel构造函数启动线程

        Thread t =new Thread(msp); t.start();                

这里还需要把原来TankGame4构造函数的代码注释掉(最好先复制)

        /*  mp=new MyPanel();Thread t = new Thread(mp);t.start();this.addKeyListener(mp);//注册监听this.add(mp);this.setVisible(true);  */

运行程序,效果如图

接下来我们要做的是给游戏添加选项菜单,如开始游戏,退出游戏等等…
在TankGame4类定义

    //作出我需要的菜单JMenuBar jmb=null;//开始游戏JMenu jm1=null;JMenuItem jmi1=null;

再到它的构造函数里

        //创建菜单和菜单选项jmb=new JMenuBar();jm1=new JMenu("游戏(G)");//设置快捷方式jm1.setMnemonic('G');jmi1=new JMenuItem("开始新游戏(N)");jm1.add(jmi1);jmb.add(jm1);this.setJMenuBar(jmb);

效果如图:
既然是我们可以选择的,我们应该给它一个监听的机制
第一步依然实现接口和实现它的抽象方法,这里还要写下刚才上面说的复制的代码

public class TankGame4 extends JFrame implements ActionListener
{//........public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub//判断对用户不同的点击作出不同的处理if(e.getActionCommand().equals("newgame")){   //创建战场面板mp=new MyPanel();Thread t = new Thread(mp);t.start();//先删除旧的开始面板this.remove(msp);this.addKeyListener(mp);//注册监听this.add(mp);//显示,刷新this.setVisible(true);}}
}

这样还不能监听哦。还需到TankGame4函数添加如下代码

        //对jmi1响应jmi1.addActionListener(this);jmi1.setActionCommand("newgame");

这些搞定,下面我们要完成这样一个页面

我们需要在Members.java定义一个类

//记录类,同时也可以保存玩家的设置
class Recorder
{//记录每关有多少敌人private static int enNum=20;//设置我有多少可以用的人private static int myLife=3;//记录总共消灭了多少敌人private static int allEnNum=0;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 addEnNumRec(){allEnNum++;}
}

基本内容写好了,下一步就是画出来,在MyPanel类写一个函数

//画出提示信息public void showInfo(Graphics g){//画出提示坦克信息坦克(该坦克不参与战斗)this.drawTank(80, 330, g, 0, 0);g.setColor(Color.BLACK);g.drawString(Recorder.getEnNum()+"", 110, 350);this.drawTank(130, 330, g, 0, 1);g.setColor(Color.BLACK);g.drawString(Recorder.getMyLife()+"", 165, 350);//画出玩家的总成绩g.setColor(Color.black);Font f= new Font("宋体", Font.BOLD, 20);g.setFont(f);g.drawString("你的总成绩", 420, 30);this.drawTank(420, 60, g, 0, 0);g.setColor(Color.black);g.drawString(Recorder.getAllEnNum()+"", 460, 80);}

然后再适当位置添加就行了…

由于一些因素,游戏讲解写到这里,可能由于经验不足时间因素,第一次写这种类型的,表达不是很好,代码也仍不是很完善,不过,下次写项目文章的时候,我一定会保证认真对待文章的表达和完整性,我想每个人都有自己薄弱的地方,所以仍需努力,Java的路仍要继续往前走,努力!!!
在此推荐一位老师:韩顺平,本次写坦克大战游戏的来源,百度一下,你就知道..
需要完整源码的可以到我的资源那里零积分下载…

Java之详解坦克大战游戏(六)相关推荐

  1. java之详解坦克大战_Java之详解坦克大战游戏(一)

    相信大家小时候一定玩过坦克大战游戏,躲避敌方坦克,炸毁敌方坦克,不断向前进攻直逼敌方基地-这次,我们来实现一个简单版的坦克大战,我想学Java的人都有想到以前的按键手机里那菜单点开"Java ...

  2. 【java毕业设计】基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码)——坦克大战游戏

    基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+Eclipse的坦克大战游戏设计与实现,文章末尾附有本毕业设 ...

  3. 一文教你使用java开发一款坦克大战游戏

    导读:随着人们对生活质量的要求一天比一天高,为了让人们更好地开掘自身的智慧,游戏就此进入了大众的视野,在人们的生活中有着重要的位置,已然变得必不可少.游戏产业推动高新技术不断升级,极大地促进了经济的增 ...

  4. java开发一款坦克大战游戏

    导读:随着人们对生活质量的要求一天比一天高,为了让人们更好地开掘自身的智慧,游戏就此进入了大众的视野,在人们的生活中有着重要的位置,已然变得必不可少.游戏产业推动高新技术不断升级,极大地促进了经济的增 ...

  5. Java练手项目2:基于Java的坦克大战游戏(学习Java必备!!!)

    1.引言 随着社会和时代的进步,来自各个方面的压力让人没精打采,为了分解人们的压力,休养那变得疲顿的头脑和劳累的身心,特设计了坦克大战小游戏,游戏操作非常容易,只要将手指放在键盘上敲击相关的游戏键就可 ...

  6. 微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克、炮弹爆炸

    微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克.炮弹爆炸 导入坦克爆炸效果的图片和声音素材 给主角坦克添加事件 给爆炸动画添加事件 当主角坦克碰到敌方坦克或者炮弹时显示爆炸效果 下一篇文章 ...

  7. 基于Java的坦克大战游戏的设计与实现(论文+PPT+源码)

    幻灯片1 基于Java的坦克大战游戏的设计与实现 幻灯片2 CONTENTS 1 4 设计工具与相关技术 详细设计 2 5 系统分析 结论 3 总体设计 幻灯片3 PPT模板下载:http://www ...

  8. 纯Java实现坦克大战游戏,源码公开

    文章目录 前言 一.源码 二.成员类 前言 近日最做项目,很多网友在问题是否有游戏的代码分享,故总结了去年开发的一款小游戏坦克大战,源码公开,大家一起研究改进 * 功能:坦克大战游戏* 1.画出我的坦 ...

  9. 坦克大战游戏Java网络版设计

    目 录 1.引言 1 2.系统分析 2 2.1需求和技术分析 2 2.2功能分析 2 3.总体设计 2 3.1总体功能 2 3.2坦克大战总体流程图 4 4.详细设计 5 4.1面板功能设计 5 4. ...

最新文章

  1. Struts2自定义类型转换器、自定义拦截器和用户输入数据的验证
  2. 地球上环境最恶劣的数据中心
  3. pwn学习总结(四)—— 堆基础知识(持续更新)
  4. ubuntu/deepin 禁用IPV6
  5. boost::geometry::strategy::distance::cross_track用法的测试程序
  6. [.NET] 建构子中传递子对象的对象
  7. angular图片上传
  8. python具有可嵌入性_如何构建可嵌入Python
  9. 5、Python-函数
  10. DPDK - flow Haripin
  11. 淘宝客系统教学系列_2.应用登录接口对接
  12. 专门感染word文件的计算机病毒是什么,计算机病毒分类及详细介绍.doc
  13. 【Pigeon源码阅读】高可用之熔断降级实现原理(十四)
  14. 深度学习框架zf_深度学习十大框架比较
  15. 三闯港交所,主打性价比的乡村基如何夺魁“中式快餐第一股”?
  16. 《国度》之大学者联盟全解
  17. 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面
  18. 网站制作教程是什么?这些步骤要知道
  19. 已解决NameError: name ‘unichr‘ is not defined
  20. ES7、ES8、ES9、ES10新特性大盘点

热门文章

  1. 华东师大计算机系博士几年,越来越多学校将博士由三年制改为四年制,未来博士生涯怎样规划?...
  2. BIMFACE功能测评- 如何创建二三维标签?
  3. php 闪电,PHP闪电入门(16)函数-常用内置函数
  4. oracle重置序列从1开始
  5. 【u8+】调账提示:此分录已两清,不能删除或修改
  6. php中的分割字符串函数,关于PHP中两款字符串分割函数explode,str_split
  7. Android:MediaCodec基本原理
  8. MySQL中的真实案例:某网站有email字段,存储邮件地址,想调查163,126,qq,eyou邮箱的比例;
  9. java计算机毕业设计基于安卓Android的教务的校内人员疫情排查系统设计与实现APP
  10. ansible+shell脚本搭建wordpress论坛