📄 strategy.cpp
字号:
}
else if(id<10)
{
robot=zw.opponent[id-5].pos;
mind=R10;
}
else
{
robot=zw.ball.pos;
mind=Dist_RB+1*cm;
}
dprx=point.x-robot.x;
dpry=point.y-robot.y;
distance_pr=sqrt(dprx*dprx+dpry*dpry);
drhx=robot.x-zw.home[which].pos.x;
drhy=robot.y-zw.home[which].pos.y;
distance_rh=sqrt(drhx*drhx+drhy*drhy);
if(distance_pr<distance_ph && distance_rh<distance_ph)
{
// A=dphy;
// B=-dphx;
// C=dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy;
// distb=sqrt(A*A+B*B);
distt=(dphy*robot.x-dphx*robot.y
+dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy)/distance_rh;
// dists[id]=distt/distance_rh;
if(fabs(distt)<mind)
{
if(distance_rh<mindis)
{
mindis=distance_rh;
Block_id=id;
if(distt<0) //如果障碍到目标直线的位移<0,则障碍在直线的左边
block_direction='r'; //'r'代表队员应该向右绕
else
block_direction='l'; //反之应该向左绕
}
}
}
}
if (Block_id!=-1) //如果不等于-1,则有障碍
{
if(Block_id<5)
{
robot=zw.home[Block_id].pos;
juli=R10;
}
else if(Block_id<10)
{
robot=zw.opponent[Block_id-5].pos;
juli=R10;
}
else
{
robot=zw.ball.pos;
juli=R7;
}
if(mindis>Rob_adge)
if(block_direction=='r')
{
avoidpoint.x=robot.x-juli*(-dphy/distance_ph);
avoidpoint.y=robot.y-juli*(dphx/distance_ph);
}
else
{
avoidpoint.x=robot.x-juli*(dphy/distance_ph);
avoidpoint.y=robot.y-juli*(-dphx/distance_ph);
}
else if(block_direction=='r')
{ avoidpoint.x=robot.x-juli*(-dphy/distance_ph)-juli*(dphx/distance_ph);
avoidpoint.y=robot.y-juli*(dphx/distance_ph)-juli*(dphy/distance_ph);
}
else
{
avoidpoint.x=robot.x-juli*(dphy/distance_ph)-juli*(dphy/distance_ph);
avoidpoint.y=robot.y-juli*(-dphx/distance_ph)-juli*(dphy/distance_ph);
}
dahx=avoidpoint.x-zw.home[which].pos.x;
dahy=avoidpoint.y-zw.home[which].pos.y;
distance_ah=sqrt(dahx*dahx+dahy*dahy);
if(distance_ah<2.3*zw.home[which].dv)
Toward(which, point, 125, env);
else
Toward(which, avoidpoint, 125, env);
}
else
// Toward(which, point, 125, env);
{
double dprx, dpry, distance_pr;
dprx=zw.kickPit.x-zw.home[which].pos.x;
dpry=zw.kickPit.y-zw.home[which].pos.y;
if(kickState[which])
distance_pr=0;//保证转身动作完成
else
distance_pr=sqrt(dprx*dprx+dpry*dpry);//踢球点与踢球人的距离
if(distance_pr>zw.home[which].intervalK)
{
Toward( which, zw.kickPit, 125, env);
zw.home[which].intervalK=SHORTER;
kickStep[which]=0;
kickState[which]=0;
}
else
{
kickStep[which]++;
if(kickStep[which]>6)
{
kickStep[which]=6;
kickState[which]=0;
}
else if(kickStep[which]>=1)
kickState[which]=1;
Toward( which, zw.target, 125, env);
zw.home[which].intervalK=LONGER;
}
}
}
//////top:AttackAvoidBlock(int which,Environment *env)///////
////////////////////////////////////////////////////////////
void AvoidBlock(int which,Vector2D point, Environment *env)
{
int id,Block_id=-1;
char block_direction;
double mindis=1000.0, mind, n=11, distt=0,juli;
Vector2D robot, avoidpoint;
double dphx=point.x-zw.home[which].pos.x;
double dphy=point.y-zw.home[which].pos.y;
double distance_ph=sqrt(dphx*dphx+ dphy*dphy);
double dprx, dpry, distance_pr, drhx, drhy, distance_rh;
double dahx,dahy,distance_ah;
for(id=0;id<n;id++)
{
if(which==id) continue;
if(id<5)
{
robot=zw.home[id].pos;
mind=R10;
}
else if(id<10)
{
robot=zw.opponent[id-5].pos;
mind=R10;
}
else
{
robot=zw.ball.pos;
mind=Dist_RB+1*cm;
}
dprx=point.x-robot.x;
dpry=point.y-robot.y;
distance_pr=sqrt(dprx*dprx+dpry*dpry);
drhx=robot.x-zw.home[which].pos.x;
drhy=robot.y-zw.home[which].pos.y;
distance_rh=sqrt(drhx*drhx+drhy*drhy);
if(distance_pr<distance_ph && distance_rh<distance_ph)
{
// A=dphy;
// B=-dphx;
// C=dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy;
// distb=sqrt(A*A+B*B);
distt=(dphy*robot.x-dphx*robot.y
+dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy)/distance_rh;
// dists[id]=distt/distance_rh;
if(fabs(distt)<mind)
{
if(distance_rh<mindis)
{
mindis=distance_rh;
Block_id=id;
if(distt<0) //如果障碍到目标直线的位移<0,则障碍在直线的左边
block_direction='r'; //'r'代表队员应该向右绕
else
block_direction='l'; //反之应该向左绕
}
}
}
}
if (Block_id!=-1) //如果不等于-1,则有障碍
{
if(Block_id<5)
{
robot=zw.home[Block_id].pos;
juli=R10;
}
else if(Block_id<10)
{
robot=zw.opponent[Block_id-5].pos;
juli=R10;
}
else
{
robot=zw.ball.pos;
juli=R7;
}
if(mindis>Rob_adge)
if(block_direction=='r')
{
avoidpoint.x=robot.x-juli*(-dphy/distance_ph);
avoidpoint.y=robot.y-juli*(dphx/distance_ph);
}
else
{
avoidpoint.x=robot.x-juli*(dphy/distance_ph);
avoidpoint.y=robot.y-juli*(-dphx/distance_ph);
}
else if(block_direction=='r')
{ avoidpoint.x=robot.x-juli*(-dphy/distance_ph)-juli*(dphx/distance_ph);
avoidpoint.y=robot.y-juli*(dphx/distance_ph)-juli*(dphy/distance_ph);
}
else
{
avoidpoint.x=robot.x-juli*(dphy/distance_ph)-juli*(dphy/distance_ph);
avoidpoint.y=robot.y-juli*(-dphx/distance_ph)-juli*(dphy/distance_ph);
}
dahx=avoidpoint.x-zw.home[which].pos.x;
dahy=avoidpoint.y-zw.home[which].pos.y;
distance_ah=sqrt(dahx*dahx+dahy*dahy);
if(distance_ah<2.3*zw.home[which].dv)
Toward(which, point, 125, env);
else
Toward(which, avoidpoint, 125, env);
}
else
Toward(which, point, 125, env);
}
///////////////////////////////////////////////////////////////
void PositAvoidBlock(int which, Vector2D target, Environment *env)
{
int id,Block_id=-1;
char block_direction;
double mindis=1000.0, mind, n=11, distt=0,juli;
Vector2D robot, avoidpoint;
double dphx=target.x-zw.home[which].pos.x;
double dphy=target.y-zw.home[which].pos.y;
double distance_ph=sqrt(dphx*dphx+ dphy*dphy);
double dprx, dpry, distance_pr, drhx, drhy, distance_rh;
double dahx,dahy,distance_ah;
for(id=0;id<n;id++)
{
if(which==id) continue;
if(id<5)
{
robot=zw.home[id].pos;
mind=R10;
}
else if(id<10)
{
robot=zw.opponent[id-5].pos;
mind=R10;
}
else
{
robot=zw.ball.pos;
mind=Dist_RB+1*cm;
}
dprx=target.x-robot.x;
dpry=target.y-robot.y;
distance_pr=sqrt(dprx*dprx+dpry*dpry);
drhx=robot.x-zw.home[which].pos.x;
drhy=robot.y-zw.home[which].pos.y;
distance_rh=sqrt(drhx*drhx+drhy*drhy);
if(distance_pr<distance_ph && distance_rh<distance_ph)
{
// A=dphy;
// B=-dphx;
// C=dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy;
// distb=sqrt(A*A+B*B);
distt=(dphy*robot.x-dphx*robot.y
+dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy)/distance_rh;
// dists[id]=distt/distance_rh;
if(fabs(distt)<mind)
{
if(distance_rh<mindis)
{
mindis=distance_rh;
Block_id=id;
if(distt<0) //如果障碍到目标直线的位移<0,则障碍在直线的左边
block_direction='r'; //'r'代表队员应该向右绕
else
block_direction='l'; //反之应该向左绕
}
}
}
}
if (Block_id!=-1) //如果不等于-1,则有障碍
{
if(Block_id<5)
{
robot=zw.home[Block_id].pos;
juli=R10;
}
else if(Block_id<10)
{
robot=zw.opponent[Block_id-5].pos;
juli=R10;
}
else
{
robot=zw.ball.pos;
juli=R7;
}
if(mindis>Rob_adge)
if(block_direction=='r')
{
avoidpoint.x=robot.x-juli*(-dphy/distance_ph);
avoidpoint.y=robot.y-juli*(dphx/distance_ph);
}
else
{
avoidpoint.x=robot.x-juli*(dphy/distance_ph);
avoidpoint.y=robot.y-juli*(-dphx/distance_ph);
}
else if(block_direction=='r')
{ avoidpoint.x=robot.x-juli*(-dphy/distance_ph)-juli*(dphx/distance_ph);
avoidpoint.y=robot.y-juli*(dphx/distance_ph)-juli*(dphy/distance_ph);
}
else
{
avoidpoint.x=robot.x-juli*(dphy/distance_ph)-juli*(dphy/distance_ph);
avoidpoint.y=robot.y-juli*(-dphx/distance_ph)-juli*(dphy/distance_ph);
}
dahx=avoidpoint.x-zw.home[which].pos.x;
dahy=avoidpoint.y-zw.home[which].pos.y;
distance_ah=sqrt(dahx*dahx+dahy*dahy);
if(distance_ah<2.3*zw.home[which].dv)
Toward(which, target, 125, env);
else
Toward(which, avoidpoint, 125, env);
}
else
// Toward(which, point, 125, env);
Posit( which, target, Vspeed, env);
}
////////////////////////////////////////////////////////////////////////////////////////
void ReceiveData(Environment *env)
{
//安蓝黄队条件编译///////////////////////////////////////////////
#ifdef BLUE
//为蓝队从系统数据区接收动态数据
for(int id=0; id<5; id++)
{
zw.home[id].pos.x=env->home[id].pos.x;
zw.home[id].pos.y=env->home[id].pos.y;
zw.home[id].ang=env->home[id].rotation;
zw.opponent[id].pos.x=env->opponent[id].pos.x;
zw.opponent[id].pos.y=env->opponent[id].pos.y;
zw.opponent[id].ang=env->opponent[id].rotation;
}
zw.ball.pos.x=env->currentBall.pos.x;
zw.ball.pos.y=env->currentBall.pos.y;
zw.whosBall=env->whosBall;
#else
//为黄队从系统数据区接收动态数据并施以坐标变换
double maxw = FLEFT+FRIGHT;
double maxh = FTOP+FBOTTOM;
for(int id=0; id<5; id++)
{
zw.home[id].pos.x=maxw-env->home[id].pos.x;
zw.home[id].pos.y=maxh-env->home[id].pos.y;
if(env->home[id].rotation>0)
zw.home[id].ang=env->home[id].rotation-180;
else
zw.home[id].ang=env->home[id].rotation+180;
zw.opponent[id].pos.x=maxw-env->opponent[id].pos.x;
zw.opponent[id].pos.y=maxh-env->opponent[id].pos.y;
if(env->opponent[id].rotation>0)
zw.opponent[id].ang=env->opponent[id].rotation-180;
else
zw.opponent[id].ang=env->opponent[id].rotation+180;
}
zw.ball.pos.x=maxw-env->currentBall.pos.x;
zw.ball.pos.y=maxh-env->currentBall.pos.y;
if(env->whosBall==ANYONES_BALL)
zw.whosBall=env->whosBall;
else
zw.whosBall=BLUE_BALL+YELLOW_BALL-env->whosBall;
#endif
///////////////////////////////////////////////////////////////////////////
//计算当前周期机器人和球的位移、速度和加速度////////////////////////////////////
for(id=0; id<5; id++)
{
zw.home[id].dx = zw.home[id].pos.x - zw.home[id].last_pos.x;
zw.home[id].dy = zw.home[id].pos.y - zw.home[id].last_pos.y;
zw.home[id].dv = sqrt(zw.home[id].dx * zw.home[id].dx + zw.home[id].dy * zw.home[id].dy);
zw.home[id].da = zw.home[id].dv-zw.home[id].dv1;
zw.opponent[id].dx = zw.opponent[id].pos.x - zw.opponent[id].last_pos.x;
zw.opponent[id].dy = zw.opponent[id].pos.y - zw.opponent[id].last_pos.y;
zw.opponent[id].dv = sqrt(zw.opponent[id].dx * zw.opponent[id].dx + zw.opponent[id].dy * zw.opponent[id].dy);
}
zw.ball.dx = zw.ball.pos.x - zw.ball.last_pos.x;
zw.ball.dy = zw.ball.pos.y - zw.ball.last_pos.y;
zw.ball.dv = sqrt(zw.ball.dx * zw.ball.dx + zw.ball.dy * zw.ball.dy);
zw.ball.da = zw.ball.dv-zw.ball.dv1;
zw.gameState = env->gameState;
}
////////////////////////////////////////////////////////
//保存当前数据供下周期用///////////////////////////////////////
void PreserveData()
{
zw.ball.last_pos.x=zw.ball.pos.x;//保存本周期球的位置
zw.ball.last_pos.y=zw.ball.pos.y;
zw.ball.dv1=zw.ball.dv;//保存球速
for(int id=0; id<5; id++)
{//保存机器人的位置和速度
zw.home[id].last_pos.x=zw.home[id].pos.x;
zw.home[id].last_pos.y=zw.home[id].pos.y;
zw.home[id].last_ang=zw.home[id].ang;
zw.home[id].dv1=zw.home[id].dv;
zw.opponent[id].last_pos.x=zw.opponent[id].pos.x;
zw.opponent[id].last_pos.y=zw.opponent[id].pos.y;
}
}
//////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -