您当前位置: 圣才学习网首页 >> IT类 >> Java程序设计

Robocode坐标锁定的实现(6)

扫码手机阅读
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
评论(0
   
来源:网络 作者:未知
 
  对比一下上面的数据,不管目标GenyMove在哪GenyRadar都能得到它精确的坐标。是不是有一种成就感!是的,敌人已经完全在我们的掌握之中。即使它在移动中也无法摆脱我们雷达的扫描控制。这里只是很简单举了一些例子,GenyMove 在每一个时间周期(有关时间周期的说明见的 Rock 'em sock 'em Robocode: Round2)移动自己的位置并打印出移动后的坐标,而GenyRadar扫描系统不停的扫描目标,并一直追踪,同时打印出扫描到的GenyMove方位。关键部分在我们的 ScannedRobotEvent事件如列表3
 
  列表3:
 
  public void onScannedRobot( ScannedRobotEvent  e )
 
  {
 
  double heading = e.getBearing() +getHeading();
 
  double distance = e.getDistance(); //求得距离
 
  double ager_bearing = Math.toRadians(heading % 360);  //角度转为弧度
 
  double genyX = getX() + Math.sin(ager_bearing) *  distance;
 
  double genyY = getY() + Math.cos(ager_bearing) *  distance;
 
  out.println("genyX:"+ Math.round(genyX));
 
  out.println("genyY:"+ Math.round(genyY));
 
  = 360 )
 
  heading = heading - 360;
 
  if( heading < 0 )
 
  heading = heading +360;
 
  double bearing = getRadarHeading() - heading;
 
  double radar_degree;
 
  boolean radar_direction;
 
  if( 0 <= bearing && bearing <= 180 )
 
  {
 
  radar_direction = LEFT;
 
  }
 
  else if( bearing <= -180 )
 
  {
 
  radar_direction = LEFT;
 
  bearing = ( 360 + bearing );
 
  }
 
  else if( bearing < 0 )
 
  {
 
  radar_direction = RIGHT;
 
  bearing =( -bearing );
 
  }
 
  else
 
  {
 
  radar_direction = RIGHT;
 
  bearing = (360 - bearing);
 
  }
 
  radar_degree = bearing * 1.3 ; //加大每一时间周期 (tick)的扫描范围
 
  if( radar_direction == RIGHT )
 
  {
 
  setTurnRadarRight( radar_degree );
 
  execute();
 
  }
 
  else
 
  {
 
  setTurnRadarLeft( radar_degree );
 
  execute();
 
  }
 
  我们在代码中首先求得GenyMove的绝对角度,然后用扫描时雷达的绝对角度减去目标GenyMove的角度求得两者的角度差也即我们雷达要旋转的角度。最后利用一个小技巧radar_degree bearing * 1.3 使雷达在目标的范围左右摆动以扩大雷达扫描区域.这样不管目标往哪边移动都在自己的雷达扫描区内。
 
  在此没有进行很详细的讲解了,我想凭你学到的方向及坐标知识很快能明白个中原理并设计出自己的高级扫描机器人来。聪明的你可能会高兴的想,哈,我的炮管用相同的办法锁定目标,这样敌人不就没办法跑了,被我追着打。答案是错误的,雷达的扫描是条长线能直接定位到目标上,它到目标的时间差几乎为零,并且雷达的扫描范围比炮管大且精确。而炮管每时间周期只有20度,它定位目标是依靠着子弹,只有子弹打中了目标,才能说炮管的计算坐标是精确的。但是由于子弹到达目标位置时需要一定的时间差,子弹本身又有速度值(20-3*power ),所以要想炮管锁定目标并让子弹击中目标,我们还得经过精确的计算,并要预测目标可能的行动:是直线前进,还是做圆周运动,还是随机运动等等。这些都是我们要充分考虑的因素。是不是很有挑战性!这一切都在Robocode的世界中等待着您的创造!
 
相关阅读
 
 

小编工资已与此挂钩!一一分钱!求打赏↓ ↓ ↓

如果你喜欢本文章,请赐赏:

已赐赏的人
最新评论(共0条)评论一句