📄 leo47.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 + -