当前位置: 代码迷 >> J2SE >> java小白,韩顺平教程中的坦克大战游戏有关问题
  详细解决方案

java小白,韩顺平教程中的坦克大战游戏有关问题

热度:203   发布时间:2016-04-23 19:42:47.0
java小白求助,韩顺平教程中的坦克大战游戏问题
java小白,没有接触过java,跟着韩顺平的视频一步步做到现在,现在的功能是我方坦克击中敌方坦克后,敌方坦克应该消失,可是我的代码中根本无法实现这个功能,击中了敌方坦克,敌方坦克依旧存在,下面将附上代码,望各位高手告知,ps:代码有点长
/**
 * 
 * 功能:坦克大战游戏的2.0版
 * 1、画出坦克
 * 2、我的坦克可以上下左右移动
 * 3、实现子弹的连发,子弹最多连发5颗
 * 4、我们的坦克击中了敌方坦克,敌方坦克消失,如果能作出爆炸效果更好
 * 
 * */
package com.TankGame2;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyTankGame extends JFrame{

MyPanel mp = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
MyTankGame mtg = new MyTankGame();
}

//构造函数
public MyTankGame()
{
mp = new MyPanel();
Thread t = new Thread(mp);
t.start();
this.add(mp);
this.addKeyListener(mp);

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

//我的面板
class MyPanel extends JPanel implements KeyListener,Runnable
{
//定义一个我的坦克
Hero hero = null;

//定义敌人的坦克
Vector<EnemyTank> ets = new Vector<EnemyTank>();

int enSize = 3;

//构造函数
public MyPanel(){
hero = new Hero(100,100);

//初始化敌人的坦克
for(int i=0;i<enSize;i++)
{
EnemyTank et=new EnemyTank((i+1)*50,0);
et.setColor(0);
et.setDirect(2);
//加入
ets.add(et);
}
}

//重写paint函数
public void paint(Graphics g)
{
super.paint(g);
g.fillRect(0,0,400,300);

//画出自己的坦克
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);

//画出敌人的坦克 //这个时候就要选择性的绘出了,因为需要进行判断,判断哪个坦克是否被击中,被击中的坦克不予绘出
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);
}
}

//从ss中遍历实现取出每颗子弹并绘制
for(int i=0;i<this.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);
}

if(myShot.isLive == false)
{
//从ss中删除掉该子弹
hero.ss.remove(myShot);
}
}
}

//写一个函数判断是否击中敌人坦克
//判断是否击中坦克的函数要随时的去判断,因此要在run方法中进行判断
public void hitTank(Shot s,EnemyTank et)
{
//首先判断该坦克的方向
switch(et.direct)
{
//如果敌人坦克的方向是上,或者是下
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;
}
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;
}
break;
}
}

//画出坦克的函数(扩展)
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.setColor(Color.CYAN);
//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.fillOval(x+5,y+10,10,10);
//5、画出线
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:
//向下
//1、画出左面的矩形
//g.setColor(Color.CYAN);
//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.fillOval(x+5,y+10,10,10);
//5、画出线
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);

}

}

@Override//建按下处理 w a s d 表示上下左右
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(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();
}
if(e.getKeyCode() == KeyEvent.VK_J)
{
//判断玩家是否按下j

//开火
if(this.hero.ss.size()<5)
{
this.hero.fire();
}
}

//必须重绘面板
this.repaint();
}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}

@Override
public void run()
{
// 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(i);

//判断坦克是否还活着
if(et.isLive)
{
this.hitTank(myShot, et);
}
}
}
}

this.repaint();
}
}
}

------解决思路----------------------
hitTank之后,看敌方tank是否还活着, 已经死了的话,就从敌方tank集合ets中删除,再repaint
  相关解决方案