zoukankan      html  css  js  c++  java
  • 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; 
                    }
                }

  • 相关阅读:
    正则表达式---用户验证
    最短路 Dijkstra
    最短路 Dijkstra+堆优化
    LCIS(最长公共上升子序列)
    最小生成树 Kruskal
    网络流 最大流
    网络流 最小费用最大流
    树链剖分
    树状数组
    双重Hash
  • 原文地址:https://www.cnblogs.com/KeenLeung/p/2557954.html
Copyright © 2011-2022 走看看