Java之详解坦克大战游戏(三)

上篇我们已经能画出能移动的坦克了,这次来画出敌人的坦克,敌人的坦克数量肯定是多的,那么考虑用数组还是用集合,毫无疑问我们选的是集合,因为敌人坦克击毁后会再增加坦克,也就是说数目会增加的,那样用数组是不太合理了..集合中我们选择线程安全的Vector…继续续写上篇的代码
首先到Members.java添加一个敌方坦克的类

//敌人的坦克
class EnemyTank extends Tank{
   

    public EnemyTank(int x, int y) {
        super(x, y);    
    }

}

在Tank类定义坦克颜色(区分自己与敌人的坦克)

    int color;//坦克的颜色

    public int getColor() {
        return color;
    }
    public void setColor(int color) {
        this.color = color;
    }
class MyPanel extends Panel implements KeyListener
{
   
//.....
    //敌人的坦克组
    Vector<EnemyTank> ets = new Vector<EnemyTank>();

    int enSize=3; //敌人坦克初始数量
    public MyPanel()
    {   
        //初始化敌人的坦克
        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, 1200, 900);  //填充使背景变为黑色   
        //画出自己的坦克
        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);
        }
    }

程序运行效果如图:这里写图片描述
接下来双方都有坦克,就来考虑出子弹吧…
子弹是会移动的,这里我们将用到线程知识,我们需要一个子弹类(为了避免乱了后改不回去,还是新建一个包com.TankGame2复制原来两个java文件)
到Members.java写子弹类,子弹一旦被创建立马就要跑了,我们这里让子弹类实现Runnable接口

//子弹类
class Shot implements Runnable
{
   
    int x;
    int y;
    int direct;//子弹的方向
    int speed=1; //子弹速度
    boolean isLive=true;//子弹是否活着
    public Shot(int x,int y,int direct)
    {
        this.x=x;
        this.y=y;
        this.direct=direct;
    }
    public void run() 
    {
        while(true)
        {
            try {
                Thread.sleep(50);  //经测试休息50毫秒比较好,要不然内存容易撑不了
            } catch (Exception e) {
                // TODO: handle exception
            }
            switch(direct)
            {
            case 0://向上打出
                y-=speed;
                break;
            case 1://向右打出
                x+=speed;
                break;
            case 2://向下打出
                y+=speed;
                break;
            case 3://向左打出
                x-=speed;
                break;
            }
            //判断子弹是否碰到边缘 我们刚开始是setsize(400,300)
            if( x<0 || x>400 || y<0 || y>300)
            {
                this.isLive=false;
                
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值