robocode自学使用教程.ppt

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Robocode教程 1,坐标系统 2,扫描与锁定 3,运动方式 1,坐标与方向系统 坐标系:Robocode整个坐标系都是战场屏幕以左下角为原点 1绝对方向系:Robocode中不管机器人在哪个方向都是以静态战场屏幕为参照的绝对角度(也即大家说的Heading),正上方为0度角。也即不管Robot,Gun,Radar 向北为0, 向东为90, 向南为180, 向西为270。 heading角,即从Y轴出发,然后顺时针绕回Y轴的这么个角度区间,取值范围: [0,360] 2相对方向系: 相对方向是Robot,Gun,Radar以机器人的动态heading角度为参照的角度差不再以整个静态屏幕为参照了,叫它相对因为机器人的heading是随着机器人移动而不停的在改变,bearing只是个相对物体。 bearing 角,即从Y轴顺、逆时针出发,绕半圈回到Y轴所形成的两个角度区间,取值范围:顺时针[0,180) ;逆时针[0,-180] 例子target 2,雷达与锁定 雷达锁定 1,敌方坦克绝对角度 FBA=FBC+ABC =e.getBearingRadians()+getHeadingRadians() 2,雷达调整角度FBE=FBC-ABE =absEnemyBearing-getRadarHeadingRadians() 3,雷达修正: setTurnRadarRight(FBE*2); 例子brawl 即自己与敌机的连线,与Y轴所成的bearing角,取值范围为[-180,180)。但是计算出来的公式有可能大于这个范围,因此进行绝对化操作: absEnemyBearing=robocode.util.Utils.normalRelativeAngle(FBA) 坐标锁定 如何判断敌人的准确位置? 1,与敌方坦克的距离 2,与敌方坦克的角度 3,自己的坐标 1,与敌方坦克的距离 要得到目标坐标我们首先得知道我们和目标之间的距离。这里的距离探测很简单,只要运用 ScannedRobotEvent 事件中的 e.getDistance() 方法我们就可得到 与地方坦克的距离差了。 由于机器人存在着宽和高 , 可分别用 Robocode API 中的 getWidth() 和 getHeigth() 方法得到。而两个机器人的距离是以双方的中心点为终点。如图所示,L 才是它们的距离,A 的距离是错误的。 与敌方坦克的角度 与敌方角度=(getHeading() + e.getBearing()) % 360; 注意:getRadarHeadingRadians() 函数,当你调用此函数的时候实际上雷达已经不在刚刚扫描到敌人的那个角度了,他已经转过了十几度甚至更多。雷达默认转动速度是 45 度 /robocode 单位时间,实际上一般来说你用 getRadarHeadingRadians() 得到的值总是 45 度的整数倍。 double bearing = (getHeading() + e.getBearing()) % 360; double distance = e.getDistance(); bearing = Math.toRadians(bearing); double genyX = getX() + Math.sin(bearing) * distance; double genyY = getY() + Math.cos(bearing) * distance; 敌方坦克的位置 利用三角函数以及距离,角度和自己的坐标计算地方坦克的位置。注意java的Math.sin和cos使用的是弧度制。例子brawl和killer1000 3,运动方式 运动时注意:碰撞到别的坦克,或者碰撞到边界,都会使自己的速度立减为零,而且会有不同程度的伤害。 碰撞: 双方0.6伤害. 撞墙: 1.2伤害 如何避免撞墙: double heading = getHeadingRadians(); //取得bot方向的弧度数 double x = getX() + moveStep*Math.sin(heading); //移动move后将要达到的x坐标 double y = getY() + moveStep*Math.cos(heading); //移动move后将要达到的y坐标 double dWidth = getBattleFieldWidth(); //战场的宽度 double dHeight = getBattleFieldHeight(); //战场的长度 //当(x,y)超过指定的范围,则反向移动move if(x 30

文档评论(0)

wx171113 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档