请帮我调试一下。谢。
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;
}
}
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;
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货