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]例子target2,雷达与锁定雷达锁定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()方法我们就可得到与地方坦克的距离差了。由于机器人存在着宽和高,可分别用RobocodeAPI中的getWidth()和getHeigth()方法得到。而两个机器人的距离是以双方的中心点为终点。如图所示,L才是它们的距离,A的距离是错误的。与敌方坦克的角度与敌方角度=(getHeading()+e.getBearing())%360;注意:getRadarHeadingRadians()函数,当你调用此函数的时候实际上雷达已经不在刚刚扫描到敌人的那个角度了,他已经转过了十几度甚至更多。雷达默认转动速度是45度/robocode单位时间,实际上一般来说你用getRadarHeadingRadians()得到的值总是45度的整数倍。doublebearing=(getHeading()+e.getBearing())%360;doubledistance=e.getDistance();bearing=Math.toRadians(bearing);doublegenyX=getX()+Math.sin(bearing)*distance;doublegenyY=getY()+Math.cos(bearing)*distance;敌方坦克的位置利用三角函数以及距离,角度和自己的坐标计算地方坦克的位置。注意java的Math.sin和cos使用的是弧度制。例子brawl和killer10003,运动方式运动时注意:碰撞到别的坦克,或者碰撞到边界,都会使自己的速度立减为零,而且会有不同程度的伤害。碰撞:双方0.6伤害.撞墙:1.2伤害如何避免撞墙:doubleheading=getHeadingRadians();//取得bot方向的弧度数doublex=getX()+moveStep*Math.sin(heading);//移动move后将要达到的x坐标doubley=getY()+moveStep*Math.cos(heading);//移动move后将要达到的y坐标doubledWidth=getBattleFieldWidth();//战场的宽度doubledHeight=getBattleFieldHeight();//战场的长度//当(x,y)超过指定的范围,则反向移动moveif(x30||xdWidth-30||y30||ydHeight-30){setBack(moveStep);}主动运动:1,规律运动,绕墙,圆形,弧形,直线等等。2,随机运动,使用Math.random()来定义运动轨迹。3,随机规律运动:前两者结合。被动运动:1,发现敌人开火时,敌人能量减少(0-3)时很有可能已经开炮,此时主动改变运动轨迹。2,被子弹击中时,沿着子弹发射角度垂直运动。3,其他情况(运动情况,敌人剩余能量)例子brawl