⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ourrobot.java

📁 一个Robot对战的小程序,混战时有优势
💻 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 + -