/** 功能:

* 1.实现爆炸效果

* 2.敌人坦克可移动,可以连发子弹

* 3.敌人击中我的坦克,我爆炸

* 4.击中第一个坦克爆炸的效果不明显*/

packagecom.fanghua5;import java.awt.*;importjava.awt.event.KeyEvent;importjava.util.Vector;import javax.swing.*;public class MyTankGame1_6 extendsJFrame {

Mypanel1_2 mp= null;public static voidmain(String[] args) {newMyTankGame1_6();

}//构造函数

publicMyTankGame1_6() {

mp= newMypanel1_2();//启动mp线程

Thread t = newThread(mp);

t.start();this.add(mp);//注册监听

this.addKeyListener(mp);this.setSize(400, 300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);

}

}//我的面板,拓宽思路:Panel本身就是一个刷新体

class Mypanel1_2 extends JPanel implementsjava.awt.event.KeyListener, Runnable {//定义我的坦克

Hero1_2 hero = null;//定义敌人的坦克(不止一辆,线程安全,集合)

Vector ets = new Vector();//定义炸弹集合

Vector bombs = new Vector();int enSize = 4;//敌人坦克保持四个//定义三张图片(三张图片才能组成一颗炸弹)

Image image1 = null;

Image image2= null;

Image image3= null;//构造函数

publicMypanel1_2() {

hero= new Hero1_2(10, 10);for (int i = 0; i < enSize; i++) {//创建一辆敌人的坦克

EnemyTank et = new EnemyTank((i + 1) * 50, 0);

et.setColor(0);//坦克默认反向是0(向上),这里改一下

et.setDirect(2);//加入

ets.add(et);//启动敌人的坦克

Thread t = newThread(et);

t.start();//给敌人坦克添加一颗子弹

Shot s = new Shot(et.x + 10, et.y + 30, 2);//加入给敌人的坦克

et.ss.add(s);

Thread t2= newThread(s);

t2.start();

ets.add(et);

}//初始话图片,这样做击中第一个坦克,爆炸的效果不明显。下面优化

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"));//引包:import javax.imageio.ImagesssIO;//try {//image1=ImageIO.read(new File("/bomsb_1.gif"));//image2=ImageIO.read(new File("/bomb_2.gif"));//image3=ImageIO.read(new File("/bomb_3.gif"));//} catch (IOException e) {// //TODO Auto-generated catch block//e.printStackTrace();//}

}//重写paint函数

public voidpaint(Graphics g) {//一定要调用

super.paint(g);

g.fillRect(0, 0, 400, 350);//画出自己的坦克(将方向填进去)

if (hero.isLive == true) {this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 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);/** 画出一颗子弹(后添加 hero.s.isLive==true,节省资源) if (hero.s != null

* &&hero.s.isLive == true) { g.draw3DRect(hero.s.x, hero.s.y,

* 1, 1,false); }*/}if (myShot.isLive == false) {//从ss(向量)中删除该子弹//hero.ss.remove(i);会报异常。

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 > 4) {

g.drawImage(image2, b.x, b.y,30, 30, this);

}else{

g.drawImage(image3, b.x, b.y,30, 30, this);

}//让b的生命值减小

b.lifeDown();//如果炸弹生命值为零,就把该炸弹从bombs向量中去掉

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 != null && enemyShot.isLive == true) {

g.draw3DRect(enemyShot.x, enemyShot.y,1, 1, false);

}if (enemyShot.isLive == false) {//如果敌人的坦克死亡了,就从Vector中删除

et.ss.remove(enemyShot);

}

}

}

}

}//判断敌人的子弹是否击中我

public voidhitMe() {//取出每一个敌人的坦克

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);this.hitTank(enemyShot, hero);

}

}

}//判断我是否击中敌人的坦克

public voidhitEnemyTank() {//判断是否被击中敌人的坦克

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) {this.hitTank(myShot, et);

}

}

}

}

}//写一个函数 专门判断是否击中敌人坦克(原来第二参数: EnemyTank et)

public voidhitTank(Shot s, Tank1_2 et) {//判断该坦克的方向

switch(et.direct) {//敌人坦克的方向是0或2,一致

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;//创建一颗炸弹,放入Vector中

Bomb b = newBomb(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;//创建一颗炸弹,放入Vector中

Bomb b = newBomb(et.x, et.y);//放入

bombs.add(b);

}

break;

}

}//画出坦克的函数

public void drawTank(int x, int y, Graphics g, int direct, inttype) {//坦克类型

switch(type) {case 0:

g.setColor(Color.green);break;case 1:

g.setColor(Color.yellow);break;

}//方向设置

switch(direct) {//向上

case 0:

g.fill3DRect(x, y,5, 30, false);

g.fill3DRect(x+ 15, y, 5, 30, false);

g.fill3DRect(x+ 5, y + 5, 10, 20, false);

g.fillOval(x+ 5, y + 10, 10, 10);

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);

g.fill3DRect(x+ 15, y, 5, 30, false);

g.fill3DRect(x+ 5, y + 5, 10, 20, false);

g.fillOval(x+ 5, y + 10, 10, 10);

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 voidkeyTyped(KeyEvent e) {//TODO Auto-generated method stub

}

@Overridepublic voidkeyPressed(KeyEvent e) {//TODO Auto-generated method stub//已更正为顺时针

if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() ==KeyEvent.VK_W) {this.hero.moveUp();this.hero.setDirect(0);

}else if (e.getKeyCode() ==KeyEvent.VK_RIGHT|| e.getKeyCode() ==KeyEvent.VK_D) {this.hero.setDirect(1);this.hero.moveRight();

}else if (e.getKeyCode() ==KeyEvent.VK_DOWN|| e.getKeyCode() ==KeyEvent.VK_S) {this.hero.moveDown();this.hero.setDirect(2);

}else if (e.getKeyCode() ==KeyEvent.VK_LEFT|| e.getKeyCode() ==KeyEvent.VK_A) {this.hero.moveLeft();this.hero.setDirect(3);

}else if (e.getKeyCode() ==KeyEvent.VK_J) {//将J键设置为发出子弹//子弹连发,J被按几下,发几颗:this.hero.shotEnemy();//this.repaint();在run函数里,不应该设计在这里

if (this.hero.ss.size() <= 4) {this.hero.shotEnemy();

}

}

}

@Overridepublic voidkeyReleased(KeyEvent e) {//TODO Auto-generated method stub

}

@Overridepublic voidrun() {//TODO Auto-generated method stub//每隔100毫秒去重绘

while (true) {try{

Thread.sleep(100);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}//判断是否击中(写在这里,虽然在每次重绘的时候都要调用,但是没办法)//每一颗子弹都要和每个坦克进行匹配

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) {this.hitTank(myShot, et);

}

}

}

}this.hitEnemyTank();this.hitMe();//重绘

this.repaint();

}

}

}

java 坦克大战连发_Java坦克大战(三)相关推荐

  1. java怎么给坦克上图片_Java坦克大战 (七) 之图片版

    在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学完J2SE的小伙伴们一点启示! 坦克大战效果图: 坦克大战V0.7图片版实现功能: 1.将方向定义为一个E ...

  2. java坦克加快速度_Java坦克大战 (六) 之增加可玩性

    在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学完J2SE的小伙伴们一点启示! 坦克大战V0.6实现功能: 1.超级炮弹 2.我方坦克有生命值 3.图像化 ...

  3. java实现潜艇大战游戏_java潜艇大战游戏源码项目

    代码如下 package com.util; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimensio ...

  4. java如何实现定时任务_Java定时任务的三种实现方式

    前言 现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了. 很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清 ...

  5. java 打印三维数组_Java基础第三天_数组

    1.定义一个函数,函数功能是动态提取int[]中元素的最大值. 2.定义一个函数,从数组中查询指定的元素首次出现的位置. 3.定义函数,完成冒泡排序,大数下沉. 4.折半查找. 5.阐述 6.定义一个 ...

  6. java能否构成三角形_java中判断三个参数是否能构成三角形的方法

    java中判断三个参数是否能构成三角形的方法 发布时间:2020-06-25 14:02:58 来源:亿速云 阅读:171 作者:Leah 这篇文章将为大家详细讲解有关java中判断三个参数是否能构成 ...

  7. java实验报告心得_Java实验报告(三)及总结

    实验三 String类的应用 一. 实验目的 (1) 掌握类String类的使用: (2) 学会使用JDK帮助文档: 二. 实验内容 1.已知字符串:"this is a test of j ...

  8. java字符编码采用_JAVA字符编码三:Java应用中的编码问题

    1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是" ...

  9. java 代码块 作用_Java核心(三):代码块的作用

    Java中用{ }括起来的代码段就是代码块,他分为如下几种类型 位置 作用 局部代码块 在方法当中使用,作用是控制变量的生命周期. 局部代码块的变量,只能在代码块内部使用,在执行结束后会被Java回收 ...

最新文章

  1. php找不到控制器里面的方法,php – 在Laravel 4中找不到控制器类
  2. C# WebApi+Task+WebSocket实战项目演练(四)
  3. C/C++ 类库开发库参考【资料整理】
  4. Oracle 数据库启动 startup和startup force的区别
  5. 计算机科学之前说,国内计算机科学十强大学是哪些?前2名没悬念,后面几所都不好说...
  6. vue-环境变量和模式
  7. 微信wechat.class.php,laravel使用组件实现微信网页授权登入
  8. 独辟蹊径,Python打造新型基于图像隐写术的C2通道
  9. [emacs] 用 ido 或 anything 进行选择
  10. ETL学习总结(2)——ETL数据集成工具之kettle、sqoop、datax、streamSets 比较
  11. 防暴力破解一些安全机制
  12. MySQL 8.0复制性能的提升(翻译)
  13. Chart.js报告
  14. 联想服务器安装win10系统安装教程,联想笔记本安装win10系统图文教程
  15. Kotlin学习安卓篇(一)为什么要学习Kotlin?
  16. python调试程序的方法_调试Python程序的四种方法
  17. 双11大队长霜波:从手忙脚乱到胸有成竹,我们如何走过这十年?
  18. 梅科尔工作室-第五次网页前端培训(JS,JavaScript)
  19. 数据结构(C语言)第二版 第一章课后答案
  20. HTML Help Workshop(chm生成工具)的使用

热门文章

  1. J2ME学习笔记(八)(转)
  2. BZOJ2295我爱你啊
  3. js点击缩略图,整屏居中放大图片
  4. 宽刈幅干涉高度计SWOT(Surface Water and Ocean Topography)卫星进展(待完善)
  5. 凝思linux系统显卡设置,TaiShan服务器安装凝思操作系统Linx6.0.90并设置独立显卡WX2100屏幕显示输出...
  6. java 只获取年月日_Java获取当前时间的年月日方法
  7. 从三个角度分析,UI设计师为什么要学习产品原型设计?
  8. 单轴线圈有效匝数为定子每相绕组匝数的sqrt(3/2)倍----《现代电机控制技术》
  9. Firebug的简介
  10. 风云4A卫星行列号和经纬度查找表文件下载及解析