📄 new2.java
字号:
package lucky;
import robocode.*;
//import java.awt.Color;
public class New2 extends AdvancedRobot
{
enemyStat enemy= new enemyStat();
boolean noTarget=true;
public void run()
{
doInit();
while(true)
{
if(noTarget)
{
setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
execute();
}
else
{
doScan();
noTarget = true;
if(enemy.changeEnergy>0&&enemy.changeEnergy<=3||enemy.distance<100&&Math.random()>0.1)
doMove();
doFire();
execute();
}
}
}
public void onScannedRobot(ScannedRobotEvent e)
{
noTarget=false;
enemy.update(e,this);
}
public void onHitByBullet(HitByBulletEvent e)
{
// turnLeft(90 - e.getBearing());
}
public void doInit()
{
setAdjustGunForRobotTurn(true);
setAdjustRadarForGunTurn(true);
}
public void doScan()
{
double radarOffset;
radarOffset=enemy.normal(enemy.dir-getRadarHeadingRadians());
setTurnRadarRightRadians(1.2*radarOffset);
}
public void doMove()
{
double moveX,moveY,angleA;
int trytime=0,timer=-1,moveDir=1;
if(timer<0)
{
timer=(int)(enemy.distance/10);
do
{
moveX=Math.random()*325+225;
moveY=Math.random()*225+225;
trytime++;
angleA=Math.abs(enemy.heading(getX(),getY(),moveX,moveY)-enemy.heading(getX(),getY(),enemy.X,enemy.Y));
}
while(enemy.distance(moveX,moveY,enemy.X,enemy.Y)<300&&trytime<20&&(angleA<Math.PI/3||angleA>Math.PI/3*2));
double turnAngle = enemy.getAngle( getX(), getY(),moveX, moveY );
turnAngle=enemy.normal(turnAngle-getHeadingRadians());
/* if ( Math.abs( turnAngle ) > Math.PI/2 )
{
turnAngle=enemy.normal(turnAngle + Math.PI );
moveDir = -1;
}*/
setTurnRightRadians( turnAngle );
setAhead(enemy.distance( getX(), getY(),moveX, moveY )*moveDir);
trytime=0;
timer--;
}
}
public void doFire()
{
double power=3;
double vbullet=20-3*power;
double headingOffset =enemy.headingRadian - enemy.prevHeadingRadian + 0.00001;
double r = enemy.velocity / headingOffset;
double predictDirection = 0.0D;
double enemyDistance = enemy.distance;
for ( int i=0; i<4; i++ )
{
double bulletTravelTime = enemyDistance /vbullet;
double predictX, predictY;
double predictHeadingRadian =enemy.headingRadian + headingOffset * bulletTravelTime;
predictX = enemy.X - r * Math.cos(predictHeadingRadian )+ r * Math.cos( enemy.headingRadian );
predictY = enemy.Y + r * Math.sin(predictHeadingRadian )- r * Math.sin( enemy.headingRadian );
predictDirection =enemy.getAngle( getX(), getY(), predictX, predictY );
enemyDistance =enemy.distance(getX(), getY(), predictX, predictY );
}
double gunOffset;
gunOffset = enemy.normal(predictDirection - getGunHeadingRadians() );
setTurnGunRightRadians( gunOffset );
if ( getGunHeat() == 0 )
setFire( power );
}
}
class enemyStat
{
public double dir=0;
public double distance=500;
public double X;
public double Y;
public double velocity=8;
public double headingRadian=0;
public double prevHeadingRadian=0;
public double Energy=100;
public double changeEnergy=0;
public double normal(double angle)
{
if(angle<-Math.PI)
angle+=2*Math.PI;
if(angle>Math.PI)
angle-=2*Math.PI;
return angle;
}
public double distance(double x1,double y1,double x2,double y2)
{
return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
public double getAngle(double x1,double y1,double x2,double y2)
{
return Math.atan2( x2 - x1, y2 - y1 );
}
public double heading(double x1, double y1, double x2, double y2)
{
double heading;
double distance2 = distance(x1,y1,x2,y2);
if( distance2 == 0 ) return 0;
heading = Math.acos((x2-x1)/distance2); //一二象限
if( y1 > y2 ) heading = 2*Math.PI - heading; //三四象限
return heading;
}
public void update(ScannedRobotEvent e,AdvancedRobot ar)
{
prevHeadingRadian = headingRadian;
changeEnergy=Energy-e.getEnergy();
Energy=e.getEnergy();
distance=e.getDistance();
velocity = e.getVelocity();
dir=e.getBearingRadians()+ar.getHeadingRadians();
headingRadian = e.getHeadingRadians();
X=ar.getX() + Math.sin( dir) * distance;
Y=ar.getY() + Math.cos( dir) * distance;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -