📄 smog.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 + -