java 坦克大战从敌人集合中删除坦克时报错

java 坦克大战中炮弹击中敌人坦克,子弹会消失,但是子弹坐标却还会运动,怎么回事?
[问题点数:70分,结帖人jxtaihe]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:0
本版专家分:105
本版专家分:70
本版专家分:51103
2013年3月 Java大版内专家分月排行榜第三2013年2月 Java大版内专家分月排行榜第三2012年11月 Java大版内专家分月排行榜第三2008年3月 Java大版内专家分月排行榜第三
匿名用户不能发表回复!
其他相关推荐
今天我们继续坦克大战系列。我将沿用chapter2的代码继续为大家讲解。由于计划的修订第三节先完成我方坦克的移动。主要的操作流程如下:
(一)首先打开上一节的代码,然后在资源解决方案中头文件和主文件的地方添加程序要自己定义的坦克的类和方法。
主要操作位右键头文件-&头文件-&新建项-&.h文件 命名为Thing
在Thing.h里面添加的代码如下 附图。
#include &stdafx.
using System.C
using System.Collections.G
using UnityE
public class EnemyScript : MonoBehaviour {
float timer = 0;
public GameObject bul
这是本人在写坦克大战中实现了坦克可以发送多颗子弹的版本,如果你需要,可以下载。
昨天弄了四个小时还是没实现水下模糊的功能!!!
然后今天才发现动态挂载脚本的时候有个shader脚本没添加进去,那么现在问题来了,如何在动态挂载脚本之后向里面再添加函数呢??
前期相关文章【Java_项目篇&1&】–JAVA实现坦克大战游戏–画出坦克(一)
【Java_项目篇&1&】–JAVA实现坦克大战游戏–坦克移动+添加敌方坦克(二)
【Java_项目篇&1&】–JAVA实现坦克大战游戏–坦克发射子弹(三)一、任务需求实现子弹连发以及爆炸效果。(Tank_04)二、思路-子弹连发1.在Hero类中新建Vector,每颗子弹存到Vector中。Vector&Shot
听说上传有积分,所以将第一次做的坦克大战拿出来晒晒。实现了坦克发射子弹,移动。敌人自动移动和发射子弹。以及被击中后坦克消失等!
此HTML5所做坦克的坦克大战的功能比较齐全
而且都是用HTML5画出来的坦克和炮弹
一、自己的坦克能上下左右移动
按wsad 这是上下左右键
二、自己的坦克可以发射多颗炮弹 连续发射炮弹
三、画出敌人的三个坦克 而且可以向四个方向随机移动
四、自己的坦克可以击中敌人的坦克
敌人也可以击中自己的
五、不可以超出边界,击中敌人坦克
坦克爆炸 子弹消失
之前用Js写的坦克大战,没有写完,目前可以在地图中消灭敌人,以及自编地图对战(用了HTML5的draggable)。音效用了soundmanager2库,其他功能实现均为原生js与jquery。
游戏页面:点此传送
代码都是函数式的调用。没有封装。打算近期再重构把它完成。面向对象应该更合理一些。
所有的代码页面查看源代码可见。
思路:添加子弹类,并且写出子弹运行的线,然后在Mytank中添加新的fire()方法,用于发射子弹时获得当前炮管的方向,因为子弹较多所以需要把子弹放在Vector集合里,并且需要开多线程,因为子弹运动需要进行重绘,所以就需要Panel开多线程。1.Bullet类:public class Bullet implements
&Bullet&: public int damage = 60;///定义Bullet的伤害值为60 void Start()
Destroy(this.gameObject, 3);///子弹发射没有触碰到物体3秒后消失。
}/////////因为子弹速度非常快,我们将子弹运行痕迹示为一条射线///射线位置
Vector3 oP = tr...java简单坦克大战制作代码_java
作者:用户
本文讲的是java简单坦克大战制作代码_java,
利用Java语言中的集合、Swing、线程等知识点编写一个坦克大战游戏。(1) 画出敌我坦克的原理:在坦克类里面有一个布尔类型变量good。用于判断坦克的阵营,在创建坦克对象时在Tank类的构造方法中传入good的值。在画坦克的时候判断g
利用Java语言中的集合、Swing、线程等知识点编写一个坦克大战游戏。(1) 画出敌我坦克的原理:在坦克类里面有一个布尔类型变量good。用于判断坦克的阵营,在创建坦克对象时在Tank类的构造方法中传入good的值。在画坦克的时候判断good的值,区分敌我坦克的颜色;(2) 坦克运动的原理:
在坦克类里写入了监听键盘摁键的响应事件,对监听到的上下左右键进行记录,并合成坦克移动的八个方向的变量。之后对应每个方向的不同对坦克坐标x,y的值做响应的更改实现我方坦克的移动。而敌方坦克则自动移动,通过随机数对敌方坦克移动方向的随机,并且随机出每次移动的次数。两个随机值相结合即实现了敌方坦克的移动。(3) 坦克发射子弹的原理:
通过键盘监听,检测到发射子弹命令后将主类的子弹类集合中添加一个子弹类。将炮筒的方向以及坦克的位置以及坦克的阵营传入给子弹类,在主类paint画方法中一直循环子弹类集合,如果集合内有子弹,就画出来。这样就实现了发射子弹。(4) 坦克、子弹、墙的碰撞原理:在坦克类子弹类墙类中分别getRect方法获取自身的范围,然后在每次画坦克、子弹时都会进行相应的碰撞检测(在坦克类里有与墙和出自己外的坦克相撞的处理方法、在子弹类里有与墙和坦克相碰撞的处理方法。),如果自身与不该碰撞的物体的范围相重合,则代表两物体相撞。(5)坦克加血的原理: 在血块类中有血块与我方坦克相碰撞的处理方法,如果血块范围与坦克范围重合则血块类死亡,并且坦克类的血量回复置满。(6)坦克复活的原理:
通过键盘监听,检测到我方坦克复活命令后,如果我方坦克处于死亡状态,则将我方坦克存货状态改为活着并且将我方坦克血量回置满血。
编程思想:坦克大战的编程思想在主类开启一个线程,没50毫秒循环一次画方法(绘制整个界面内的所有东西)。画的东西有敌我坦克(颜色区分)、子弹、墙、血块、爆炸。所以总共写出了几个类:Tank坦克类、Missile子弹类、Wall墙类、Blood血块类、TankClient主类。在每一个类中均写有画方法实现本类属性的绘制功能。在主类中有键盘监听事件调用这Tank类的键盘监听事件。通过键盘监听判断出对Tank做出相应的移动,而敌方Tank则是随机运动。并且每次刷新都有调用各类的碰撞方法,判断一些不该碰撞的对象的情况时做出处理。而每个对象的创建例如子弹这些是在触发产生之后将新建子弹类加入一个子弹类集合之中,在绘制的时候判断集合中的数量进行绘制,出界或者打死坦克则在集合中删除。其他类也均相似,不在细说。
代码中每步都注释有相应的解释。
TankClient.java
import java.awt.C
import java.awt.F
import java.awt.G
import java.awt.I
import java.awt.event.KeyA
import java.awt.event.KeyE
import java.awt.event.WindowA
import java.awt.event.WindowE
import java.util.ArrayL
import java.util.L
import javax.swing.JF
public class TankClient extends JFrame{
* @param args
Image OffScrennImage =
//双缓冲内存图片存储
/*游戏大小*/
public static final int GAME_WIDTH = 800;
public static final int GAME_HEIGTH = 600;
Tank myTank = new Tank(500,400,true,Color.red,Tank.Direction.STOP, this);//我方坦克类
List&Missile& missiles = new ArrayList&Missile&();//子弹的集合
List&Explode& explode = new ArrayList&Explode&();//爆炸集合
List&Tank& tanks = new ArrayList&Tank&();
//坦克集合
Wall wall1 = new Wall(150,200,20,300,this);
Wall wall2 = new Wall(250,500,300,20,this);
Wall wall3 = new Wall(650,200,20,300,this);
Wall wall4 = new Wall(250,300,300,20,this);
Wall wb = new Wall(750,550,40,40,this);
Blood b = new Blood();
public static void main(String[] args) {
// TODO Auto-generated method stub
TankClient tc=new TankClient();
tc.lauchFrame();
private void lauchFrame() {
// TODO Auto-generated method stub
for (int i = 0; i & 10; i++){
tanks.add(new Tank(50+40*(i+1), 50, false,Color.blue,Tank.Direction.D, this));
this.setLocation(100, 100);
//窗口初始坐标点
this.setSize(GAME_WIDTH, GAME_HEIGTH);
//窗口初始大小
this.setTitle("TankWar");
//窗口名称
/*窗口监听*/
this.addWindowListener(new WindowAdapter() {
/*点退出叉之后运行*/
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
this.addKeyListener(new KeyMoniton());
//设置键盘监听
this.setVisible(true);
//设置窗口显现
this.setResizable(false);
//设置窗口不可改变大小
this.getContentPane().setBackground(Color.green);
//设置窗口前景色为绿色
new Thread(new PaintThread()).start();
//开始运行PaintThread类run
public void paint(Graphics g) {
// TODO Auto-generated method stub
//Graphics为画笔类
super.paint(g);
myTank.draw(g);
wall1.draw(g);
wall2.draw(g);
wall3.draw(g);
wall4.draw(g);
wb.draw(g);
b.draw(g);
myTank.eatBlood(b);
myTank.hitWall(wall1);
myTank.hitWall(wall2);
myTank.hitWall(wall3);
myTank.hitWall(wall4);
/*循环子弹集合*/
for (int i = 0; i & missiles.size(); i++){
Missile m = missiles.get(i);
//获取当前子弹
m.hitTanks(tanks);
//自己子弹打死敌方坦克
m.hitWall(wall1);
//子弹与墙
m.hitWall(wall2);
m.hitWall(wall3);
m.hitWall(wall4);
m.hitTank(myTank);//敌人子弹打击自己的坦克
m.draw(g);
(int i = 0; i & explode.size(); i++){
explode.get(i).draw(g);
for (int i = 0; i & tanks.size(); i++){
Tank t = tanks.get(i);
t.draw(g);
//画敌方坦克
t.hitTanks(tanks);
t.hitWall(wall1);
//坦克与墙
t.hitWall(wall2);
t.hitWall(wall3);
t.hitWall(wall4);
//g.setFont(new Font("宋体",Font.BOLD,20));
g.drawString("missiles count:"+missiles.size(), 10, 50);//显示
g.drawString("explode count:"+explode.size(), 10, 80);//显示
g.drawString("tanks count:"+tanks.size(),10, 110);
g.drawString("myTank Life:"+myTank.getLife(), 10, 130);
g.drawString("回血:", 750, 540);
g.drawString("方向键移动方向;E:释放移动血快", 10, 590);
g.drawString("z:发射东风-31;a:发射东风-41;", 10, 570);
g.drawString("F2:复活;F3:敌方复活(对多20)", 10, 550);
g.drawString("R:位置还原;Q:血量加满", 10, 530);
/*repaint-〉update-&paint*/
public void update(Graphics g) {
// TODO Auto-generated method stub
super.update(g);
if(OffScrennImage == null)
OffScrennImage = this.createImage(GAME_WIDTH, GAME_HEIGTH);
Graphics goffscrenn = OffScrennImage.getGraphics();
//设置一个内存画笔颜色为前景图片颜色
Color c = goffscrenn.getColor();
//还是先保存前景颜色
goffscrenn.setColor(Color.green);
//设置内存画笔颜色为绿色
goffscrenn.fillRect(0, 0, GAME_WIDTH, GAME_HEIGTH);
//画成图片,大小为游戏大小
goffscrenn.setColor(c);
//还原颜色
g.drawImage(OffScrennImage, 0, 0, null);
//在界面画出保存的图片
paint(goffscrenn);
//把内存画笔调用给paint
private class PaintThread implements Runnable{
public void run() {
// TODO Auto-generated method stub
while(true){
repaint();
//运行顺序repaint-&update-&paint
Thread.sleep(50);
//每隔50毫秒刷新画面一次
}catch(Exception e){
e.printStackTrace();
/*键盘响应*/
private class KeyMoniton extends KeyAdapter{
/*摁下键盘响应*/
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
super.keyPressed(e);
myTank.KeyPressed(e);
/*抬起键盘响应*/
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
super.keyReleased(e);
myTank.keyReleased(e);
import java.awt.C
import java.awt.G
import java.awt.I
import java.awt.R
import java.awt.event.KeyE
import java.util.L
import java.util.R
import javax.swing.ImageI
public class Tank {
/*坦克本身数据*/
int x,//坦克坐标
private int oldX, oldY;
//坦克上一步坐标
public static final int Whith = 30;
public static final int Higth = 30;
public static final int XSPEED = 5;
//横向移动速度
public static final int YSPEED = 5;
//纵向移动速度
//坦克颜色
private boolean bL=false, bU=false, bR=false, bD=
//四个方向控制值
enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};
//由四个方向值合成八个方向的移动
private Direction dir = Direction.STOP;
//出场方向
private Direction ptDir = Direction.D;
//炮筒初始方向
//判断坦克的阵营
private boolean live =
//判断坦克是否存活
private static Random r = new Random();//设置一个随机值变量
private static int step = r.nextInt(12)+3;
//敌方坦克随机移动步骤3-14步
private int Life = 100;
private BloodBar bb = new BloodBar();
ImageIcon icon = new ImageIcon("res\\myTank.jpg");
ImageIcon icon2 = new ImageIcon("res\\enemyTank.jpg");
Image image = icon.getImage();
Image image2 = icon2.getImage();
private TankC
//主类权限
public Tank(int x, int y, boolean good, Color color) {
this.color =
this.good =
public Tank(int x, int y, boolean good,Color color,Direction dir,TankClient tc){
this(x,y,good,color);
this.dir =
/*获取坦克生命值*/
public int getLife() {
/*设置坦克生命值*/
public void setLife(int Life) {
this.Life = L
/*获取坦克阵营*/
public boolean isGood() {
/*设置坦克阵营*/
public void setGood(boolean good) {
this.good =
/*获取坦克存活状态*/
public boolean isLive() {
/*设置坦克存活状态*/
public void setLive(boolean live) {
this.live =
/*画坦克*/
public void draw(Graphics g){
if(!live){
if(!good){
tc.tanks.remove(this);
//敌方坦克死亡时在集合中删除
//tc.tanks.add(new Tank(r.nextInt(700),r.nextInt(500),false,Color.blue,Direction.D,this.tc));
/*先保存之前的画笔颜色,画完之后再还原画笔颜色*/
Color c = g.getColor();
//获取当前画笔颜色
g.setColor(color);
//设置画笔颜色为红色
/*画坦克*/
g.fillOval(x, y, Whith, Higth);
/*两种方法绘制敌我坦克,运用之前加入的图片或者颜色区分*/
g.drawImage(image, x, y,Whith,Higth,null);
g.drawImage(image2, x, y, Whith, Higth, null);
bb.draw(g);
//我方坦克画血条
g.setColor(Color.black);
/*通过炮筒方向画出炮筒*/
switch(ptDir){
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y+Tank.Higth/2);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith/2, y);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y+Tank.Higth/2);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y+Tank.Higth);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith/2, y+Tank.Higth);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y+Tank.Higth);
g.setColor(c);
//还原画笔颜色
move();//移动
/*键盘监听;摁键*/
public void KeyPressed(KeyEvent e){
int key = e.getKeyCode();
//将键盘监听到的摁键以整数保存
/*键盘移动坦克*/
switch(key){
/*移动摁键*/
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_LEFT:
locateDirection();
/*键盘监听;抬起键*/
public void keyReleased(KeyEvent e){
int key = e.getKeyCode();
//将键盘监听到的摁键以整数保存
/*键盘移动坦克*/
switch(key){
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_LEFT:
case KeyEvent.VK_Z:
//单发子弹
case KeyEvent.VK_F2:
//我方复活
if(!this.live){
this.live=
this.setLife(100);
case KeyEvent.VK_F3:
//敌方复活
case KeyEvent.VK_A:
//无敌导弹
superFire();
case KeyEvent.VK_Q:
if(this.live)
this.Life = 100;
case KeyEvent.VK_E:
//释放血块
tc.b.fh();
/*还原位置键*/
case KeyEvent.VK_R:
locateDirection();
//合成方向
/*合成移动方向*/
void locateDirection(){
if(bL&&!bU&&!bR&&!bD) dir=Direction.L;
else if(bL&&bU&&!bR&&!bD) dir=Direction.LU;
else if(!bL&&bU&&!bR&&!bD) dir=Direction.U;
else if(!bL&&bU&&bR&&!bD) dir=Direction.RU;
else if(!bL&&!bU&&bR&&!bD) dir=Direction.R;
else if(!bL&&!bU&&bR&&bD) dir=Direction.RD;
else if(!bL&&!bU&&!bR&&bD) dir=Direction.D;
else if(bL&&!bU&&!bR&&bD) dir=Direction.LD;
else if(!bL&&!bU&&!bR&&!bD) dir=Direction.STOP;
void move(){ //移动
/*记录上一步的位置*/
switch(dir){
x-=XSPEED;
x-=XSPEED;
y-=YSPEED;
y-=YSPEED;
x+=XSPEED;
y-=YSPEED;
x+=XSPEED;
x+=XSPEED;
y+=YSPEED;
y+=YSPEED;
x-=XSPEED;
y+=YSPEED;
case STOP:
/*判断坦克移动越界情况(游戏边界)*/
if(y & 25)
if(x+Whith & tc.GAME_WIDTH-5)
x = tc.GAME_WIDTH-Whith-5;
if(y+Higth & tc.GAME_HEIGTH-5) y = tc.GAME_HEIGTH-Higth-5;
if(dir != Direction.STOP)
//如果坦克不静止就改变炮筒方向
/*敌方坦克自动移动*/
if(!good){
Direction[] dirs = Direction.values();
//将方向变量设为数组
if(step == 0){
step = r.nextInt(12)+3;
//随机移动步骤
int randomNumber = r.nextInt(dirs.length);
//随机移动方向
dir = dirs[randomNumber];
if(r.nextInt(40)&30) this.fire();
//随机是否发射炮弹
/*敌方坦克复活*/
public void fuhuo(){
if(tc.tanks.size() & 20)
while(true){
int x = r.nextInt(700);
int y = r.nextInt(500);
Tank t = new Tank(x,y,false,Color.blue,Direction.D,tc);
/*如果坦克与墙重合则重新随机位置直到不重合为止才将新坦克加入集合*/
if(t.getRect().intersects(tc.wall1.getRect())||t.getRect().intersects(tc.wall2.getRect())
||t.getRect().intersects(tc.wall3.getRect())
||t.getRect().intersects(tc.wall4.getRect())){
tc.tanks.add(t);
/*子弹发射*/
public void fire(){
int x = this.x + Whith/2 - Missile.Whith/2;
//控制子弹方向为坦克中间
int y = this.y + Higth/2 - Missile.Higth/2;
tc.missiles.add(new Missile(ptDir,color,x,y,good,tc)); //创建新的子弹类加入到子弹集合中
/*碰撞;获取坦克的范围*/
public Rectangle getRect(){
return new Rectangle(x,y,Whith,Higth);
/*回执上一步位置*/
private void stay(){
/*如果撞墙,调用stay方法,返回上一步位置*/
public boolean hitWall(Wall w){
if(this.live&&this.getRect().intersects(w.getRect())){
this.stay();
/*坦克互相撞击事件*/
public boolean hitTanks(List&Tank& tanks){
for(int i=0;i&tanks.size();i++){
Tank t=tanks.get(i);
if(this!=t){//自己与自己不可相撞
/*如果相撞返回上一步位置*/
if(this.live&&t.isLive()&&this.getRect().intersects(t.getRect())){
this.stay();
/*带开火方向的发射函数*/
public Missile fire(Direction dir){
int x=this.x+Whith/2-Missile.Whith/2;
int y=this.y+Higth/2-Missile.Higth/2;
Missile m=new Missile(dir,color,x, y,good, this.tc);
tc.missiles.add(m);
/*超级射击导弹*/
private void superFire(){
Direction[] dirs=Direction.values();
for(int i=0;i&8;i++){
fire(dirs[i]);//循环调用八个方向
/*新增血块类*/
private class BloodBar{
/*画血条*/
public void draw(Graphics g){
Color c=g.getColor();
g.setColor(Color.red);
g.drawRect(x, y-10, Whith, 10);
int w=Whith*Life/100;
g.fillRect(x, y-10, w, 10);
g.setColor(c);
/*吃血方法*/
public boolean eatBlood(Blood b){
if(this.live&&b.isLive()&&this.isGood()&&this.getRect().intersects(b.getRect())){
this.setLife(100);
b.setLive(false);
if(this.getRect().intersects(tc.wb.getRect()))
this.Life = 100;
Missile.java
import java.awt.C
import java.awt.G
import java.awt.R
import java.util.L
public class Missile {
/*子弹本身数据*/
//子弹方向
//子弹颜色
//子弹位置
public static final int XSPEED = 15;
//横向移动速度
public static final int YSPEED = 15;
//纵向移动速度
public static final int Whith = 10;
public static final int Higth = 10;
private boolean live =
//判断子弹的存活
//判断子弹和阵营
private TankC//主类权限
public Missile(Tank.Direction dir,Color c, int x, int y) {
this.dir =
public Missile(Tank.Direction dir,Color c, int x, int y,boolean good,TankClient tc){
this(dir,c,x,y);
this.good =
/*获取子弹的存活*/
public boolean isLive() {
/*设置子弹的存活*/
public void setLive(boolean live) {
this.live =
public void draw(Graphics g){
/*如果子弹死亡状态将这个子弹在子弹集合中删除*/
if(!live){
tc.missiles.remove(this);
//集合中删除
/*先保存之前的画笔颜色,画完之后再还原画笔颜色*/
Color d = g.getColor();
//获取当前画笔颜色
g.setColor(c);
//设置画笔颜色为红色
/*画子弹*/
g.fillOval(x, y, Whith, Higth);
g.setColor(d);
//还原画笔颜色
public void move(){
/*判断移动方向移动坦克位置*/
switch(dir){
x-=XSPEED;
x-=XSPEED;
y-=YSPEED;
y-=YSPEED;
x+=XSPEED;
y-=YSPEED;
x+=XSPEED;
x+=XSPEED;
y+=YSPEED;
y+=YSPEED;
x-=XSPEED;
y+=YSPEED;
case STOP:
/*判断子弹的越界情况;出界则子弹死亡,在子弹集合中删去*/
if(x&0||y&0||x&TankClient.GAME_WIDTH||y&TankClient.GAME_HEIGTH)
/*碰撞;获取子弹的范围*/
public Rectangle getRect(){
return new Rectangle(x,y,Whith,Higth);
/*子弹与坦克碰撞过程*/
public boolean hitTank(Tank t){
/*如果子弹与坦克在同一范围则子弹和坦克同时死亡;且子弹只能杀死对方坦克*/
if(this.live&&this.getRect().intersects(t.getRect())&&t.isLive()&&this.good!=t.isGood()){
if(t.isGood()){ //好坦克
/*我方坦克子弹射中会减少生命值,生命值0的时候会死亡*/
t.setLife(t.getLife()-20);
if(t.getLife()&=0)
t.setLive(false);
}else{ //坏坦克
t.setLive(false);//死亡
this.live=//子弹死亡
tc.explode.add(new Explode(x, y, tc));//新建爆炸加入集合
/*循环坦克集合分别进行判断子弹碰撞*/
public boolean hitTanks(List&Tank& tanks){
(int i = 0; i & tanks.size(); i++){
if(hitTank(tanks.get(i)))
/*子弹与墙的碰撞过程*/
public boolean hitWall(Wall w){
/*如果子弹与墙的范围重合子弹死亡*/
if(this.live&&this.getRect().intersects(w.getRect())){
this.live=
//子弹死亡
import java.awt.G
import java.awt.R
public class Wall {
/*墙数据*/
int x,y,w,h;
//位置和宽高
private TankC
//主类权限
public Wall(int x, int y, int w, int h, TankClient tc) {
/*获取墙的范围*/
public Rectangle getRect(){
return new Rectangle(x,y,w,h);
public void draw(Graphics g){
g.fillRect(x, y, w, h);
Explode.java
import java.awt.C
import java.awt.G
public class Explode {
/*坦克爆炸属性*/
//爆炸位置
private boolean live =
//爆炸是否存在
int step = 0;
//爆炸时间控制
int [] diameter = new int[] {4, 7, 12, 18, 26, 32, 49, 56, 65, 77, 80, 50, 40, 30, 14, 6};//爆炸范围
private TankC
//主类权限
public Explode(int x, int y, TankClient tc) {
/*画爆炸*/
public void draw(Graphics g){
//如果爆炸死亡状态不画结束
/*如果爆炸时间结束爆炸不存在并在集合中删除*/
if(step == diameter.length){
//爆炸死亡
//步骤时间归0
tc.explode.remove(this);
//集合中删除
/*画爆炸*/
Color c = g.getColor();
g.setColor(Color.orange);
g.fillOval(x, y, diameter[step], diameter[step]);
g.setColor(c);
Blood.java
import java.awt.C
import java.awt.G
import java.awt.R
import java.util.R
public class Blood {
/*血块数据*/
int x, y, w,//血块位置和大小
private TankC
//主类权限
private boolean live=//血块的存活
private static Random r = new Random();//设置一个随机值变量
/*获取血块的存活状态*/
public boolean isLive() {
/*设置血块的存活状态*/
public void setLive(boolean live) {
this.live =
/*血块位置初值随机一个数值*/
public Blood(){
x=r.nextInt(600)+100;
y=r.nextInt(400)+100;
/*画血块*/
public void draw(Graphics g){
Color c=g.getColor();
g.setColor(Color.magenta);
g.fillRect(x, y, w, h);
g.setColor(c);
/*释放血块*/
public void fh(){
if(!live){
x = r.nextInt(600)+100;
y = r.nextInt(400)+100;
/*获取血块范围*/
public Rectangle getRect(){
return new Rectangle(x, y, w, h);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云栖社区。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
java简单小游戏源代码、java飞机大战源代码、java简单代码、简单的java程序代码、java简单计算器源代码,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信