简单的瞄准算法之一直接瞄准算法
上一节我们了解了雷达锁定的方法,下面我们就开始研究怎么攻击敌人,在战场中,我们可以通过雷达获取敌人的所有的信息,包括战场的信息,从我们掌握的敌人的信息向敌人发起攻击
package jiaqi; import robocode.AdvancedRobot; import robocode.ScannedRobotEvent; public class MyDemoRobot extends AdvancedRobot{ private double time1 = 0;//扫描到敌人的时间 //机器人自己的方向角 private double heading; //机器人自己的雷达的角度 private double radarHeading; //避免雷达失灵问题 private boolean discover = false;//默认是没有发现敌人 //想要得到敌人类中的数据需要持有对象 private Enemy enemy = new Enemy(); //想要得到敌人中的数据必须覆盖雷达事件 @Override public void onScannedRobot(ScannedRobotEvent event) { //当雷达扫描到敌人的时候修改Boolean 变量 discover = true; time1 = getTime(); //取到机器人与敌人的夹角 enemy.setBearing(event.getBearing()); //得到敌人的方向角 enemy.setHeading(event.getHeading()); //得到敌人的速度 enemy.setVelocity(event.getVelocity()); //得到敌人与机器人的距离 enemy.setDistance(event.getDistance()); /** * 雷达扫描的事件只有,雷达扫描到敌人的时候才能执行,所以需要在run函数 * * 先旋转雷达,然后执行,因为set方法的函数需要写执行 * * */ } public void run(){ //第一步:要给机器人一身漂亮的颜色 dressing(); //第二步:要让机器人的车跑和雷达分离,互不影响,高级机器人都这么做 severance(); //让雷达先转一圈,以触发雷达扫描事件 setTurnRadarLeft(400); execute(); while(true){ if(!discover){ setTurnRadarLeft(400); execute(); }else{ //第三步,要确定机器人如何移动的算法 movement(); //第四步:要确定机器人如何选择火力的算法 double fire = firePower(); //第五步:要确定机器人如何锁定其他的机器人的算法 doScan();//如果这里重新设置雷达锁定的角度的话会覆盖前面雷达转圈的命令,会失灵,所以在前面要定义一个变量控制 //第六步:要确定机器人如何计算并调整炮口瞄准敌人的算法 gun(); //开枪 if(getGunTurnRemaining() <= 0){//枪旋转剩余的角度 setFire(fire); execute();//在执行的时候,上面两句话会同时执行,这样枪还没有旋转到敌人的时候就开枪了 } //判断敌人是不是丢失了 loseTarget(); } } } /** * 调炮 */ private void gun() { //旋转枪 double increment = heading+enemy.getBearing() - getGunHeading(); increment %= 360; setTurnGunRight(increment); execute(); } /** * 雷达锁定敌人 */ private void doScan() { //判断是否扫描到敌人 if(discover){ //计算雷达扫描的角度 heading = this.getHeading(); radarHeading = this.getRadarHeading(); double temp = radarHeading - heading - enemy.getBearing(); //上面得到的角度有异常,需要处理 temp = correctAngle(temp); //扫描的角度范围大一点 temp *= 1.2; setTurnRadarLeft(temp); execute(); } } /** * 选择火力 * @return */ private double firePower() { // TODO Auto-generated method stub return 0.1; } /** * 移动 */ private void movement() { // TODO Auto-generated method stub } /** * 车炮和雷达分离 */ private void severance() { // TODO Auto-generated method stub } /** * 打扮 */ private void dressing() { // TODO Auto-generated method stub } /** * 处理异常的角度 * */ private double correctAngle(double scan){ scan %= 360;//防止出现大于360度的角 if(scan > 180){ scan = -(360-180);//计算出来的角度取负为了让雷达反方向旋转 } if(scan < -180){ scan = 360+180; } return scan; } /** * 判断是不是丢失了敌人 */ public void loseTarget(){ if((getTime() - time1) >= 4){ discover = false; } } } =============================================== package jiaqi; public class Enemy { private double bearing;//自己与敌人的夹角 private double distance;//与敌人的距离 private double heading; private double velocity; public double getBearing() { return bearing; } public void setBearing(double bearing) { this.bearing = bearing; } public double getDistance() { return distance; } public void setDistance(double distance) { this.distance = distance; } public double getHeading() { return heading; } public void setHeading(double heading) { this.heading = heading; } public double getVelocity() { return velocity; } public void setVelocity(double velocity) { this.velocity = velocity; } }