坦克大战敌我坦克重叠问题
解决前
/** 功能:坦克大战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()与其混淆,从而导致坦克重叠
坦克大战敌我坦克重叠问题相关推荐
- java 坦克大战画坦克_java简易坦克大战(2)
public class Tank1 extends JFrame implements ActionListener { MyPanel mp = null; GuanKaPanel gkmb = ...
- php 坦克大战,js坦克大战以实现炮弹击中目标消失并且记分
js坦克大战以实现炮弹击中目标消失并且记分 话不多说 下载下面的代码包就能看到效果, 效果图: js代码如下:/**初始化*/ var shell=document.getElementById('t ...
- java 让坦克移动_坦克大战_坦克移动
MyTankGame2 package com.wxh.tank2; import javax.swing.*; import java.awt.*; import java.awt.event.*; ...
- 超级坦克大战1990 - 坦克大战超难版
[简介] 还记得小时玩的坦克大战1990吗,<超级坦克大战1990>在优化其普通模式的基础上,新增了更加华丽炫酷的超级模式,还加入了更加刺激.更加困难的挑战模式,各种超难的关卡等着你来挑战 ...
- 韩顺平 java坦克大战_坦克大战完整版(韩顺平java)
[实例简介] 坦克大战完整源代码(韩顺平java视频配套) [实例截图] [核心代码] 5i86q5 └── 源码 └── Class14 ├── 111.wav ├── bin │ ├── bo ...
- 【Java_项目篇1】--JAVA实现坦克大战游戏--坦克移动+添加敌方坦克(二)
前期文章: [Java_项目篇<1>]--JAVA实现坦克大战游戏--画出坦克(一) 控制小球移动 1.外部类 实现KeyListener监听接口写法 package com.test3; ...
- Java之坦克大战(二)---坦克图形绘制
紧接着我们上一篇的坦克大战一,今天我们先画出一个坦克. 如果直接用面向过程的思想来做的话,那么很容易就可以画出一个坦克. 但是后面我们需要画出很多个坦克, 所以我们要先把面向对象的思想设计好. 我们的 ...
- java 坦克大战画坦克_Java坦克大战部分:画出界面,敌人坦克,我的坦克,不出界,键盘事件【诗书画唱】...
含很多自己写的个理解和注释,想出的解决,建议,提示,注意事项等方法: package tankeGame; import java.awt.Color; import java.awt.Graphic ...
- java 坦克大战画坦克_【JAVA语言程序设计基础篇】--JAVA实现坦克大战游戏--画出坦克(二)...
坦克类: //坦克父类 可以设置坦克出现位置(x,y) class Tank { int x = 0; int y = 0; public Tank (int x,int y){ this.x = x ...
最新文章
- Gartner公布2018十大技术发展趋势 2025年AI重塑商业模式
- Spring RestTemplate中文乱码解决方案
- 150名打工人被AI判定“效率低”遭开除,网友:属实是人工智能,能治工人
- 对手机图标整理事件总结
- iframe 自适应高度 [记录]
- 分享几种绕过防注入的方法
- iOS端(腾讯Bugly)闪退异常上报扑获日志集成与使用指南
- 虚拟机安装Ubuntu无法通过Xshell登录
- Numpy常用方法和使用技巧
- [译] 什么阻塞了 DOM?
- Flink CDC 系列 - Flink MongoDB CDC 在 XTransfer 的生产实践
- URI和URL的区别与联系
- 在Google上做搜索引擎优化 (SEO),最重要的是哪几点?
- D. Relatively Prime Graph(构造+数论)
- 利用Python批量把flv文件转换成mp4文件
- Unity与iOS相互调用
- 物理服务器安装CentOS 7操作系统
- 初米 php,什么字帖练字好初中米字格a4设置
- Arthas 3.1.2版本发布: 增加logger/heapdump/vmoption命令,支持tunnel server
- PHP HSV色相 饱和度 亮度 增强