📄 situation.cpp
字号:
if(p.x>X(90)&&fabs(p.y)>30)
{
double tmp=(p.x-X(90)+fabs(p.y)-30)*1.5;
v-=Vector3(tmp,tmp,tmp);
}
return v;
}
else{////////////////add by yzp
int i=0;
Vector3 v;
int oppnear=0;
int ournear=0;
double temp=0;
Vector3 goal;
if(p.y>0){
goal.x=SS->mFieldLength/2;
goal.y=SS->mGoalWidth/4;
}else{
goal.x=SS->mFieldLength/2;
goal.y=-SS->mGoalWidth/4;
}
double DistMinOpp=(p-global.wm.oppPos[i]).mod();
double DistMinOur=(p-global.wm.ourPos[i]).mod();
double p2goal=(p-goal).mod();
for(i=1;i<11;i++){
temp=(p-global.wm.oppPos[i]-global.wm.oppVel[i]/3.0).mod();
if(temp<DistMinOpp){
DistMinOpp=temp;
oppnear=i;
}
}
//
if((global.wm.oppPos[oppnear] - Vector3(X(100)-10,0)).mod() < (p - Vector3(X(100)-10,0)).mod())
DistMinOpp-=1;
//
for(i=1;i<11;i++){
if(i+1==global.wm.myNumber)
continue;
temp=(p-global.wm.ourPos[i]).mod();
if(temp<DistMinOur){
DistMinOur=temp;
ournear=i;
}
}
Angle ang=Normalize((goal-p).ang());
double midDist=(global.wm.ourPos[ournear]-global.wm.oppPos[oppnear]).mod()/2;
/////////////////////yzp0607
double dist_me2p=(p-global.wm.nextPos).mod();
double dist_p2goal=(p-goal).mod();
double dist_total=dist_me2p+dist_p2goal;
double dist_me2goal=(global.wm.nextPos-goal).mod();
double co_ang=1;
if(fabs(ang)>45&&p.x>X(75))
co_ang=Normal_School(45,20,fabs(ang));///////////////yzp0609
/////////////////////////yzp0605
if(DistMinOur<DistMinOpp+1&&DistMinOur>DistMinOpp+0.5)
v.z=20*Normal_School(13.0, 15.0, p2goal)*Normal_School(1, 1, dist_total/dist_me2goal)*co_ang;
if(DistMinOur<DistMinOpp+0.5&&DistMinOur>DistMinOpp)
v.z=30.0*Normal_School(13.0, 15.0, p2goal)*Normal_School(1, 1, dist_total/dist_me2goal)*co_ang;
else if(DistMinOur<=DistMinOpp&&DistMinOur>=DistMinOpp-1.0)
v.z=40*Normal_School(13.0, 15.0, p2goal)*Normal_School(1, 1, dist_total/dist_me2goal)*co_ang;
else if(DistMinOur<DistMinOpp-1.0)
v.z=90*Normal_School(13.0, 19.0, p2goal)*Normal_School(1, 1, dist_total/dist_me2goal)*co_ang+10*Normal_School(0,midDist-2,DistMinOur);
else
v.z=0;
return v;
}
}
void Situation::getConsiderPassPoint(vector<Vector3>& points, double maxDis)
{
if (maxDis < 0) maxDis = 25;
int i;
Vector3 p;
Angle ang,angmax,angmin;
Dist dist;
Vector3 goal(X(100),0);
angmax=100;angmin=-100;
for(i=0;i<11;i++){
if(i==global.wm.myNumber-1)
continue;
if(global.wm.ourPos[i].x+1<global.wm.myPos.x
|| (global.wm.ourPos[i] - global.wm.myPos).mod() > maxDis)
continue;
Angle angtogoal=(goal-global.wm.ourPos[i]).ang();
if(fabs(angtogoal)>60) {
angmax= angtogoal+90;
angmin=angtogoal-90;
}
for(ang=angmin;ang<=angmax;ang+=10){
for(dist=2;dist<9;dist+=1){
p = global.wm.ourPos[i] + Vector3(dist,ang,0,POLAR);
points.push_back(p);
#ifdef WIN32
ShowCircle(p.x,p.y,0.111,"128 255 255 2");
#endif
}
}
}
if(global.wm.ballPos.getDistToOppGoal()<25) {
if(global.wm.ballPos.y>0)
p = Vector3(X(101),SS->mGoalWidth/4,0);
else p = Vector3(X(101),-SS->mGoalWidth/4,0);
points.push_back(p);
#ifdef WIN32
ShowCircle(p.x,p.y,0.111,"128 255 255 2");
#endif
}
}
Vector3 Situation::getBestPassPoint(double maxDis)
{
vector<Vector3> points;
getConsiderPassPoint(points, maxDis);
int i;
double maxV=-1;
Vector3 best = Vector3(X(105), 0, 0);
double dTmp;
if((global.wm.myPos-best).mod()<15&&fabs(Normalize((best-global.wm.myPos).ang()))<60)
return best;///////////////
for(i=0;i<(int)points.size();++i){
Vector3 vTmp=EvaluatePassPoint(points[i]);
dTmp = vTmp.z;
if(dTmp>maxV){
maxV=dTmp;
best = points[i];
}
}
#ifdef WIN32
ShowCircle(best.x,best.y,0.5,"255 128 255 2");
#endif
return best;
}
bool Situation::shouldIKickOff()
{
if(global.wm.myNumber==1){
return false;
}
int mynCyc = our_ITInfo[global.wm.myNumber-1].nCyc;
double myDist = our_ITInfo[global.wm.myNumber-1].dDist2Ball;
for(int i=1;i<11;i++){ // 鲁媒脕脣脢脴脙脜脭卤脰庐脥芒碌脛脟貌脭卤
if(i == global.wm.myNumber - 1)
continue;
if(mynCyc > our_ITInfo[i].nCyc)
return false;
if(mynCyc==our_ITInfo[i].nCyc && myDist>our_ITInfo[i].dDist2Ball)
return false;
}
return true;
}
int Situation::getKickPower(Vector3 destPos, double &theta, double &power) //add by zy
{
Vector3 vecBallToBall = destPos-(global.wm.ballPos+global.wm.ballVel); //from next ball position to destination
double passDistance =vecBallToBall.mod()*1.1;
double minAirDistance_s = -1;
int nOppInSector = 0;
int nOppClose = 0;
int possibility = 0;
bool noDest = 0;
if(passDistance>30) {
passDistance=25;
noDest = 1;
}
#ifdef WIN32
Vector3 ball(global.wm.ballPos.x+global.wm.ballVel.x,global.wm.ballPos.y+global.wm.ballVel.y);
double kick_ang = vecBallToBall.ang();
ShowPie(ball.x,ball.y,15,kick_ang-20,kick_ang+20,"128 0 255 2");
ShowPie(ball.x,ball.y,5.0,kick_ang-30,kick_ang+30,"128 0 255 2");
ShowPie(ball.x,ball.y,2.0,kick_ang-50,kick_ang+50,"128 0 255 2");
ShowMessage("passDis: %lf",passDistance);
#endif
// is too long to pass ?
// if(passDistance>MAX_PASS_DISTANCE && noDest == 0)
// return 0;
// need longball ?
// number of opp in the area who can intercept
// number of opp on the line
for(int i=0;i<11;i++) {
Vector3 ball(global.wm.ballPos.x+global.wm.ballVel.x,global.wm.ballPos.y+global.wm.ballVel.y);
Vector3 vecBallToOpp(global.wm.oppPos[i].x-ball.x,global.wm.oppPos[i].y-ball.y);
Vector3 vecBallToOur(global.wm.ourPos[i].x-ball.x,global.wm.ourPos[i].y-ball.y);
if(i==global.wm.myNumber-1)
vecBallToOur.x=vecBallToOur.y=1000;
double dd=passDistance;
if(dd>15) dd=15;
if(isInSector(vecBallToBall,vecBallToOpp,20,dd)||isInSector(vecBallToBall,vecBallToOpp,30,5.0)
||isInSector(vecBallToBall,vecBallToOpp,50,2.0))
{
nOppInSector++;
if(vecBallToOpp.mod()>minAirDistance_s)
minAirDistance_s=vecBallToOpp.mod();
if(isInSector(vecBallToBall,vecBallToOpp,45,1.0))
nOppClose++;
}
if(isInSector(vecBallToBall, vecBallToOur,45, 5.0))
{
if(vecBallToOur.mod()>minAirDistance_s)
minAirDistance_s=vecBallToOur.mod();
}
}
// cannot get a satisfying destination
if(noDest==1) {
if(nOppInSector==0) {
theta=0; power=100;
return 75;
}
else {
theta=30; power=100;
return 75;
}
return possibility;
}
// no opp -- short pass
if(nOppInSector==0) {
theta=0;
power=(passDistance+0.4316)/0.2456;
return 100;
}
//long pass
if(minAirDistance_s>MAX_AIR_DISTANCE) {
theta=30;
power=100;
if(minAirDistance_s-MAX_AIR_DISTANCE<ALARM) {
possibility=50;
} else {
possibility=0;
}
return possibility;
} else {
possibility=0;
int flag = 0;
int min_index = 7;
for(int i=0;i<8;i++) {
int index = 7-i;
theta=coef_dis[index][0];
if(nOppClose)
{
if(theta<30)
break;
if( theta<45)
continue;
}
power=(passDistance-coef_dis[index][4])/coef_dis[index][3];
if(power>100||power<0)
continue;
double firstDis = coef_dis[index][1]*power+coef_dis[index][2];
if(firstDis-minAirDistance_s<0.5) {
if(minAirDistance_s-firstDis<ALARM) {
possibility=50;
}else {
possibility=0;
}
break;
}
else {
flag = 1;
min_index=index;
break;
}
}
if(flag==1) {
possibility = 100;
theta=coef_dis[min_index][0];
power=(passDistance-coef_dis[min_index][4])/coef_dis[min_index][3];
} else if(possibility==0 && nOppClose) {
possibility=25;
theta=50;
power=100;
}
return possibility;
}
}
bool Situation::shouldIDribble(bool isShoot)/////////////add by yzp
{
Vector3 goal(0,0,0);
Vector3 midgoal(X(100),0,0);
Vector3 pos = getWhereToKickTo();
bool ShouldIPass=false;
bool dribbleForward=true;
bool inCorner=false;
Vector3 delt;
if(pos.z>40)
ShouldIPass=true;
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 ang2ball=Normalize((global.wm.ballPos-global.wm.myPos).ang());
Angle ang2goal=Normalize((goal-global.wm.myPos).ang());
Angle ahead = (global.wm.ballPos-global.wm.myPos).ang();
if(global.wm.myPos.x>SS->mFieldLength/2-12&&global.wm.myPos.x<X(98)&&fabs(ang2goal)>45)
goal.x=SS->mFieldLength/2-3;
////////////////////yzp0501
else if(global.wm.myPos.x>=X(98)&&fabs(global.wm.myPos.y)>=Y(98)){
goal.x=X(40);
inCorner=true;
}
ang2goal=Normalize((goal-global.wm.myPos).ang());
Angle angmid=(midgoal-global.wm.myPos).ang();
if(global.wm.myPos.x<=SS->mFieldLength/2-16){////////////yzp0609
if(fabs(Normalize(ahead-ang2goal))>30&&fabs(Normalize(ahead-angmid))>30)
return false;
}
else if(global.wm.myPos.x>=SS->mFieldLength/2-3){
if(fabs(Normalize(ahead-ang2goal))>5)
return false;
}
else if(fabs(Normalize(ahead-ang2goal))>10&&fabs(Normalize(ahead-angmid))>10&&!isShoot)
return false;
for(int i=0;i<11;i++){
/////////////////////////yzp0429
delt = global.wm.oppPos[i]-global.wm.nextPos;
if(fabs(Normalize(delt.ang()-ang2goal))<15&&delt.mod()<12||(global.wm.nextPos-goal).mod()<=12){
dribbleForward=false;
break;
}
}
////////////////////yzp0501
if(inCorner){
dribbleForward=false;
ShouldIPass=false;
}
#ifdef WIN32
ShowPie(global.wm.myPos.x, global.wm.myPos.y, 12, ang2goal-15, ang2goal+15, "255 0 255 2");
#endif
if(dribbleForward)
return true;
if(isShoot||ShouldIPass)
return false;
return true;
}
bool Situation::shouldITurn(bool isShoot)////////add by yzp
{
if(isShoot)
return false;
bool turn=true;
for(int i=0;i<11;i++){
if((global.wm.oppPos[i]-global.wm.myPos).mod()>1.5)
continue;
turn=false;
}
return turn;
}
Vector3 Situation::passToMid()
{
Vector3 goal(0,0,0);
Vector3 goal1(X(100),SS->mGoalWidth/4,0);
Vector3 goal2(X(100),-SS->mGoalWidth/4,0);
Vector3 p;
Vector3 best;
Angle ang2goal;
double maxv=0;
Vector3 p_nearest(X(100),Y(0),0);
double v=0;
Vector3 myPos=global.wm.nextPos;
for(int i=6;i<11;i++){
if(global.wm.myNumber==i+1)
continue;
if(global.wm.ourPos[i].y>0)
goal=goal1;
else
goal=goal2;
ang2goal=(goal-global.wm.ourPos[i]).ang();
if(i>=8){/////////////yzp0608
for(Angle ang=-20;ang<=20;ang+=10){
p.x=global.wm.ourPos[i].x+cos((ang2goal+ang)/360*2*3.14)*1.5;
p.y=global.wm.ourPos[i].y+sin((ang2goal+ang)/360*2*3.14)*1.5;
if(p.x>SS->mFieldLength/2-0.5){
p.x=global.wm.ourPos[i].x+cos((ang2goal+ang)/360*2*3.14)*0.5;
p.y=global.wm.ourPos[i].y+sin((ang2goal+ang)/360*2*3.14)*0.5;
}
if((p-myPos).mod()<(p_nearest-myPos).mod())
p_nearest=p;
if((p-global.wm.myPos).mod()>25)
continue;
v=EvaluatePosVal(p).z;
if(v>maxv){
maxv=v;
best=p;
}
#ifdef WIN32
ShowCircle(p, 0.5, "200 200 200 2");
#endif
}
}
else{
p.x=global.wm.ourPos[i].x+cos(ang2goal/360*2*3.14)*2;
p.y=global.wm.ourPos[i].y+sin(ang2goal/360*2*3.14)*2;
if(p.x>SS->mFieldLength/2-0.5){
p.x=global.wm.ourPos[i].x+cos(ang2goal/360*2*3.14)*0.5;
p.y=global.wm.ourPos[i].y+sin(ang2goal/360*2*3.14)*0.5;
}
if((p-myPos).mod()<(p_nearest-myPos).mod())
p_nearest=p;
if((p-global.wm.myPos).mod()>25)
continue;
v=EvaluatePosVal(p).z;
if(v>maxv){
maxv=v;
best=p;
}
#ifdef WIN32
ShowCircle(p, 0.5, "200 200 200 2");
#endif
}
}
#ifdef WIN32
ShowCircle(best, 0.3, "0 200 200 2");
#endif
/*
if(maxv<40)
return goal;
else
return best;
*/
//////////////////yzp0501
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -