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

📄 leo47.cpp

📁 以AIROBOT为平台构建的一个智能机器人。源码中使用的平台函数接口见AIROBOT说明。
💻 CPP
字号:

 /* 这是一个 cpp 机器人模板.
 *
 * 用户定义的机器人以类的形式存在,采用面向对象的编程方式.
 * 用户定义的机器人必须从 Robot.h 中定义的 Robot 类继承。
 * 用户通过重载 Robot 中的事件处理函数和执行函数定义自己的机器人(MyRobot)。
 * 在定义了自己的机器人后,必须按指定格式编写一条创建机器人实例的语句 
 * ( Robot * robot = new MyRobot(); ). 
 *
 */

#include "Utils.h"
#include "Robot.h"
#include "math.h"
#include<Algorithm>

using namespace std;

struct info
{
	double infovelocity;
	double infoangle;
	long int dotimes;
	long int hittimes;
};

struct fireinfo
{
	double fireangle;
	long int firehittimes;
	long int firedotimes;
};

void mysortForRoute(info a[8])
{
	for(int i=0;i<=6;i++)
		for(int j=i+1;j<=7;j++)
			if(a[i].hittimes>a[j].hittimes)
			{
				swap(a[i].infovelocity,a[j].infovelocity);
				swap(a[i].infoangle,a[j].infoangle);
				swap(a[i].hittimes,a[j].hittimes);
			}
}

void mysortForFire(fireinfo a[5])
{
	for(int i=0;i<=3;i++)
		for(int j=i+1;j<=4;j++)
			if(a[i].firehittimes<a[j].firehittimes)
			{
				swap(a[i].fireangle,a[j].fireangle);
				swap(a[i].firehittimes,a[j].firehittimes);
			}
}



//定义自己的机器人
class Leo : public Robot
{
public :
	Leo()
	{
	Mybody=new Body();
	setBody(Mybody);
	Mygun=new Gun();
	setGun(Mygun);
	for(int i=0;i<=2;++i)
	{
		route[i][0].infoangle=Utils::PI/9*8;
		for(int j=1;j<=8;++j)
		{
			route[i][j].infoangle=route[i][j-1].infoangle-Utils::PI/9;
			route[i][j].infovelocity=8;
			route[i][j].hittimes=0;
		}
	}
	for(i=0;i<=2;++i)
	{
		finfo[i][0].fireangle=0;
		finfo[i][0].firehittimes=0;
		finfo[i][1].fireangle=Utils::PI/144;
		finfo[i][1].firehittimes=0;
		finfo[i][2].fireangle=-Utils::PI/72;
		finfo[i][2].firehittimes=0;
		finfo[i][3].fireangle=Utils::PI/144*3;
		finfo[i][3].firehittimes=0;
		finfo[i][4].fireangle=Utils::PI/36;
		finfo[i][4].firehittimes=0;
	}
}


void onBegin(BeginEvent *beginevent)
{
    //初始化
	wait=0;
	scannedTime = -5;
	velocity = 8;
	moveTime = 5;
	close=0;
	timetoclose=0;
	firepower=1;
	firetime=0;
	changedirection=1;
	dis=0;
	infoSecond=0;
	infoFirst=0;
	fireinfoFirst=0;
	fireinfoSecond=0;
	fireDotimes=0;
	Dotimes=0;
	int i,j;
	if (getCurrentRound()<=2)
	{
			for(j=0;j<=2;++j)
			{
				for(i=0;i<=7;++i)
					route[j][i].dotimes=15;
				for(i=0;i<=4;++i)
					finfo[j][i].firedotimes=3;
			}
		for(i=0;i<=2;++i)
		{
			mysortForRoute(route[i]);
			mysortForFire(finfo[i]);
		}
	}
		else 
		{
		for(j=0;j<=2;++j)
		{
			for(i=0;i<=7;++i)
				if(i<=3)
					route[j][i].dotimes=20;
				else if(i<=6)
					route[j][i].dotimes=10;
				else
					route[j][i].dotimes=5;
			for(i=0;i<=4;++i)
				if(i<=1)
					finfo[j][i].firedotimes=10;
				else if(i<=3)
					finfo[j][i].firedotimes=4;
				else
					finfo[j][i].firedotimes=2;
		}	
	} 
}

//控制雷达单元
void onScannedRobot(ScannedRobotEvent * e )
{
	double ang,enehead,velo,head;
	scannedTime = e->getTime();
	enemyenergy=e->getEnergy();
 	enemyX = e->getX();
	enemyY = e->getY();
	dis=Utils::distance(Mybody->getX(),Mybody->getY(),enemyX,enemyY);
	if(dis>500)
	{
		infoFirst=0;
		fireinfoFirst=0;
	}
	else if(dis>300)
	{
		infoFirst=1;
		fireinfoFirst=1;
	}
	else
	{
		infoFirst=2;
		fireinfoFirst=2;
	}
	if(infoFirst!=lastinfoFirst)
		infoSecond=0;
	lastinfoFirst=infoFirst;
	if(fireinfoFirst!=lastfireinfoFirst)
		fireinfoSecond=0;
	lastfireinfoFirst=fireinfoFirst;
	enehead=Utils::heading(enemyX,enemyY,Mybody->getX(),Mybody->getY());
	velo=e->getVelocity();
	head=e->getHeading();
	ang=Utils::turnAngle(head,enehead);
	if(enemyenergy==0)
		wait++;
	if((enemyenergy<=getEnergy()-25&&dis<=100)||wait>=5)
	{
	double h = Utils::heading(getBody()->getX(),getBody()->getY(),enemyX,enemyY);
	double angle = Utils::turnAngle(getBody()->getHeading(),h);
	getBody()->turn(angle);
	timetoclose=1;
	if(velocity<0)
		velocity=-velocity;
	}
	if(--fireDotimes<0)
	{
		if(dis>500)
			while(finfo[fireinfoFirst][(fireinfoSecond++)%5].fireangle<=Utils::PI/36)
			{
					fireinfoSecond=(fireinfoSecond-1)%5;
					break;
			}
		else if(dis>300)
			while(finfo[fireinfoFirst][(fireinfoSecond++)%5].fireangle<=Utils::PI/72)
			{
					fireinfoSecond=(fireinfoSecond-1)%5;
					break;
			}
		else
			while(finfo[fireinfoFirst][(fireinfoSecond++)%5].fireangle<=Utils::PI/144)
			{
					fireinfoSecond=(fireinfoSecond-1)%5;
					break;
			}
		fireDotimes=finfo[fireinfoFirst][fireinfoSecond].firedotimes;
		}
	if(dis>100)
	{
		firepower=1;
	}
	else
	{
		firepower=3;
	}
		alpha=asin(velo*sin(ang)/(20-3*firepower));
		doGun();
}

/*
* 当打中某个敌人时触发
*/
void onBulletHit( HitByBulletEvent * e)
{
	firetime=0;
	if(dis>=5)
		finfo[fireinfoFirst][fireinfoSecond].firehittimes++;
}
	
/*
 * 当被敌人打中时触发
 */
void onHitByBullet(HitByBulletEvent * e)
{
	if(dis>=10)
		route[infoFirst][infoSecond].hittimes++;
	if(timetoclose!=1)
	{
	moveTime = 5;
	if(Mybody->getX()>=100&&Mybody->getX()<=getMap()->getWidth()-100&&Mybody->getY()>=100&&Mybody->getY()<=getMap()->getHeight()-100)
		velocity=-velocity;
	}
	if(close++>=1)
	{
	if(Mybody->getX()>=100&&Mybody->getX()<=getMap()->getWidth()-100&&Mybody->getY()>=100&&Mybody->getY()<=getMap()->getHeight()-100)
	{
		changedirection=-changedirection;
		close=0;
	}
	}
}
	
/*
 * 当撞到其它敌人时触发
 */
void onHitRobot( HitRobotEvent * e )
{
		double h = Utils::heading(getBody()->getX(),getBody()->getY(),enemyX,enemyY);
		double angle = Utils::turnAngle(getBody()->getHeading(),h);
		getBody()->turn(angle);
		h = Utils::heading( Mybody->getX(), Mybody->getY(),enemyX, enemyY);
		angle=Utils::turnAngle(Mygun->getHeading(),h);
		Mygun->turn(angle);
		Mygun->fire(3);
		firetime++;
}
	
/*
 * 当撞到墙时触发
 */
void onHitWall( HitWallEvent * e )
{
if((Mybody->getX()<=30&&Mybody->getY()<=30) || (Mybody->getX()<=30&&Mybody->getY()>=getMap()->getHeight()-30)  ||  (Mybody->getX()>=getMap()->getWidth()-30&&Mybody->getY()<=30)  ||  (Mybody->getX()>=getMap()->getWidth()-30&&Mybody->getY()>=getMap()->getHeight()-30))
 	changeDirection();
else
	velocity=-velocity;
}
	
/*
 * 当某个敌人死时触发
 */
void onRobotDeath()
{
 
}
	
/*
 * 当一轮战斗结束时触发
 */
void onFinish()
{

}

/*
 * 当机器人执行操作超时时触发
 */
void onOvertime()
{
 
}

    //改变运动方向
void changeDirection()
{
	Mybody->move(0);
	getBody()->turn(Utils::PI/3*2);
	Mybody->move(8);

}

  void DoRadar()
	{
		//雷达锁定
		if( getTime() - scannedTime > 3 ) getRadar()->turn(Utils::PI);
		else
		{
			//雷达转向敌人,以实现锁定
			double h = Utils::heading(getBody()->getX(),getBody()->getY(),enemyX,enemyY);
			double angle = Utils::turnAngle(getRadar()->getHeading(),h);
			getRadar()->turn(angle);
		}
	}

void DoMove()
{
	double angle,h,moveangle;
	moveangle=changedirection*route[infoFirst][infoSecond].infoangle;
	if((Mybody->getX()<=40&&Mybody->getY()<=40) || (Mybody->getX()<=40&&Mybody->getY()>=getMap()->getHeight()-40)  ||  (Mybody->getX()>=getMap()->getWidth()-40&&Mybody->getY()<=40)  ||  (Mybody->getX()>=getMap()->getWidth()-40&&Mybody->getY()>=getMap()->getHeight()-40))
		moveangle=0;
	if(--Dotimes<0)
	{
		if(infoSecond>7)
			infoSecond=0;
		Dotimes=route[infoFirst][infoSecond++].dotimes;
	}
	else 
	{
			//运动改变方向 
		if( moveTime-- < 0 ) changeDirection();
			getBody()->move(velocity);
		if(timetoclose!=1)
			{
				h = Utils::heading(getBody()->getX(),getBody()->getY(),enemyX,enemyY);
				angle = Utils::turnAngle(getBody()->getHeading(),h);
				getBody()->turn(angle+moveangle);
			}
		else
			{
				h = Utils::heading(getBody()->getX(),getBody()->getY(),enemyX,enemyY);
				angle = Utils::turnAngle(getBody()->getHeading(),h);
				velocity=8;
				getBody()->turn(angle);
			}
	}

}
       void work()
	   {
		   	DoRadar();
			DoMove();
	   }
       
	   //事件处理函数

void doGun()
{
	double angle;
	double h = Utils::heading( Mybody->getX(), Mybody->getY(),enemyX, enemyY);
	if(dis<600)
	{
	if(timetoclose==1||dis<50)
		alpha=0;
		angle = Utils::turnAngle(Mygun->getHeading(),h+alpha);
	if(timetoclose!=1)
		Mygun->turn(angle+changedirection*finfo[fireinfoFirst][fireinfoSecond].fireangle);
	else
		Mygun->turn(angle);
		Mygun->fire(firepower);
		firetime++;
	}
}



private:
	double scannedTime;
    double enemyX; //敌人的x坐标
	double enemyY; //敌人的Y坐标
	double velocity; //运动速度
	double moveTime; //朝一个方向运动的时间
	Body* Mybody;
	Gun* Mygun;
	int close;
	int timetoclose;
	double enemyenergy;
	int firepower;
	double changedirection;
	double dis;
	int firetime;
	info route[3][8];
	int infoFirst,lastinfoFirst,fireinfoFirst,lastfireinfoFirst;
	int infoSecond,fireinfoSecond;
	int Dotimes,fireDotimes;
	double alpha;
	fireinfo finfo[3][5];
	int wait;
};




//创建机器人实例,这是必不可少的
Robot* robot = new Leo();

⌨️ 快捷键说明

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