⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smog.java

📁 java的机器人大战
💻 JAVA
字号:
package samples;
import AIplatform.event.*;
import AIplatform.robot.*;
import java.awt.geom.Point2D;
/**
 *-----------------------------------------------------------------
 * @author:iiley (iiley@hotmail.com)
 * http://www.robochina.org
 * When i miss her,I fish out a cigarat,smoking deeply,missing deeply....
 * I spit a circle smog,I see she was smileing there
 * 0.1:A replanted Smog from robocode.
 */
public class Smog extends Robot
{
	private double e_energy;
	private double scanedTime;
	private double dir=8d;
	private double nextTime;
	private double absBearing;

    public void onBegin(BeginEvent beginevent)
    {   //初始化
		scanedTime = -10;
    }
	public void work(){
		//雷达锁定
		if(getTime()-scanedTime>8){
			getRadar().turn(Math.PI*2);
		}else{
	    	double radarTurn=standardAngle(absBearing-getRadar().getHeading());
	    	getRadar().turn((radarTurn+(radarTurn>0?0.06d:-0.06d))*1.7d);
		}
	}
    // -------------------- function for event handle ---------------
   	public void onScannedRobot( ScannedRobotEvent e ) {
		scanedTime = getTime();
		absBearing=Math.atan2(e.getY()-getBody().getY(),e.getX()-getBody().getX());
		double edistance=Point2D.distance(e.getX(),e.getY(),getBody().getX(),getBody().getY()); 
		double bearing=absBearing-getBody().getHeading();
		nextTime--;
		//如果移动的时间过了,那么设置速度为0,使自己静止
		if(nextTime<0d){
			getBody().move(0);
		}
		//如果敌人的能量改变了,则说明它可能发射炮弹了,如果此时自己没动,则让自己动一定的时间
		if(e_energy!=(e_energy=e.getEnergy()) && getBody().getVelocity() == 0d){  
				getBody().move((dir=-dir)); 
				double velocity=dir>0?8d:5d;
				nextTime=(30d+edistance/11d*velocity)/velocity;
		}
		//these code is used to around my rival prefer distance 140
		//220=0.5*Math.PI*140,140 is the prefer distance
        edistance=180/edistance;
		getBody().turn(standardAngle(bearing-(getBody().getVelocity()>0?edistance:(Math.PI-edistance))));
  
		//
		double power=Math.min(3,e_energy/5d+0.01);
		//linear aiming
		//直线提前量射击
		getGun().turn(standardAngle(
			absBearing+Math.asin(e.getVelocity()*Math.sin(e.getHeading()-absBearing)/(20d-power*3d))-getGun().getHeading()
		));
		
		getGun().fire(power);
	}
   	public void onHitWall( HitWallEvent e ) {
		getBody().move(0d);
	}
	public void onHitRobot(HitRobotEvent event)
	{
		onHitWall(null);
	}
	
	//把角度规范到-PI到PI之间
	public static double standardAngle( double ang ) {	//get the relative angle where - PI < angle < PI
		return Math.atan2( Math.sin( ang ), Math.cos( ang ) );
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -