解决前

/** 功能:坦克大战1.1* 1.画出坦克* 2.坦克可以上下左右移动*/
package Tank1_1;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;public class MyTankGame2 extends JFrame {MyPanel mp = null;public static void main(String[] args) {// TODO Auto-generated method stubMyTankGame2 mtg = new MyTankGame2();}//构造函数public MyTankGame2() {mp = new MyPanel();this.setTitle("坦克大战1.1");this.add(mp);this.addKeyListener(mp);this.setSize(400,300);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
}//我的面板
class MyPanel extends JPanel implements KeyListener {//定义一个我的坦克Hero hero = null;//定义敌人坦克组Vector<EnemyTank> ets = new Vector<EnemyTank>();int enSize = 3;//敌人坦克数量//构造函数public MyPanel() {hero = new Hero(150, 150);//初始化敌人坦克for (int i = 0; i < enSize; i++) {//创建一辆敌人的坦克对象EnemyTank et = new EnemyTank((i+1)*50, 0);et.setDirect(2);et.setColor(0);//加入ets.add(et);}}//重写paintpublic void paint(Graphics g) {super.paint(g);//设置图象的背景颜色g.fillRect(0, 0, 600, 400);//画出自己的坦克this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);//画出敌人的坦克for (int i = 0; i < ets.size(); i++) {this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i).getDirect(), 0);}}//画出坦克的函数public void drawTank(int x, int y, Graphics g, int direct, int type) {//判断是什么类型的坦克switch(type) {case 0:g.setColor(Color.CYAN);break;case 1:g.setColor(Color.YELLOW);break;}//判断方向switch (direct) {//向上case 0://1.坦克左履带g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false);//2.画出右履带g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false);//3.画出中间车身g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false);//4.画出炮楼g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10);//5.画出坦克炮g.drawLine(hero.getX()+9, hero.getY()+15, hero.getX()+9, hero.getY());break;//向右case 1://1.坦克左履带g.fill3DRect(hero.getX()-5, hero.getY()+5, 30, 5, false);//2.坦克右履带g.fill3DRect(hero.getX()-5, hero.getY()+20, 30, 5, false);//3.坦克车身g.fill3DRect(hero.getX(), hero.getY()+10, 20, 10, false);//4.坦克炮楼g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10);//5.坦克炮g.drawLine(hero.getX()+10, hero.getY()+15, hero.getX()+25, hero.getY()+15);break;//向下case 2://1.坦克左履带g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false);//2.画出右履带g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false);//3.画出中间车身g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false);//4.画出炮楼g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10);//5.画出坦克炮g.drawLine(hero.getX()+9, hero.getY()+15, hero.getX()+9, hero.getY()+30);break;//向左case 3://1.坦克左履带g.fill3DRect(hero.getX()-5, hero.getY()+5, 30, 5, false);//2.坦克右履带g.fill3DRect(hero.getX()-5, hero.getY()+20, 30, 5, false);//3.坦克车身g.fill3DRect(hero.getX(), hero.getY()+10, 20, 10, false);//4.坦克炮楼g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10);//5.坦克炮g.drawLine(hero.getX()+10, hero.getY()+15, hero.getX()-5, hero.getY()+15);break;}}//键按下处理awsdpublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubif (e.getKeyCode() == KeyEvent.VK_W) {this.hero.setDirect(0);this.hero.moveUp();} else if (e.getKeyCode() == KeyEvent.VK_D) {this.hero.setDirect(1);this.hero.moveRight();} else if (e.getKeyCode() == KeyEvent.VK_S) {this.hero.setDirect(2);this.hero.moveDown();} else if (e.getKeyCode() == KeyEvent.VK_A) {this.hero.setDirect(3);this.hero.moveLeft();}//重新绘制窗口this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}
}

改正后

/** 功能:坦克大战1.1* 1.画出坦克* 2.坦克可以上下左右移动*/
package Tank1_1;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;public class MyTankGame2 extends JFrame {MyPanel mp = null;public static void main(String[] args) {// TODO Auto-generated method stubMyTankGame2 mtg = new MyTankGame2();}//构造函数public MyTankGame2() {mp = new MyPanel();this.setTitle("坦克大战1.1");this.add(mp);this.addKeyListener(mp);this.setSize(400,300);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
}//我的面板
class MyPanel extends JPanel implements KeyListener {//定义一个我的坦克Hero hero = null;//定义敌人坦克组Vector<EnemyTank> ets = new Vector<EnemyTank>();int enSize = 3;//敌人坦克数量//构造函数public MyPanel() {hero = new Hero(150, 150);//初始化敌人坦克for (int i = 0; i < enSize; i++) {//创建一辆敌人的坦克对象EnemyTank et = new EnemyTank((i+1)*50, 0);et.setDirect(2);et.setColor(0);//加入ets.add(et);}}//重写paintpublic void paint(Graphics g) {super.paint(g);//设置图象的背景颜色g.fillRect(0, 0, 600, 400);//画出自己的坦克this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);//画出敌人的坦克for (int i = 0; i < ets.size(); i++) {this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i).getDirect(), 0);}}//画出坦克的函数public void drawTank(int x, int y, Graphics g, int direct, int type) {//判断是什么类型的坦克switch(type) {case 0:g.setColor(Color.CYAN);break;case 1:g.setColor(Color.YELLOW);break;}//判断方向switch (direct) {//向上case 0://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.fillRect(x+5, y+10, 10, 10);//5.画出坦克炮g.drawLine(x+9, y+15, x+9, y);break;//向右case 1://1.坦克左履带g.fill3DRect(x-5, y+5, 30, 5, false);//2.坦克右履带g.fill3DRect(x-5, y+20, 30, 5, false);//3.坦克车身g.fill3DRect(x, y+10, 20, 10, false);//4.坦克炮楼g.fillRect(x+5, y+10, 10, 10);//5.坦克炮g.drawLine(x+10, y+15, x+25, y+15);break;//向下case 2://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.fillRect(x+5, y+10, 10, 10);//5.画出坦克炮g.drawLine(x+9, y+15, x+9, y+30);break;//向左case 3://1.坦克左履带g.fill3DRect(x-5, y+5, 30, 5, false);//2.坦克右履带g.fill3DRect(x-5, y+20, 30, 5, false);//3.坦克车身g.fill3DRect(x, y+10, 20, 10, false);//4.坦克炮楼g.fillRect(x+5, y+10, 10, 10);//5.坦克炮g.drawLine(x+10, y+15, x-5, y+15);break;}}//键按下处理awsdpublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubif (e.getKeyCode() == KeyEvent.VK_W) {this.hero.setDirect(0);this.hero.moveUp();} else if (e.getKeyCode() == KeyEvent.VK_D) {this.hero.setDirect(1);this.hero.moveRight();} else if (e.getKeyCode() == KeyEvent.VK_S) {this.hero.setDirect(2);this.hero.moveDown();} else if (e.getKeyCode() == KeyEvent.VK_A) {this.hero.setDirect(3);this.hero.moveLeft();}//重新绘制窗口this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}
}

主要区别

//判断方向switch (direct) {//向上case 0://1.坦克左履带g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false);//2.画出右履带g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false);//3.画出中间车身g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false);//4.画出炮楼g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10);//5.画出坦克炮g.drawLine(hero.getX()+9, hero.getY()+15, hero.getX()+9, hero.getY());break;//向右case 1://1.坦克左履带g.fill3DRect(hero.getX()-5, hero.getY()+5, 30, 5, false);//2.坦克右履带g.fill3DRect(hero.getX()-5, hero.getY()+20, 30, 5, false);//3.坦克车身g.fill3DRect(hero.getX(), hero.getY()+10, 20, 10, false);//4.坦克炮楼g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10);//5.坦克炮g.drawLine(hero.getX()+10, hero.getY()+15, hero.getX()+25, hero.getY()+15);break;//向下case 2://1.坦克左履带g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false);//2.画出右履带g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false);//3.画出中间车身g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false);//4.画出炮楼g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10);//5.画出坦克炮g.drawLine(hero.getX()+9, hero.getY()+15, hero.getX()+9, hero.getY()+30);break;//向左case 3://1.坦克左履带g.fill3DRect(hero.getX()-5, hero.getY()+5, 30, 5, false);//2.坦克右履带g.fill3DRect(hero.getX()-5, hero.getY()+20, 30, 5, false);//3.坦克车身g.fill3DRect(hero.getX(), hero.getY()+10, 20, 10, false);//4.坦克炮楼g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10);//5.坦克炮g.drawLine(hero.getX()+10, hero.getY()+15, hero.getX()-5, hero.getY()+15);break;}
//判断方向switch (direct) {//向上case 0://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.fillRect(x+5, y+10, 10, 10);//5.画出坦克炮g.drawLine(x+9, y+15, x+9, y);break;//向右case 1://1.坦克左履带g.fill3DRect(x-5, y+5, 30, 5, false);//2.坦克右履带g.fill3DRect(x-5, y+20, 30, 5, false);//3.坦克车身g.fill3DRect(x, y+10, 20, 10, false);//4.坦克炮楼g.fillRect(x+5, y+10, 10, 10);//5.坦克炮g.drawLine(x+10, y+15, x+25, y+15);break;//向下case 2://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.fillRect(x+5, y+10, 10, 10);//5.画出坦克炮g.drawLine(x+9, y+15, x+9, y+30);break;//向左case 3://1.坦克左履带g.fill3DRect(x-5, y+5, 30, 5, false);//2.坦克右履带g.fill3DRect(x-5, y+20, 30, 5, false);//3.坦克车身g.fill3DRect(x, y+10, 20, 10, false);//4.坦克炮楼g.fillRect(x+5, y+10, 10, 10);//5.坦克炮g.drawLine(x+10, y+15, x-5, y+15);break;}

问题出现在没有简化判断坦克方向的定义上,应将判断内的hero.getX()和hero.getY()使用Ctrl+F替换为x和y

不然会导致

this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);

中的hero.getX(),hero.getY()与其混淆,从而导致坦克重叠

坦克大战敌我坦克重叠问题相关推荐

  1. java 坦克大战画坦克_java简易坦克大战(2)

    public class Tank1 extends JFrame implements ActionListener { MyPanel mp = null; GuanKaPanel gkmb = ...

  2. php 坦克大战,js坦克大战以实现炮弹击中目标消失并且记分

    js坦克大战以实现炮弹击中目标消失并且记分 话不多说 下载下面的代码包就能看到效果, 效果图: js代码如下:/**初始化*/ var shell=document.getElementById('t ...

  3. java 让坦克移动_坦克大战_坦克移动

    MyTankGame2 package com.wxh.tank2; import javax.swing.*; import java.awt.*; import java.awt.event.*; ...

  4. 超级坦克大战1990 - 坦克大战超难版

    [简介] 还记得小时玩的坦克大战1990吗,<超级坦克大战1990>在优化其普通模式的基础上,新增了更加华丽炫酷的超级模式,还加入了更加刺激.更加困难的挑战模式,各种超难的关卡等着你来挑战 ...

  5. 韩顺平 java坦克大战_坦克大战完整版(韩顺平java)

    [实例简介] 坦克大战完整源代码(韩顺平java视频配套) [实例截图] [核心代码] 5i86q5 └── 源码 └── Class14 ├── 111.wav ├── bin │   ├── bo ...

  6. 【Java_项目篇1】--JAVA实现坦克大战游戏--坦克移动+添加敌方坦克(二)

    前期文章: [Java_项目篇<1>]--JAVA实现坦克大战游戏--画出坦克(一) 控制小球移动 1.外部类 实现KeyListener监听接口写法 package com.test3; ...

  7. Java之坦克大战(二)---坦克图形绘制

    紧接着我们上一篇的坦克大战一,今天我们先画出一个坦克. 如果直接用面向过程的思想来做的话,那么很容易就可以画出一个坦克. 但是后面我们需要画出很多个坦克, 所以我们要先把面向对象的思想设计好. 我们的 ...

  8. java 坦克大战画坦克_Java坦克大战部分:画出界面,敌人坦克,我的坦克,不出界,键盘事件【诗书画唱】...

    含很多自己写的个理解和注释,想出的解决,建议,提示,注意事项等方法: package tankeGame; import java.awt.Color; import java.awt.Graphic ...

  9. java 坦克大战画坦克_【JAVA语言程序设计基础篇】--JAVA实现坦克大战游戏--画出坦克(二)...

    坦克类: //坦克父类 可以设置坦克出现位置(x,y) class Tank { int x = 0; int y = 0; public Tank (int x,int y){ this.x = x ...

最新文章

  1. Gartner公布2018十大技术发展趋势 2025年AI重塑商业模式
  2. Spring RestTemplate中文乱码解决方案
  3. 150名打工人被AI判定“效率低”遭开除,网友:属实是人工智能,能治工人
  4. 对手机图标整理事件总结
  5. iframe 自适应高度 [记录]
  6. 分享几种绕过防注入的方法
  7. iOS端(腾讯Bugly)闪退异常上报扑获日志集成与使用指南
  8. 虚拟机安装Ubuntu无法通过Xshell登录
  9. Numpy常用方法和使用技巧
  10. [译] 什么阻塞了 DOM?
  11. Flink CDC 系列 - Flink MongoDB CDC 在 XTransfer 的生产实践
  12. URI和URL的区别与联系
  13. 在Google上做搜索引擎优化 (SEO),最重要的是哪几点?
  14. D. Relatively Prime Graph(构造+数论)
  15. 利用Python批量把flv文件转换成mp4文件
  16. Unity与iOS相互调用
  17. 物理服务器安装CentOS 7操作系统
  18. 初米 php,什么字帖练字好初中米字格a4设置
  19. Arthas 3.1.2版本发布: 增加logger/heapdump/vmoption命令,支持tunnel server
  20. PHP HSV色相 饱和度 亮度 增强

热门文章

  1. MySQL-如何分库分表?一看就懂
  2. 浮动的概念作用特点产生浮动的原因和清除浮动的方法
  3. python游戏代码怎么运行_bpython运行
  4. Java读写Properties配置文件(Properties类)
  5. CSS3 新特性概述
  6. python小学教学案例_Python学习案例
  7. 【hdu6072】Logical Chain
  8. 《丑陋的中国人》之读后感
  9. python wasm_【Python】基于wasm的openssl实践
  10. 锂电池针刺试验是否有必要,什么是针刺测试