请帮我调试一下。谢。
package test; 
import robocode.*; 
import java.awt.Color; 
public class test extends AdvancedRobot{ 
double movementDirection=1;//定义躲避时的方向 
double previousEnergy = 100;//定义敌人的初始能量值 
Enemy target;//定义敌人 
final double PI = Math.PI;//创建常量PI 
int direction = 1; //向前方向值为1,向后为-1 
double firePower;//定义开火时使用的火力 
public void run() { 
target = new Enemy();//创建一个敌人的实例 
target.distance = 100000; //初始化敌人的距离,以便选择目标 
setBodyColor(Color.white);//设置坦克主体的颜色 
setGunColor(Color.white);//设置炮管的颜色 
setRadarColor(Color.white);//设置雷达的颜色 
setBulletColor(Color.white);//设置子弹的颜色 
setScanColor(Color.white);//设置雷达扫描区域的颜色 
setAdjustGunForRobotTurn(true);//使枪和坦克独立开 
setAdjustRadarForGunTurn(true);//使枪和雷达独立开 
turnRadarRightRadians( 2 * PI); //使雷达转过一圈看是否有别的坦克
//此处的避墙功能没做完 
/*addCustomEvent(new Condition("NearWall"){ 
public boolean test(){ 
if((getX()<=50)||(getX()>=getBattleFieldWidth()-50)||(getY()<=50)||(getY()>getBattleFieldHeight()-50)){ 
out.println("true"); 
return true; 
}else{ 
out.println("false"); 
return false; 

}; 
});*/ 
while(true){ 
doMovement(); //移动坦克 
doFirePower();//选择适当的火力 
doScanner(); //扫描别的坦克
 
doGun(); //把枪移动到敌人预计会出现的地方 
//out.println(target.distance); 
fire(firePower);//根据距离选择火力并开火 
execute(); //执行以上所有的命令 


 
void doFirePower(){ 
firePower = 400/target.distance;//基于目标的远近程度改变子弹的能量 

void doMovement(){ 
if (getTime()%20 == 0) { 
//每20个时间间隔执行一次 
direction *= -1; //反向运动 
setAhead(direction*300); //前后运动 

setTurnRightRadians(target.bearing + (PI/2)); 

void doScanner() { 
double radarOffset; 
if (getTime() - target.ctime > 4){ 
//如果4秒内在小区域中没有发现目标 
radarOffset = 360; //雷达转一圈寻找目标 
}else{ 
radarOffset = getRadarHeadingRadians() - absbearing(getX(),getY(),target.x,target.y);//找到目标后使搜索范围扩大以至于不丢失目标 
 
if (radarOffset < 0){ 
radarOffset -= PI/8; //稍稍增大扫描区域 
}else{ 
radarOffset += PI/8; //稍稍增大扫描区域 


setTurnRadarLeftRadians(NormaliseBearing(radarOffset)); //旋转雷达 

void doGun(){ 
//基于速度公式speed = 20 - 3 * power 
long time = getTime() + (int)(target.distance/(20-(3*firePower))); 
//猜测目标下一步的X.Y坐标值 
double gunOffset = getGunHeadingRadians() - absbearing(getX(),getY(),target.guessX(time),target.guessY(time)); 
setTurnGunLeftRadians(NormaliseBearing(gunOffset)); 

double NormaliseBearing(double ang) { 
if (ang > PI) 
ang -= 2*PI; 
if (ang < -PI) 
ang += 2*PI;
return ang; 

//如果角度大于360度,则让它减去360,得到标准化的角度 
double NormaliseHeading(double ang){ 
if (ang > 2*PI){ 
ang -= 2*PI; 

if (ang < 0){ 
ang += 2*PI; 

return ang; 

//确定目标的X,Y坐标 
public double getrange( double x1,double y1, double x2,double y2 ){ 
double xo = x2-x1; 
double yo = y2-y1; 
double h = Math.sqrt( xo*xo + yo*yo ); 
return h; 

//用来确定绝对位置的方法 
public double absbearing( double x1,double y1, double x2,double y2 ){ 
double xo = x2-x1; 
double yo = y2-y1; 
double h = getrange( x1,y1, x2,y2 ); 
if( xo > 0 && yo > 0 ){ 
return Math.asin( xo / h ); 

if( xo > 0 && yo < 0 ){ 
return Math.PI - Math.asin( xo / h ); 

if( xo < 0 && yo < 0 ){ 
return Math.PI + Math.asin( -xo / h ); 

if( xo < 0 && yo > 0 ){ 
return 2.0*Math.PI - Math.asin( -xo / h ); 

return 0; 

public void onScannedRobot(ScannedRobotEvent e) { 
if ((e.getDistance() < target.distance)||(target.name == e.getName())) { 
double absbearing_rad = (getHeadingRadians()+e.getBearingRadians())%(2*PI);//确定坦克的绝对位置 
//下面定义该坦克的相关信息 
target.name = e.getName(); 
target.x = getX()+Math.sin(absbearing_rad)*e.getDistance(); //计算目标的X坐标 
target.y = getY()+Math.cos(absbearing_rad)*e.getDistance(); //计算目标的Y坐标 
target.bearing = e.getBearingRadians();//设置
 
target.head = e.getHeadingRadians();//获得坦克头的方向 
target.ctime = getTime(); //记录扫描时间 
target.speed = e.getVelocity(); //记录目标的速度 
target.distance = e.getDistance();//记录目标离自己的距离 

//如果对手的能量变化在0-3之间,坦克向别处移动一点点来躲避子弹 
double changeInEnergy =previousEnergy-e.getEnergy(); 
if (changeInEnergy>0 &&changeInEnergy<=3) { 
movementDirection =-movementDirection;//反向躲避 
setAhead((e.getDistance()/4+25)*direction);//移动微小的距离 

previousEnergy = e.getEnergy();//初始化对手的能量 

public void onRobotDeath(RobotDeathEvent e) { 
if (e.getName() == target.name){ 
target.distance = 10000; //设置搜索坦克的初始距离 


//此处的避墙功能没做完 
/*public void onCustomEvent(CustomEvent event){ 
if (event.getCondition().getName().equals("NearWall")) { 
double centery = getBattleFieldHeight() / 2; 
double centerx = getBattleFieldWidth() / 2; 
double nowx=getX(); 
double nowy=getY(); 
double turnToCenter = absbearing(nowx,nowy,centerx,centery); 
setTurnLeftRadians(NormaliseBearing(turnToCenter)); 
out.println(NormaliseBearing(turnToCenter)); 
setAhead(200); 
execute(); 
removeCustomEvent(event.getCondition()); 
}; 
}*/ 

//创建了一个代表敌人的类,用来保存对手的相关信息
class Enemy{ 
String name;//定义坦克的名字 
//以下定义敌人的各项参数,以便预测敌人走向,实行打击 
public double bearing; 
public double head; 
public long ctime; //记录扫描到该坦克的时间 
public double speed; 
public double x,y; 
public double distance; 
public double guessX(long when){ 
long diff = when - ctime; 
return x+Math.sin(head)*speed*diff; 

public double guessY(long when){
long diff = when - ctime; 
return y+Math.cos(head)*speed*diff; 

}