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;     

           }

       }

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Robocode是一款简易的编程游戏,通过编写代码来控制机器人进行战斗。在游戏中,你可以创建自己的机器人,并且通过寻找对手、进行攻击和躲避攻击来实现胜利。 Robocode的规则非常简单,每个机器人都有一定数量的能量和生命值,可以通过攻击敌人来消耗能量和减少敌人的生命值。在游戏中,机器人可以通过不同的指令进行移动、转向、攻击等操作。 为了编写自己的机器人代码,你需要了解一些基本的编程知识,比如控制流程、函数、变量等。你可以使用Java或C#等编程语言来编写代码,并且可以使用Robocode提供的API来获取机器人的状态、执行操作等。 Robocode提供了一个交互式的开发环境,可以让你实时查看机器人的行为和效果。你可以在游戏中创建不同的对手,并且通过观察它们的行为和战斗结果来改进自己的机器人策略。 Robocode的简易性使它成为一个很好的学习工具,无论是初学者还是有一定编程经验的人都可以通过它来提高他们的编程能力和理解。此外,Robocode还有一个活跃的社区,你可以与其他玩家分享你的机器人并与他们进行比赛。 总而言之,Robocode是一个开放、简易但富有挑战性的编程游戏,你可以通过编写机器人代码来进行战斗并提升自己的编程技能。无论是学习还是娱乐,它都是一个有趣和有价值的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值