Robocode教程5——Enemy类

摘自:http://site.douban.com/widget/notes/7736245/note/210927888/

 

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 String name;//敌人名字
        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,既扫描事件,包含敌人信息,第二个为AdvancedRobot me,包含‘我’的信息,后面遇到的方法基本上都要包含这两个方法,因为robocode战斗无非就是对‘敌人’和‘我’的数据进行处理。
具体操作都很简单,唯一要注意的是:
direction = bearingRadian + me.getHeadingRadians(); 
有一个direction变量,它是很常用的一个变量,几乎所有的中高级机器人都有用到。见图,在图中,因为目标在机器人heading方向的左边,所bearingRadian变量为负。根据此图不难算得 directon = bearingRadian + headingRadian。可见direction就是以自己的机器人为圆心,垂直向上为0度,目标相对自己机
器人的角度。

 


所以我们完整(完整为暂时的,对于我们以后要讲的第一个高级机器已经足够)的Enemy类为:
public class Enemy {
                    public double x,y;
                    public String name = 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; 
                }
            }

posted @ 2012-06-21 16:42  KeenLeung  阅读(821)  评论(0编辑  收藏  举报