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

思路:敌方坦克移动和发射子弹肯定需要单独的线程,然后敌方坦克的随机移动需要获取四个随机的方向做到以上几点之后会发现做出来的敌方坦克非常的鬼畜,原因是获取随机的方向太频繁,所以我写了一个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);
                }
            }
        }
    }


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值