JAVA之坦克大战系列9-高效雷达(上)

前言

本篇之前的内容介绍了瞄准策略,让大家明白了如何能让我们的雷达更好的锁定到敌人,本篇将分享给大家一个非常高效的雷达,供大家参考。

主要内容复习

第一, heading 角度系

如图所示,所谓heading角,即从Y轴出发,然后顺时针绕回Y轴的这么个角度区间,取值范围: [0,360]

第二, bearing角度系

所谓bearing 角,即从Y轴顺、逆时针出发,绕半圈回到Y轴所形成的两个角度区间,取值范围:顺时针[0,180) ;逆时针[0,-180]

好的,我们已近复习了两角度系,下面我们来学习这个非常高效的雷达

public void onScannedRobot(ScannedRobotEvent e) {

//注意 这里的计算都以弧度为单位

double absBearing=0d;

//雷达转动角度

double radarTurnAngle=0d;

//得到绝对角度差

absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());

//根据absBearing角算出Radar要调整的角度

radarTurnAngle=Math.sin(absBearing - getRadarHeadingRadians());

//转动雷达,注意是向右

setTurnRadarRightRadians(radarTurnAngle);

}

分析:

说明:

e.getBearingRadians(),如图中的∠FBC所示

是敌机(Enemy)与自己车头方向(你使用setAhead(正值)前进的方向即为车头方向,如BC箭头所示)所成的角,因为是以BC为Y轴的bearing角,所以这个角在这个例子中是个负值。

getHeadingRadians(),如图中∠ABC所示

是以自己的车头方向与屏幕垂直正上方为Y轴所成的heaing角。

absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());

所以absBearing角即为∠FBA,即自己与敌机的连线,与Y轴所成的bearing角,取值范围为[-180,180)。

∠FBE=absBearing - getRadarHeadingRadians(),在这里计算出来为负值。即雷达需要转动的角度。

最后通过Math.sin(absBearing - getRadarHeadingRadians())进行角度修正得到最终值radarTurnAngle。

因为setTurnRadarRightRadians(radarTurnAngle)是向右旋转,所以若radarTurnAngle为负则雷达向左旋转。

下一期将会给大家带来一个具体的实例供大家参考。

好啦,本期内容就到这里喽,我是不会玩游戏却非得写游戏的陈老师,一起来学习JAVA吧!

原文地址:https://www.cnblogs.com/qfchen/p/11321936.html