📄 crazytank.java
字号:
/*
该机器人的雷达具有跟踪功能。
该机器人在远离敌人时做无规则运动。
该机器人根据敌人的运动状态提前开枪
*/
package Robot;
import AIRobot.event.*;
import AIRobot.robot.*;
public class CrazyTank extends Robot
{
private double scannedTime;
private double enemyX; //敌人的x坐标
private double enemyY; //敌人的Y坐标
private double velocity; //运动速度
private double enemyVelocity; //敌人运动速度
private double enemyDirection; //敌人车身方向
private double enemyEnergy;//敌人的能量
private double moveTime; //朝一个方向运动的时间
private int bulletPower = 1 ;
private boolean enemyDeath = false;
//执行函数
public void work()
{
doRadar();
if (enemyEnergy == 0)
{
doMove3();
doGun1();
}
else
{
if (distance(getBody().getX(),getBody().getY(),enemyX,enemyY) < 150)
{
doMove3();
doGun3();
}
else
{
doMove1();
doGun1();
}
}
}
//一轮战斗开始
public void onBegin(BeginEvent beginevent)
{ //初始化
scannedTime = -5;
velocity = 8;
moveTime = 25;
}
//扫描到敌人
public void onScannedRobot( ScannedRobotEvent e )
{
scannedTime = e.getTime();
enemyX = e.getX();
enemyY = e.getY();
enemyVelocity = e.getVelocity();
enemyDirection = e.getHeading();
enemyEnergy = e.getEnergy();
// enemyX[posIndex] = e.getX();
// enemyY[posIndex] = e.getY();
// enemyVelocity[posIndex] = e.getVelocity();
// enemyDirection[posIndex] = e.getHeading();
}
//撞到其他机器人
public void onHitRobot( HitRobotEvent e )
{
//运动改变方向
doGun3();
doMove3();
}
//撞到墙
public void onHitWall( HitWallEvent e )
{
//运动改变方向
changeDirection();
}
//被子弹击中
//被敌人击中,改变运动方向
public void onHitByBullet( HitByBulletEvent e )
{
}
public void onRobotDeathEvent( RobotDeathEvent e )
{
enemyDeath = true;
}
/////////////////////////////////////////////////////////////////////
//控制雷达单元
private void doRadar()
{
//雷达锁定
if( getTime() - scannedTime > 3 ) getRadar().turn(Math.PI);
else{
//雷达转向敌人,以实现锁定
double h = heading(getBody().getX(),getBody().getY(),enemyX,enemyY);
double angle = turnAngle(getRadar().getHeading(),h);
getRadar().turn(angle);
}
}
//控制车身单元
private void doMove1()
{
//运动改变方向
if( moveTime-- < 0 ) moveTime = 30;
getBody().move(velocity);
//随机改变运动方向
java.util.Random random = new java.util.Random();
getBody().turn(random.nextFloat() * Math.PI* 2/3-Math.PI/3);
}
private void doMove2()
{
//改变运动方向始终侧对敌人
if( moveTime-- < 0 ) moveTime = 25;
getBody().move(velocity);
double h = heading(getBody().getX(),getBody().getY(),enemyX,enemyY);
double angle = turnAngle(getBody().getHeading(),h + Math.PI/2);
getBody().turn(angle);
}
private void doMove3()
{
//改变运动方向面向敌人运动
if( moveTime-- < 0 ) moveTime = 25;
getBody().move(velocity);
double h = heading(getBody().getX(),getBody().getY(),enemyX,enemyY);
double angle = turnAngle(getBody().getHeading(),h);
getBody().turn(angle);
}
//控制炮管单元
private void doGun1()
{
//炮管转向敌人要到达的位置
double h = heading(getBody().getX(),getBody().getY(),enemyX,enemyY);
double angle = turnAngle(enemyDirection,h);//敌人运动方向与h的夹角
double bulletVelocity = 20 - 3 * 1;//子弹速度
double gunangle = Math.asin( enemyVelocity * Math.sin(angle) / bulletVelocity);
gunangle = h - gunangle ;//提前射击的方向
angle = turnAngle( getGun().getHeading(),gunangle );//提前射击炮口需要转过的角度
getGun().turn(angle);//转炮口
if( !enemyDeath )
{
if ( getEnergy() > 1 ) getGun().fire(1);//开炮(能量1)
else if ( enemyEnergy < 4 )getGun().fire(1);
}
}
private void doGun3()
{
//炮管转向敌人要到达的位置
double h = heading(getBody().getX(),getBody().getY(),enemyX,enemyY);
double angle = turnAngle(enemyDirection,h);//敌人运动方向与h的夹角
double bulletVelocity = 20 - 3 * 3;//子弹速度
double gunangle = Math.asin( enemyVelocity * Math.sin(angle) / bulletVelocity);
gunangle = h - gunangle ;//提前射击的方向
angle = turnAngle( getGun().getHeading(),gunangle );//提前射击炮口需要转过的角度
getGun().turn(angle);//转炮口
if( !enemyDeath )
{
if ( getEnergy() > 3 ) getGun().fire(3);//开炮(能量3)
else if ( enemyEnergy < 6 )getGun().fire(3);
}
}
//改变运动方向
private void changeDirection()
{
moveTime = 50;
velocity = - velocity ;
}
private void changeDirection2()
{
moveTime = 25;
double h = heading(getBody().getX(),getBody().getY(),enemyX,enemyY);
double angle = turnAngle(getBody().getHeading(),h + Math.PI/2);
getBody().turn(angle);
}
/**
* 标准化一个弧度值,使得 0<= angle <2*PI
*/
public static double stdAngle(double angle)
{
while( angle >= 2*Math.PI ) angle -= 2*Math.PI;
while( angle < 0 ) angle += 2*Math.PI;
return angle;
}
/**
* 计算从 from 到 to 的最小转动角度
*/
public static double turnAngle(double from, double to)
{
double turnAngle = stdAngle(to) - stdAngle(from);
if( turnAngle > Math.PI ) turnAngle = turnAngle - 2*Math.PI;
else if( turnAngle < -Math.PI ) turnAngle = turnAngle + 2*Math.PI;
return turnAngle;
}
/**
* 计算两点间的距离
*/
public static double distance(double x1, double y1, double x2, double y2)
{
return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
/**
* 计算两点连线的方向,此方向角在0到PI*2之间
*/
public static double heading(double x1, double y1, double x2, double y2)
{
double heading;
// special check
double distance = distance(x1,y1,x2,y2);
if( distance == 0 ) return 0;
// normal condition
heading = Math.acos((x2-x1)/distance); //一二象限
if( y1 > y2 ) heading = 2 * Math.PI - heading; //三四象限
return heading;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -