思路:敌方坦克移动和发射子弹肯定需要单独的线程,然后敌方坦克的随机移动需要获取四个随机的方向做到以上几点之后会发现做出来的敌方坦克非常的鬼畜,原因是获取随机的方向太频繁,所以我写了一个for循环控制15*50ms一次获取方向,然后子弹需要在EnemyTank类中写一个fire()方法,然后随机的用fire()这个方法即可
1.EnemyTank中的线程run()重写:
 public  void run(){int flag=1;int flag2=1;while (true){flag++;if(flag==15){flag=0;int dir1=(int)(Math.random()*4);setDir(dir1);}flag2=(int)(Math.random()*20);if(flag2%3==0){fire();}switch (getDir()){case 0://上if(!(getY()==550&&getX()<=330||getY()==550&&getX()>=430&&getX()<=730||getY()==550&&getX()>=830)&&getY()>=0)setY(getY() - getSpeed());System.out.println(getSpeed());break;case 1://左if (!(getX()==330&&getY()>=420&&getY()<=550||getX()==730&&getY()>=420&&getY()<=550)&&getX()>=0)setX(getX() - getSpeed());break;case 2:if(!(getY()==420&&getX()<=330||getY()==420&&getX()>=430&&getX()<=730||getY()==420&&getX()>=830)&&getY()<=930)setY(getY() + getSpeed());break;case 3:if(!(getX()==400&&getY()>=420&&getY()<=550||getX()==800&&getY()>=420&&getY()<=550)&&getX()<=1170)setX(getX() + getSpeed());break;}try {Thread.sleep(50);}catch (Exception e){}}}

2.EnemyTank中的fire()函数

public void fire()//装弹 { switch (this.getDir()) { case 0: bullet = new Bullet(this.getX()+8,this.getY()-7,0); bulletVector.add(bullet); break; case 1: bullet = new Bullet(this.getX()-7,this.getY()+8,1); bulletVector.add(bullet); break; case 2: bullet = new Bullet(this.getX()+8,this.getY()+30,2); bulletVector.add(bullet); break; case 3: bullet = new Bullet(this.getX()+30,this.getY()+8,3); bulletVector.add(bullet); break; } Thread thread = new Thread(bullet); thread.start(); }

3.需要在初始化enemyTank是启动EnemyTank的线程


MyPanel() { myTank = new MyTank(120, 220);//初始化我的坦克的初始坐标 myTank.setSpeed(5); for (int i = 0; i < enemynum / 2; i++) { EnemyTank enemyTank = new EnemyTank(i * (230 + 5), 0);//给上面的enemyTank初始化坐标 enemyTank.speed=4; enemyTank.setDir(2); Thread thread = new Thread(enemyTank); thread.start(); enemyTanks.add(enemyTank);//向集合里面添加enemyTank } for (int i = 6; i < enemynum; i++) { EnemyTank enemyTank = new EnemyTank((12 - i - 1) * (230 + 5), 930);//给下面的enemyTank初始化坐标 enemyTank.speed=4; Thread thread = new Thread(enemyTank); thread.start(); enemyTanks.add(enemyTank); } }

4.在paint中绘制敌方坦克和子弹

public void paint(Graphics g) //重写paint方法{g.setColor(Color.black);//画笔着色g.fillRect(0, 0, 1200, 1000);//面板if (myTank.life) {drawTank(myTank.getX(), myTank.getY(), myTank.getDir(), g, 0);//画我方坦克}for(int i=0;i<myTank.bulletVector.size();i++)//画我的坦克的子弹{Bullet bullet = myTank.bulletVector.get(i);if(bullet.life){g.setColor(Color.white);g.fill3DRect(bullet.getX(),bullet.getY(),3,3,false);}else{myTank.bulletVector.remove(bullet);}}for (int i = 0; i < enemyTanks.size(); i++) {EnemyTank enemyTank = enemyTanks.get(i);drawTank(enemyTank.getX(), enemyTank.getY(), enemyTank.getDir(), g, 1);//画敌方坦克}for(int i=0;i<enemyTanks.size();i++){EnemyTank enemyTank =enemyTanks.get(i);for(int j=0;j<enemyTank.bulletVector.size();j++){Bullet bullet = enemyTank.bulletVector.get(j);if(bullet.life){g.setColor(Color.white);g.fill3DRect(bullet.getX(),bullet.getY(),3,3,false);}else{myTank.bulletVector.remove(bullet);}}}}

JAVA之坦克大战(四)敌方坦克的移动和发射子弹相关推荐

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

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

  2. Java坦克大战 (四) 之子弹的产生

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  3. java炮弹_Java坦克大战 (四) 之子弹的产生

    在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学完J2SE的小伙伴们一点启示! 坦克大战V0.4实现功能: 1.写一个Missile类,产生一个可运动的子 ...

  4. java 坦克大战连发_Java坦克大战(三)

    /** 功能: * 1.实现爆炸效果 * 2.敌人坦克可移动,可以连发子弹 * 3.敌人击中我的坦克,我爆炸 * 4.击中第一个坦克爆炸的效果不明显*/ packagecom.fanghua5;imp ...

  5. Java基础 坦克大战01绘制坦克

    java绘图坐标体系 坐标体系-像素 1.绘图还必须搞清一个非常重要的概念-像素 一个像素等于多少厘米? 2.计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的.例如,计算机显示器的分辨率是800 ...

  6. java版坦克大战_JAVA实现坦克大战1.0版本

    1 packagetankGame;2 import java.awt.*;3 import javax.swing.*;4 import java.awt.event.*;5 import java ...

  7. java 坦克大战暂停_【 java版坦克大战--事件处理】 坦克动起来了

    折腾了这么久,坦克总算能动了.只贴代码编辑不给上首页,花了半个小时的时间写了n多注释. 再顺便把绘图的原理发在这里: 绘图原理 Component类提供了两个和绘图有关的重要方法: ①   paint ...

  8. 坦克大战java_java版坦克大战游戏源码

    [java]代码库package tankwar; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; imp ...

  9. 坦克大战代码_坦克大战系列文章-坦克大战简介

    前言 本篇主要对坦克大战Robocode做一个简单的介绍,对java最初的人工智能算法演练工具做一个了解 坦克大战简介 今天我们要谈的是java 最初的基于人工智能算法的仿真模拟坦克大战,全称Robo ...

  10. Fc坦克大战java_java的坦克大战

    一个渣渣写坦克大战的步骤: 1.首先创造好一个坦克和一个GAME框架,并且坦克能够跟着键盘键位移动 案例:在我的博客文件中保存,它的名字是:tankwar0100.rar 主要解决了:1.坦克背景框 ...

最新文章

  1. Xamarin Android布局文件没有智能提示
  2. Vue + ESLint——编译错误[‘xxx‘ is defined but never used]解决方案
  3. VC中的cl.exe
  4. python提交事务_事务提交和回滚
  5. python同时读取多个文件的同一行
  6. js中export的问题
  7. 创建5个组,然后把30个用户分别加入到5个组中
  8. 带着这篇去通关所有Handler的提问(三)
  9. java 避免重定向_java – 避免循环重定向使用HttpClient 4.1.1
  10. java8新特性——Stream流
  11. BZOJ2438[中山市选2011] 杀人游戏
  12. 【PTA】统计素数并求和
  13. 计算机电源16脚芯片,康舒AP16PCO5 ATX电源电路原理与维修(二)
  14. [转载]安徽会考语文篇目(2)
  15. phalcon 自动加载_Phalcon自动加载(PHP自动加载),phalcon加载php_PHP教程
  16. 【图像增强】Frangi滤波器血管图像增强【含Matlab源码 2108期】
  17. 前端实现csv文件类型下载
  18. 爱奇艺自主研发的动态化框架!
  19. 问菩萨为何倒坐,叹众生不肯回头
  20. 项目-Holocubic透明桌面站(基于STM32)

热门文章

  1. 蓝牙测试指标有哪些?
  2. [决策规划算法]自动驾驶中的行为决策
  3. c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程.doc
  4. 计算机考研复试_令人头大的_英文文献翻译
  5. React学习--- JSX的学习
  6. Flex布局 学习(二)
  7. 苹果手机最新款什么时候上市_买了苹果手机,用了几天就不用了,是什么心态?...
  8. 提高Alexa排名的几个方法
  9. 金玉良言:给大学生的48条忠告
  10. ROS机器人操作系统学习笔记(一)--基本概念