Robocode教程5——Enemy类

前面我们讲了第一个机器人Tiny,Tiny是继承自Robot这个类,可以看出Tiny智商有限,而几乎所有的战场机器人都继承自AdvancedRobot类,关于这两个类的区别我们以后再讲。首先我们还是从一个简单的高级机器人讲起。

在这个高级机器人中,首先我们要声明一个Enemy类,Enemy,就是敌人,Enemy类的作用是将敌人的信息封装起来供我们使用。

在onScannedRobot(ScannedRobotEvent e)方法中,雷达每次扫描到敌人时,都会执行这个方法,同时,ScannedRobotEvent e给我们提供了一些关于敌人的信息,这些信息是非常重要的,具体见API中,下图我列出一些

double      getDistance()   返回离敌人的距离。

double      getEnergy()   返回敌人的能量,由于每发出一个子弹是要消耗能量的,通过对敌人能量的检测,可以判断敌人的开火时间,从而采用相应的躲避策略,这是很普遍的做法。

double      getHeading() 返回敌人的Heading,朝向,单位度

double  getHeadingRadians() 返回敌人的Heading,朝向,单位弧度

String   getName() 返回敌人名字

 

API中都很详细,大家自己看看吧

 

有了这些,我们来建立我们的Enemy类,首先分析Enemy有哪些数据成员:

   private double x,y; //x,y坐标

   private Stringname;//敌人名字

   private double headingRadian; //朝向

   private double bearingRadian; //相对于‘我’的方向,具体查看bearing和heading的区别

   private double distance; //距离

   private double direction; //绝对方向

   private double velocity; //运动速度

   private double energy; //能量值

 

当然这些都是基础的数据成员,到后面我们需要一些其他成员时可以再添加。

 

有了成员之后,我们就要考虑怎样给其赋值了,所以第一个成员方法为:

   public void update(ScannedRobotEvent e,AdvancedRobot me){

      name = e.getName();

      headingRadian = e.getHeadingRadians();

      bearingRadian = e.getBearingRadians();

      this.energy = e.getEnergy();

      this.velocity = e.getVelocity();

      this.distance = e.getDistance();

      direction = bearingRadian + me.getHeadingRadians();

      x = me.getX() + Math.sin(direction ) * distance;

      y= me.getY() + Math.cos(direction ) * distance;  

}

Updata方法的参数有两个,第一个为ScannedRobotEvent e,既扫描事件,包含敌人信息,第二个为AdvancedRobotme,包含‘我’的信息,后面遇到的方法基本上都要包含这两个方法,因为robocode战斗无非就是对‘敌人’和‘我’的数据进行处理。

具体操作都很简单,唯一要注意的是:

direction = bearingRadian +me.getHeadingRadians();

有一个direction变量,它是很常用的一个变量,几乎所有的中高级机器人都有用到。见图,在图中,因为目标在机器人heading方向的左边,所bearingRadian变量为负。根据此图不难算得directon = bearingRadian + headingRadian。可见direction就是以自己的机器人为圆心,垂直向上为0度,目标相对自己机

器人的角度。


所以我们完整(完整为暂时的,对于我们以后要讲的第一个高级机器已经足够)的Enemy类为:

public class Enemy {

          public double x,y;

          public Stringname = null;

          public double headingRadian = 0.0D;

          public double bearingRadian = 0.0D;

          public double distance = 1000D;

          public double direction = 0.0D;

          public double velocity = 0.0D;

          public double energy = 100.0D;

          

     public void update(ScannedRobotEvent e,AdvancedRobot me){

             name = e.getName();

             headingRadian =e.getHeadingRadians();

             bearingRadian =e.getBearingRadians();

             this.energy = e.getEnergy();

             this.velocity = e.getVelocity();

             this.distance = e.getDistance();

             direction = bearingRadian +me.getHeadingRadians();

             x = me.getX() + Math.sin(direction) *distance;

             y=  me.getY() + Math.cos(direction ) * distance;     

           }

       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值