📄 ourrobot.java
字号:
package zxcRobot;
import robocode.*;
import java.awt.Color;
/**
* OurRobot - 一个由郑鑫琛,林朗,陈寿聪做的机器人
*/
public class OurRobot extends AdvancedRobot
{
Enemy target;
/**
* 代表对手,包括了对手的所有有用参数
*/
private static final double mPI = Math.PI; /* 静态参数 */
private int direction = 1; /* 我们坦克车头的方向:前进 = 1,后退 = -1 */
private double firePower; /* 设置我们的火力 */
private double radarOffset;
/**
* run: OurRobot的预设参数
*/
public void run() /* 在试验我们的机器人后, 尝试注释以上的输入程序 */
{
target = new Enemy(); /* 实例化Enemy()类 */
target.distance = 10000; /* 初始化距离以便选择目标 */
//设置颜色
setColors( Color.blue, new Color( 255 , 175 , 175 ), new Color( 0 , 0 , 0 ) );
setBulletColor( new Color( 255 , 0 , 255 ) );
setAdjustGunForRobotTurn( true );
setAdjustRadarForGunTurn( true );
setAdjustRadarForRobotTurn( true );
turnRadarRightRadians( 2*mPI ); /* 以弧度计算旋转一周 */
while( true ) {
moveRobot(); /* 移动机器人 */
chFirePower(); /* 选择火力 */
scanEnemy(); /* 扫描 */
moveGun(); /* 预测敌人,调整炮管 */
if ( getGunHeat() == 0 )
{
fire( firePower ); /* 所有动作完成后,开火 */
}
execute(); /* 上面使用的都为AdvancedRobot类中的非阻塞调用 */
/* 控制权在我们,所有这里用阻塞方法返回控制给机器人 */
}
}
/**
* 选择火力
*/
void chFirePower()
{
firePower = 400 / target.distance; /* 根据敌人距离来选择火力 */
if (firePower > 3)
firePower = 3;
}
/**
* 机器人移动方法
*/
void moveRobot()
{
if ( getTime() % 30 == 0 ) /* 过30的倍数时间就反转方向 */
{
//every twenty 'ticks'
direction *= -1; /* 改变方向 */
setAhead( direction * 300 ); /* 按这个方向移动 */
}
setTurnRightRadians( target.bearing + ( mPI / 2 ) );
/* 每一时间周期以敌人为中心绕圆运动 */
}
/**
* 扫描敌人的方法,调整雷达角度
*/
void scanEnemy()
{
if ( getTime() - target.ctime > 4 ) /* 来回扫了4个回合都没扫到意味失去了目标,
* 再全扫一遍 */
{
/* 如果没看见任何目标 */
radarOffset = 360; /* 旋转雷达以找到目标 */
}
else
{
/* 通过扫描决定雷达旋转的弧度,雷达弧度-敌人角度得到两者相差为旋转值 */
radarOffset = getRadarHeadingRadians() - absbearing( getX() , getY() , target.x , target.y );
/* 在得到的角度中加或减一点角度,让雷达很小的范围内摆而不失去目标 */
if ( radarOffset < 0 )
radarOffset -= mPI/8;
else
radarOffset += mPI/8;
}
/* 转动雷达 */
setTurnRadarLeftRadians( NormaliseBearing( radarOffset ) );
/* 左转调整转动角度到mPI内 */
}
/**
* 调整炮管角度,
*/
void moveGun()
{
/*计算子弹到达目标的时间长speed = 20 - 3 * power;
*有计算公式,距离除速度=时间
*/
long time = getTime() + ( int )( target.distance / ( 20 - ( 3 * firePower ) ) );
/* 以直线为目标,偏移子弹下一次发射的角度
*(这样让子弹射空的几率减少。但对付不动的和做圆运动的机器人有问题) */
/*target.guesssX(),target.guessY()为目标移动后的坐标 */
double gunOffset = getGunHeadingRadians() - absbearing( getX() , getY() , target.guessX( time ) , target.guessY( time ) );
setTurnGunLeftRadians( NormaliseBearing( gunOffset ) );
/* 调整相对角度到2mPI内 */
}
/**
* 这是有关帮助的方法.你能找到一些很有用的地方
* 它们包括了如何获得指向一个点的角度
*/
/**
* 如果bearing不在-mPI到mPI角度范围内, 改变它到最小角度
*/
double NormaliseBearing( double ang )
{
if ( ang > mPI )
ang -= 2 * mPI;
if ( ang < -mPI )
ang += 2 * mPI;
return ang;
}
/**
* 如果heading不在0到2mPI角度范围内,改变它到最小角度
*/
double NormaliseHeading( double ang )
{
if ( ang > 2 * mPI )
ang -= 2 * mPI;
if ( ang < 0 )
ang += 2 * mPI;
return ang;
}
/**
* 以两边长求得与对手之间的距离
*/
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;
}
/**
* 根据x,y的坐标求出绝对角度,利用直角坐标系来反求出角度
*/
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 )
{
/*反正弦定义,对边除斜边得弧度.以robocode中的绝对方向系及坐标系参照 */
/* x,y为正右上角为0-90,x正y负右下角为90-180,x,y负左下角180-270,x负,
* y正右上角270-360
*/
return Math.asin( xo / h );
}
if( xo > 0 && yo < 0 )
{
return Math.PI - Math.asin( xo / h ); /* x为正,y为负第二象限角 */
}
if( xo < 0 && yo < 0 )
{
return Math.PI + Math.asin( -xo / h ); /* 第三象限内180+角度 */
}
if( xo < 0 && yo > 0 )
{
return 2.0*Math.PI - Math.asin( -xo / h ); /* 四象限360-角度 */
}
return 0;
}
/**
* onScannedRobot:当你看见另外的机器人所采取的行动
*/
public void onScannedRobot( ScannedRobotEvent e )
{
if ( ( e.getDistance() < target.distance ) || ( target.name == e.getName() ) )
{
/* 求得对手的绝对弧度 */
double absbearing_rad = ( getHeadingRadians() + e.getBearingRadians() ) % ( 2 * mPI );
/* 这部分设置了所有对手的信息 */
target.name = e.getName();
/* 求得对手的x,y坐标 */
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();
}
}
public void onRobotDeath( RobotDeathEvent e )
{
if ( e.getName() == target.name )
target.distance = 10000; /* 有效的寻找新对手 */
}
/**
* onHitByBullet:当被子弹击中时的反映
* 子弹碰撞 躲闪 同时打击
*/
public void onHitByBullet( HitByBulletEvent e )
{
/*子弹碰撞 躲闪 同时打击 */
setTurnLeft( 90 - e.getBearing() );
setTurnRadarRight( 90 + e.getBearing() );
setFire( 3 );
execute();
}
/**
* 子弹打空 减小火力
*/
public void onBulletMissed( BulletMissedEvent e )
{
/* 子弹打空 减小火力 */
setTurnRadarRight( 360 );
setTurnRadarRight( 360 );
setFire( 1 );
execute();
}
/**
* 打击成功 锁定打击
*/
public void onBulletHit( BulletHitEvent e )
/*打击成功 锁定打击 */
{
setFire( 3 );
setTurnRadarRight( getRadarHeading() - getGunHeading() );
}
/**
* onHitWall:当撞到墙时的动作
* 撞墙 转 躲闪
*/
public void onHitWall( HitWallEvent e )
{
/* 撞墙 转 躲闪 */
setTurnRight( 90 );
setTurnRight( 60 );
setAhead( 100 );
execute();
}
/**
* onHitRobot:当撞到其他坦克后的动作
* 撞架 躲闪
*/
public void onHitRobot( HitRobotEvent e )
{
/* 撞架 躲闪 */
setBack( 100 );
setTurnLeft( 90 );
setAhead( 100 );
}
}//end class OurRobot
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -