上一节我们了解了雷达锁定的方法,下面我们就开始研究怎么攻击敌人,在战场中,我们可以通过雷达获取敌人的所有的信息,包括战场的信息,从我们掌握的敌人的信息向敌人发起攻击
package jiaqi;
import robocode.AdvancedRobot;
import robocode.ScannedRobotEvent;
public class MyDemoRobot extends AdvancedRobot{
private double time1 = 0;//扫描到敌人的时间
//机器人自己的方向角
private double heading;
//机器人自己的雷达的角度
private double radarHeading;
//避免雷达失灵问题
private boolean discover = false;//默认是没有发现敌人
//想要得到敌人类中的数据需要持有对象
private Enemy enemy = new Enemy();
//想要得到敌人中的数据必须覆盖雷达事件
@Override
public void onScannedRobot(ScannedRobotEvent event) {
//当雷达扫描到敌人的时候修改Boolean 变量
discover = true;
time1 = getTime();
//取到机器人与敌人的夹角
enemy.setBearing(event.getBearing());
//得到敌人的方向角
enemy.setHeading(event.getHeading());
//得到敌人的速度
enemy.setVelocity(event.getVelocity());
//得到敌人与机器人的距离
enemy.setDistance(event.getDistance());
/**
* 雷达扫描的事件只有,雷达扫描到敌人的时候才能执行,所以需要在run函数
*
* 先旋转雷达,然后执行,因为set方法的函数需要写执行
*
*
*/
}
public void run(){
//第一步:要给机器人一身漂亮的颜色
dressing();
//第二步:要让机器人的车跑和雷达分离,互不影响,高级机器人都这么做
severance();
//让雷达先转一圈,以触发雷达扫描事件
setTurnRadarLeft(400);
execute();
while(true){
if(!discover){
setTurnRadarLeft(400);
execute();
}else{
//第三步,要确定机器人如何移动的算法
movement();
//第四步:要确定机器人如何选择火力的算法
double fire = firePower();
//第五步:要确定机器人如何锁定其他的机器人的算法
doScan();//如果这里重新设置雷达锁定的角度的话会覆盖前面雷达转圈的命令,会失灵,所以在前面要定义一个变量控制
//第六步:要确定机器人如何计算并调整炮口瞄准敌人的算法
gun();
//开枪
if(getGunTurnRemaining() <= 0){//枪旋转剩余的角度
setFire(fire);
execute();//在执行的时候,上面两句话会同时执行,这样枪还没有旋转到敌人的时候就开枪了
}
//判断敌人是不是丢失了
loseTarget();
}
}
}
/**
* 调炮
*/
private void gun() {
//旋转枪
double increment = heading+enemy.getBearing() - getGunHeading();
increment %= 360;
setTurnGunRight(increment);
execute();
}
/**
* 雷达锁定敌人
*/
private void doScan() {
//判断是否扫描到敌人
if(discover){
//计算雷达扫描的角度
heading = this.getHeading();
radarHeading = this.getRadarHeading();
double temp = radarHeading - heading - enemy.getBearing();
//上面得到的角度有异常,需要处理
temp = correctAngle(temp);
//扫描的角度范围大一点
temp *= 1.2;
setTurnRadarLeft(temp);
execute();
}
}
/**
* 选择火力
* @return
*/
private double firePower() {
// TODO Auto-generated method stub
return 0.1;
}
/**
* 移动
*/
private void movement() {
// TODO Auto-generated method stub
}
/**
* 车炮和雷达分离
*/
private void severance() {
// TODO Auto-generated method stub
}
/**
* 打扮
*/
private void dressing() {
// TODO Auto-generated method stub
}
/**
* 处理异常的角度
*
*/
private double correctAngle(double scan){
scan %= 360;//防止出现大于360度的角
if(scan > 180){
scan = -(360-180);//计算出来的角度取负为了让雷达反方向旋转
}
if(scan < -180){
scan = 360+180;
}
return scan;
}
/**
* 判断是不是丢失了敌人
*/
public void loseTarget(){
if((getTime() - time1) >= 4){
discover = false;
}
}
}
===============================================
package jiaqi;
public class Enemy {
private double bearing;//自己与敌人的夹角
private double distance;//与敌人的距离
private double heading;
private double velocity;
public double getBearing() {
return bearing;
}
public void setBearing(double bearing) {
this.bearing = bearing;
}
public double getDistance() {
return distance;
}
public void setDistance(double distance) {
this.distance = distance;
}
public double getHeading() {
return heading;
}
public void setHeading(double heading) {
this.heading = heading;
}
public double getVelocity() {
return velocity;
}
public void setVelocity(double velocity) {
this.velocity = velocity;
}
}