简单的瞄准算法之一直接瞄准算法

上一节我们了解了雷达锁定的方法,下面我们就开始研究怎么攻击敌人,在战场中,我们可以通过雷达获取敌人的所有的信息,包括战场的信息,从我们掌握的敌人的信息向敌人发起攻击

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;
	}
	
	
	
	
}

  

posted on 2015-02-13 14:54  aicpcode  阅读(797)  评论(0编辑  收藏  举报

导航