Robocode 直线瞄准机器人

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27344959/article/details/80192556

该方法是直线瞄准算法

使用Walls机器人以及下面算法的机器人

//战场类
package  type.com.xalead;
public class Enemy {
//     public static void main(String[] args ) {
//           Enemy e1 = new Enemy();
//           Enemy e2 = new Enemy();
//           Enemy e3 = new Enemy();
//           Enemy e4 = new Enemy();
//           
//           e1.PI = 3.14159265;
//           System.err.println(e2.PI);
//           Enemy.PI = 333;
//           Enemy.work();
//     }
//     static double PI = 3.14;
//     public static void work(){}
        //attribute
        private double bearing ;
        private double distance = 3000;
        private double heading ;
        private double speed ;
       
       
        public double getSpeed() {
              return speed ;
       }
        public void setSpeed( double speed) {
              this . speed = speed;
       }
        public double getDistance() {
              return distance ;
       }
        public void setDistance( double distance) {
              this . distance = distance;
       }
        public double getHeading() {
              return heading ;
       }
       
        //property
        public void setHeading( double heading) {
              if (!(heading < 0.0)){
                     this . heading = heading;
             }
       }
       
        /**
        * bearing锟斤拷锟斤拷锟斤拷锟�
        * @return
        */
        public double getBearing(){
              return this . bearing ;
       }
        /**
        * bearing锟斤拷锟斤拷锟�
        * @param bearing
        */
        public void setBearing( double bearing){
              this . bearing = bearing;
       }
}

//测试机器人
package  type.com.xalead;
import java.awt.geom.Point2D;
import robocode.AdvancedRobot;
import robocode.Rules;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
public class TestRobot extends AdvancedRobot {
        public static void main(String[] args) {
              // double a = Math.tan(Math.toRadians(135));
              // System.err.println(a);
              // double a = Math.toDegrees(Math.atan2(10, -10));
              // System.err.println(a);
             System. out .println(Math. random ());
       }
        private double time1 = 0;
        private Enemy enemy = new Enemy();
        private boolean discover = false ;
        private double heading = 0.0;
        private double radarHeading = 0.0;
        private double bPower = 3;
        private double time = 0;
        private double distance = 3000;
        @Override
        public void onScannedRobot(ScannedRobotEvent e) {
              discover = true ;
              preTime = time1 ;
              time1 = getTime();
              enemy .setBearing(e.getBearingRadians());
              enemy .setSpeed(e.getVelocity());
              enemy .setDistance(e.getDistance());
              preHeading = enemy .getHeading();
              enemy .setHeading(e.getHeadingRadians());
              time = distance / Rules. getBulletSpeed ( bPower );
       }
             //装饰方法
        private void dressing() {
       }
              //旋转方法
        private void severance() {
             setAdjustGunForRobotTurn( true );
             setAdjustRadarForGunTurn( true );
       }
             //简单移动的方法
        private void simpleMove() {
              double increment = 0;
              if ( enemy .getBearing() > 0) {
                    increment = Math. PI / 2 - enemy .getBearing();
                    setTurnLeftRadians(increment);
             } else {
                    increment = Math. PI / 2 + enemy .getBearing();
                    setTurnRightRadians(increment);
             }
             setAhead(1000);
       }
        private double safDis = 100;//安全距离
       //高级移动方法
        private void movement() {
              if (getDistanceRemaining() < 1) {
                     double nx = 0;
                     double ny = 0;
                    nx = Math. random () * (getBattleFieldWidth() - 2 * safDis ) + safDis ;
                    ny = Math. random () * (getBattleFieldHeight() - 2 * safDis ) + safDis ;
                     double headArg = 90 - Math. atan2 (ny - getY(), nx - getX());
                    headArg = Utils. normalAbsoluteAngle (headArg);
                     double dis = Point2D. distance (getX(), getY(), nx, ny);
                     if (headArg - getHeadingRadians() > Math. PI / 2) {
                           setTurnRightRadians(headArg - getHeadingRadians() + Math. PI );
                           setAhead(-dis);
                    } else {
                           setTurnRightRadians(headArg - getHeadingRadians());
                           setAhead(dis);
                    }
             }
       }
        private void doScan() {
              if ( discover ) {
                     heading = this .getHeadingRadians();
                     radarHeading = this .getRadarHeadingRadians();
                     double temp = radarHeading - heading - enemy .getBearing();
                    temp = Utils. normalRelativeAngle (temp);
                    temp *= 1.2;
                    setTurnRadarLeftRadians(temp);
             }
       }
        private double firePower() {
              return bPower ;
       }
        /**
        * 
        */
        private double immidate() {
              double increment = heading + enemy .getBearing()
                           - getGunHeadingRadians();
             increment %= 2 * Math. PI ;
             increment = Utils. normalRelativeAngle (increment);
              return increment;
       }
        /**
        * 开枪
        */
        private void gun() {
              // double increment = immidate ();
              double increment = line();
             setTurnGunRightRadians(increment);
       }
       
        private double   preHeading = 0.0; //锟斤拷锟斤拷
        private double preTime = 0.0; //前一锟斤拷时锟斤拷
       
        /*
       *曲线射击
       */
        private double circle(){
              double t = 0.0;
              double ea = Utils. normalAbsoluteAngle (getHeadingRadians() + enemy .getBearing());
              double ex = getX() + enemy .getDistance() * Math. sin (ea);
              double ey = getY() + enemy .getDistance() * Math. cos (ea);
              double offsetHeading = enemy .getHeading() - preHeading ;
              double dv = offsetHeading /( time1 - preTime );
              if (Math. abs (dv)<0.00001){
                    dv+=0.00001;
             }
              double r = enemy .getSpeed()/dv;
              double preDistance= enemy .getDistance();
              for ( int i = 0; i<8;i++){
              double bulletTime = preDistance / Rules. getBulletSpeed ( bPower );
              double nextHeading = enemy .getHeading()+dv*bulletTime;
              double nextx = ex + r * Math. cos ( enemy .getHeading())- r * Math. cos (nextHeading);
              double nexty = ey + r * Math. sin (nextHeading)- r * Math. cos ( enemy .getHeading());
             preDistance = Point2D. distance (getX(), getY(),nextx, nexty);
             t = Math. atan2 (nexty - getY(), nextx - getX());
       }
              return Utils. normalRelativeAngle ((Math. PI / 2 - t - getGunHeadingRadians())
                           % (2 * Math. PI ));   
       }
        /**
        * 直线射击
        *
        * @return
        */
        private double line() {
              double ea = Utils. normalAbsoluteAngle (getHeadingRadians() + enemy .getBearing());
              double ex = getX() + enemy .getDistance() * Math. sin (ea);
              double ey = getY() + enemy .getDistance() * Math. cos (ea);
              double s = 0;
              if ( enemy .getSpeed() >= Rules. MAX_VELOCITY - 0.1) {
                    s = enemy .getSpeed() * time ;
             } else if ( enemy .getSpeed() > 0.0) {
                     double as = (Math. pow (Rules. MAX_VELOCITY , 2) - Math. pow (
                                  enemy .getSpeed(), 2))
                                 / 2 * Rules. ACCELERATION ;
                     double vs = ( time - (Rules. MAX_VELOCITY - enemy .getSpeed())
                                 / Rules. ACCELERATION )
                                 * Rules. MAX_VELOCITY ;
                    s = as + vs;
             } else {
                    s = 0.0;
             }
              double nextx = ex + s * Math. sin ( enemy .getHeading());
              double nexty = ey + s * Math. cos ( enemy .getHeading());
              distance = Point2D. distance (getX(), getY(), nextx, nexty);
              double t = Math. atan2 (nexty - getY(), nextx - getX());
              return Utils. normalRelativeAngle ((Math. PI / 2 - t - getGunHeadingRadians())
                           % (2 * Math. PI ));
       }
        public void run() {
       
             dressing();
       
             severance();
             
              // setTurnRadarLeft(400);
              // execute();
              while ( true ) {
                     if (! discover ) {
                           setTurnRadarLeftRadians(Math. PI * 2.1);
                           execute();
                    } else {
                           
                           movement();
                           
                            double fire = firePower();
                    
                           doScan();
                           
                           gun();
                            // if (getGunTurnRemaining() <= 0) {
                    
                           setFire(fire);
                           execute();
                            // }
                           
                           loseTarget();
                           execute();
                    }
             }
       }
        private void loseTarget() {
              if ((getTime() - time1 ) >= 4)
                     discover = false ;
       }
}
运行界面:

运行结果:



猜你喜欢

转载自blog.csdn.net/qq_27344959/article/details/80192556