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

📄 crazytank.java

📁 以AIROBOT为平台构建的一个智能机器人的java源码。
💻 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 + -