📄 situation.cpp
字号:
AgentStatus b;
b.pos=global.wm.ballPos;
b.vel=global.wm.ballVel;
b=predictor.predictBallStatusAfterNrCycle(b,1);
Vector3 a=global.wm.nextPos;
Vector3 a_b=a-b.pos;
Angle ang_a_b=a_b.ang();
if(global.wm.ballVel.mod()>0.5||opp_ITInfo[oppByDist2Ball[0]].dDist2Ball<5||fabs(ang_a_b)<100)
return true;
if(!(isBallInOurControl()||isBallBeingInOurControl()))
return true;
else return false;
}
bool Situation::shouldIIntercept()
{
int i;
int flag=0;
int myITCyc=myITInfo.nCyc;
/*
AgentStatus a,b;
a.pos = global.wm.nextPos;
a.vel = global.wm.nextVel;
b.pos = global.wm.ballPos+global.wm.ballVel;
b.vel = global.wm.ballVel * SS->B_decay;
b.vel.z = (global.wm.ballVel.z+14.6795*0.2)* 0.8745-14.6795*0.2;
for(myITCyc=1;myITCyc<myITInfo.nCyc;myITCyc++)
{
AgentStatus ball_s = predictor.predictBallStatusAfterNrCycle(b,myITCyc);
Vector3 dest=ball_s.pos+Vector3(-0.3,0,0);
int cyc = predictor.predictCycToReachPoint(dest,a);
if(myITCyc>=cyc)
break;
}*/
Vector3 g1(X(-100),SS->mGoalWidth/2.);
Vector3 g2(X(-100),-SS->mGoalWidth/2.);
Angle angToOurGoal;
Dist distToOurGoal;
if(global.wm.ballPos.y>0)
{
distToOurGoal=(global.wm.ballPos-g1).mod();
angToOurGoal=(global.wm.ballPos-g1).ang();
}
else
{
distToOurGoal=(global.wm.ballPos-g2).mod();
angToOurGoal=(global.wm.ballPos-g2).ang();
}
if(global.wm.myNumber==1){
if((global.wm.nextBallPos - global.wm.nextPos).mod() > 1 &&
(!global.wm.ballPos.isInOurForbiddenZone()||(global.wm.ballPos.getDistToOurGoal()>10&&opp_ITInfo[oppByITCyc[0]].nCyc<myITCyc-4))) {
flag=1;
return false;
}
}
for(i=0;i<11;i++){
if(i == global.wm.myNumber - 1)
continue;
if(myITCyc>our_ITInfo[i].nCyc && !(flag==1&&i==0))
return false;
}
return true;
}
bool Situation::isBallKickable()
{
Dist dist = (global.wm.myPos-global.wm.ballPos).mod();
Dist r=-0.01;
// if(dist<SS->kickDist+SS->ballSize+SS->playerSize)
// return true;
Vector3 nextballPos;
AgentStatus ballstatus;
ballstatus.pos=global.wm.ballPos;
ballstatus.vel=global.wm.ballVel;
nextballPos=predictor.predictBallStatusAfterNrCycle(ballstatus, 1).pos;
if(global.wm.collisionFlag)
nextballPos = global.wm.nextBallPos;
Vector3 del = (global.wm.nextPos-nextballPos);
// Vector3 del = (global.wm.nextPos-global.wm.ballPos-global.wm.ballVel);
// del.z = SS->playerSize-SS->ballSize;
dist = del.mod();
Angle ang1 = Normalize((global.wm.nextPos-global.wm.nextBallPos).ang()+180);
Angle ang2 = global.wm.nextVel.ang();
if(fabs(Normalize(ang1-ang2))<30||global.wm.nextVel.mod()<0.5)
r = -0.005;
if(dist<SS->kickDist+SS->ballSize+SS->playerSize+r)
return true;
return false;
}
bool Situation::isBallCatchable()
{
AgentStatus a,b;
a.pos=global.wm.nextPos;
a.vel=global.wm.nextVel;
b.pos=global.wm.ballPos+global.wm.ballVel;
b.vel=global.wm.ballVel* SS->B_decay;
b=predictor.predictBallStatusAfterNrCycle(b, 1);
if(!b.pos.isInOurForbiddenZone())
return false;
if((b.pos-a.pos).mod()>SS->CatchMargin-0.05)
return false;
return true;
}
void Situation::Init(ServerSettings *ss)
{
SS = ss;
}
bool Situation::canIPassTo(int number,double &power)
{
return false;
}
bool Situation::isNearBall()
{
Vector3 F1,F2,F3;
if(global.wm.ballVel.mod()>0.1)
return false;
if((global.wm.ballPos+global.wm.ballVel-global.wm.nextPos).mod()>0.4)
return false;
return predictor.getF1F2F3ReachPoint(global.wm.nextVel, global.wm.nextPos, global.wm.ballPos, F1,F2,F3);
}
bool Situation::isBallInAir()
{
if(global.wm.ballPos.z>0.11+0.1||fabs(global.wm.ballVel.z)>0.1)
return true;
else
return false;
}
bool Situation::isShootable()
{
return false;
}
bool Situation::isGoThrough()
{
return false;
}
bool Situation::canIDribbleTo(const Vector3& dest)
{
return false;
}
bool Situation::canIReachBallin3Cycs()
{
Vector3 F1,F2,F3;
return predictor.getF1F2F3ReachPoint(global.wm.nextVel, global.wm.nextPos, global.wm.ballPos, F1,F2,F3);
}
double Situation::Normal_School(double u, double a,double x)
{
return exp(-1*pow(x-u,2)/(2*pow(a,2)));
}
bool Situation::isDribbleSafe()///////////////add by yzp
{
int i;
Vector3 delt(0,0,0);
Vector3 delt1(0,0,0);
Vector3 delt2(0,0,0);
Vector3 goal(0,0,0);
if(global.wm.myPos.x<X(60)){
if(global.wm.myPos.y>0){
goal.x=SS->mFieldLength/2;
goal.y=SS->mGoalWidth/4;
}else{
goal.x=SS->mFieldLength/2;
goal.y=-SS->mGoalWidth/4;
}
}
else
goal=Vector3(X(98),0,0);
Angle ang2goal=Normalize((goal-global.wm.myPos).ang());
Angle ang2ball=Normalize((global.wm.ballPos-global.wm.myPos).ang());
// if((global.wm.myPos-global.wm.ballPos).mod()>2)
// return false;
if(global.wm.myPos.x>SS->mFieldLength/2-12&&fabs(ang2goal)>45)
goal.x=SS->mFieldLength/2-3;
ang2goal=Normalize((goal-global.wm.myPos).ang());
Vector3 p0(global.wm.myPos.x+cos(ang2goal/360*2*3.14)*4.8,global.wm.myPos.y+sin(ang2goal/360*2*3.14)*4.8,0);
Vector3 p1(global.wm.nextPos.x+cos(ang2ball/360*2*3.14)*4.8,global.wm.nextPos.y+sin(ang2ball/360*2*3.14)*4.8,0);
#ifdef WIN32
ShowCircle(global.wm.myPos.x,global.wm.myPos.y,1.5,"255 0 0 2");
ShowPie(global.wm.myPos.x,global.wm.myPos.y,1,ang2goal-95,ang2goal+95,"255 100 0 2");
ShowPie(global.wm.myPos.x,global.wm.myPos.y,1,ang2ball-95,ang2ball+95,"255 100 0 2");
ShowCircle(p0,0.5,"255 255 0 2");
ShowCircle( p0, 4.8, "255 0 0 2");
if(fabs(ang2ball)<90)
ShowCircle( p1, 4.8, "255 255 0 2");
ShowPie(p0.x,p0.y,5.5,ang2goal-35,ang2goal+35,"255 0 0 2");
ShowPie(SS->mFieldLength/2+SS->mGoalWidth/4,0,22,135,225,"255 0 200 2");
Vector3 pp1(SS->mFieldLength/2-12,SS->mFieldWidth/2,0),p2(SS->mFieldLength/2-12,-SS->mFieldWidth/2,0),p3(SS->mFieldLength/2-6,-SS->mFieldWidth/2,0),p4(SS->mFieldLength/2-6,SS->mFieldWidth/2,0);
ShowLine(pp1,p2,"255 0 200 ");
ShowLine(p3,p4,"255 0 200 ");
ShowCircle(goal.x,goal.y,0.5,"155 155 155 2");
ShowCircle(global.wm.nextPos,8,"100 100 0 2");
ShowCircle(Vector3(X(100),0,0), 6,"100 100 100 2");
#endif
if(global.wm.myPos.x<X(60))
for(i=0;i<11;i++){
delt = global.wm.oppPos[i]-p0;
delt1=global.wm.oppPos[i]-p1;
delt2 = global.wm.oppPos[i]-global.wm.myPos;
if(delt.mod()<=4.8)
return false;
//////////////////////////yzp0429
else if(delt.mod()<=5.5&&fabs(Normalize(delt.ang()-ang2goal))<30)
return false;
/////////////
else if(delt2.mod()<1&&fabs(Normalize(delt.ang()-ang2ball))<105)
return false;
else if(delt1.mod()<=4.8&&fabs(ang2ball)<90)
return false;
}
else
for(i=0;i<11;i++){
delt = global.wm.oppPos[i]-p0;
delt1=global.wm.oppPos[i]-p1;
delt2 = global.wm.oppPos[i]-global.wm.myPos;
if(delt.mod()<=5.5&&fabs(Normalize(delt.ang()-ang2goal))<30)
return false;
else if(delt1.mod()<=4.8)
return false;
}
if((p1-global.wm.oppPos[0]).mod()<6)
return false;
return true;
}
bool Situation::isSomeOppBlocking(Vector3 ball, Angle ang, Angle &goover)
{
Vector3 delt;
delt = global.wm.oppPos[oppByITCyc[0]]-ball;
Angle theta;
Dist dist;
dist = delt.mod();
if(dist<5){
if(dist<0.401)
dist = 0.401;
theta = asin(0.4/dist) * 180. / PI;
if(fabs(Normalize(delt.ang()-ang))<theta){
goover = atan(1.0/dist) * 180. / PI;
if(goover>50)
goover=50;
return true;
}
}
return false;
}
bool Situation::isDeadBall()
{
if(global.wm.pm != PM_PlayOn && global.wm.pm != PM_GOAL_KICK_Our ||global.wm.mSensationCount<2)
return true;
return false;
}
bool Situation::isBallBeingInOppControl()
{
if(opp_ITInfo[oppByITCyc[0]].nCyc >=4
&&
our_ITInfo[ourByITCyc[0]].nCyc >= 4
&&
our_ITInfo[ourByITCyc[0]].nCyc - opp_ITInfo[oppByITCyc[0]].nCyc > 6
)
return true;
return false;
}
bool Situation::isBallBeingInOurControl()
{
if(opp_ITInfo[oppByITCyc[0]].nCyc >=4
&&
our_ITInfo[ourByITCyc[0]].nCyc >= 4
&&
our_ITInfo[ourByITCyc[0]].nCyc - opp_ITInfo[oppByITCyc[0]].nCyc < -6
)
return true;
return false;
}
bool Situation::isBallBeingInBothControl()
{
if(opp_ITInfo[oppByITCyc[0]].nCyc >=4
&&
our_ITInfo[ourByITCyc[0]].nCyc >= 4
&&
our_ITInfo[ourByITCyc[0]].nCyc - opp_ITInfo[oppByITCyc[0]].nCyc >= -6
&&
our_ITInfo[ourByITCyc[0]].nCyc - opp_ITInfo[oppByITCyc[0]].nCyc <= 6
)
return true;
return false;
}
bool Situation::isBallInBothControl()
{
if((opp_ITInfo[oppByITCyc[0]].nCyc <4||opp_ITInfo[oppByDist2Ball[0]].dDist2Ball < SS->ballSize+SS->playerSize + 0.1)
&&
(our_ITInfo[ourByITCyc[0]].nCyc <4||our_ITInfo[ourByDist2Ball[0]].dDist2Ball < SS->ballSize+SS->playerSize + 0.1)
)
return true;
return false;
}
bool Situation::isBallInOppControl()
{
if((opp_ITInfo[oppByITCyc[0]].nCyc <4||opp_ITInfo[oppByDist2Ball[0]].dDist2Ball < SS->ballSize+SS->playerSize + 0.1)
&&
!(our_ITInfo[ourByITCyc[0]].nCyc <4||our_ITInfo[ourByDist2Ball[0]].dDist2Ball < SS->ballSize+SS->playerSize + 0.1)
)
return true;
return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -