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

📄 new2.java

📁 ROBOCODE平台上的一个智能机器人。采用随机移动、圆周预测瞄准策略
💻 JAVA
字号:
package lucky;
import robocode.*;
//import java.awt.Color;

public class New2 extends AdvancedRobot
{
	enemyStat enemy= new enemyStat();
	boolean noTarget=true;
	public void run() 
	{
		doInit();
		while(true)
		{
			if(noTarget)
			{
				setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
				execute();
			}
			else
			{
				doScan();
				noTarget = true;
				if(enemy.changeEnergy>0&&enemy.changeEnergy<=3||enemy.distance<100&&Math.random()>0.1)
				doMove();
				doFire();
				execute();
			}
		}
	}
	public void onScannedRobot(ScannedRobotEvent e) 
	{
		noTarget=false;
		enemy.update(e,this);
	}
	public void onHitByBullet(HitByBulletEvent e) 
	{
	//	turnLeft(90 - e.getBearing());
	}
	public void doInit()
	{
		setAdjustGunForRobotTurn(true);
		setAdjustRadarForGunTurn(true);
	}
	public void doScan()
	{
		double radarOffset;
		radarOffset=enemy.normal(enemy.dir-getRadarHeadingRadians());
		setTurnRadarRightRadians(1.2*radarOffset);
	}
	public void doMove()
	{
		double moveX,moveY,angleA;
		int trytime=0,timer=-1,moveDir=1;
		if(timer<0)
		{
			timer=(int)(enemy.distance/10);
			do
			{
				moveX=Math.random()*325+225;
				moveY=Math.random()*225+225;
				trytime++;
				angleA=Math.abs(enemy.heading(getX(),getY(),moveX,moveY)-enemy.heading(getX(),getY(),enemy.X,enemy.Y));
			}
			while(enemy.distance(moveX,moveY,enemy.X,enemy.Y)<300&&trytime<20&&(angleA<Math.PI/3||angleA>Math.PI/3*2));
			double turnAngle = enemy.getAngle( getX(), getY(),moveX, moveY );
			turnAngle=enemy.normal(turnAngle-getHeadingRadians());
		/*	if ( Math.abs( turnAngle ) > Math.PI/2 )
			{
				turnAngle=enemy.normal(turnAngle + Math.PI );
				moveDir = -1;
			}*/
			setTurnRightRadians( turnAngle );
			setAhead(enemy.distance( getX(), getY(),moveX, moveY )*moveDir);
			trytime=0;
			timer--;
		}
	}
	public void doFire()
	{
		double power=3;
		double vbullet=20-3*power;
		double headingOffset =enemy.headingRadian - enemy.prevHeadingRadian + 0.00001;
		double r = enemy.velocity / headingOffset;
		double predictDirection = 0.0D;
		double enemyDistance = enemy.distance;
		for ( int i=0; i<4; i++ )
		{
			double bulletTravelTime = enemyDistance /vbullet;
			double predictX, predictY;
			double predictHeadingRadian =enemy.headingRadian + headingOffset * bulletTravelTime;
			predictX = enemy.X - r * Math.cos(predictHeadingRadian )+ r * Math.cos( enemy.headingRadian );
			predictY = enemy.Y + r * Math.sin(predictHeadingRadian )- r * Math.sin( enemy.headingRadian );
			predictDirection =enemy.getAngle( getX(), getY(), predictX, predictY );
			enemyDistance =enemy.distance(getX(), getY(), predictX, predictY );
		}
		double gunOffset;
		gunOffset = enemy.normal(predictDirection - getGunHeadingRadians() );
		setTurnGunRightRadians( gunOffset );
		if ( getGunHeat() == 0 )
			setFire( power );
	}
}
class enemyStat
{
	public double dir=0;
	public double distance=500;
	public double X;
	public double Y;
	public double velocity=8;
	public double headingRadian=0;
	public double prevHeadingRadian=0;
	public double Energy=100;
	public double changeEnergy=0;
	public double normal(double angle)
	{
		if(angle<-Math.PI)
			angle+=2*Math.PI;
		if(angle>Math.PI)
			angle-=2*Math.PI;
		return angle;
	}
	public double distance(double x1,double y1,double x2,double y2)
	{
		return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	}
	public double getAngle(double x1,double y1,double x2,double y2)
	{
		return Math.atan2( x2 - x1, y2 - y1 );
	}
    public double heading(double x1, double y1, double x2, double y2)
    {
    	double heading;
        double distance2 = distance(x1,y1,x2,y2);
        if( distance2 == 0 ) return 0;
		heading = Math.acos((x2-x1)/distance2); //一二象限
	    if( y1 > y2 ) heading = 2*Math.PI - heading; //三四象限
        return heading;
    }
	public void update(ScannedRobotEvent e,AdvancedRobot ar)
	{
		prevHeadingRadian = headingRadian;
		changeEnergy=Energy-e.getEnergy();
		Energy=e.getEnergy();
		distance=e.getDistance();
		velocity = e.getVelocity();
		dir=e.getBearingRadians()+ar.getHeadingRadians();
		headingRadian = e.getHeadingRadians();
		X=ar.getX() + Math.sin( dir) * distance;
		Y=ar.getY() + Math.cos( dir) * distance;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -