📄 soccerscene.cpp
字号:
} else {
Vector3 goal;
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;
}
as.interceptFastest(cmds, goal);
}
ActionSystem::AddCommandQueue(cmds);
} else {
//////////////////dribble/////////////////////////
if(ST->isBallKickable()){
#ifdef WIN32
ShowMessage("ball is kick able");
#endif
if(res){
if(isShoot || power > 100.0 - 1e-8 ||
(global.wm.oppPos[ST->oppByDist2Ball[0]] - global.wm.ballPos).mod() < 2
&& fabs(Normalize((global.wm.nextPos - global.wm.ballPos).ang() - (global.wm.oppPos[ST->oppByDist2Ball[0]] - global.wm.ballPos).ang())) > 45){
SoccerCommand cmd1,cmd2;
CommandList list;
AgentStatus a,b;
Vector3 dest;
double angleTopos;
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;
angleTopos=(b.pos-a.pos).ang();
dest=a.pos+Vector3(0.3,angleTopos,0,POLAR);/////////yzp0531
cmd1 =intercept.runTo(dest, angleTopos);
cmd2 = SoccerCommand(CT_KICK,theta,power);
for(int i=0;i<20;i++){
list.clear();
list.push_back(cmd1);
list.push_back(cmd2);
cmds.push_back(list);
}
AddCommandQueue(cmds);
} else{
SoccerCommand cmd1,cmd2;
CommandList list;
Vector3 ballPos=global.wm.ballPos+global.wm.ballVel;
Vector3 myPos=global.wm.nextPos;
Angle angleTopos=(ballPos-myPos).ang();
cmd1 =intercept.runTo(ballPos, angleTopos);
cmd2 = SoccerCommand(CT_KICK,theta,power);
list.clear();
list.push_back(cmd1);
list.push_back(cmd2);
cmds.push_back(list);
AddCommandQueue(cmds);
}
} else {
Vector3 opp2ball=global.wm.oppPos[ST->oppByDist2Ball[0]]-global.wm.ballPos;
Vector3 ball_agent=global.wm.ballPos-global.wm.myPos;
Angle ball_agent_angle=ball_agent.ang();
if(global.wm.ballPos.getDistToOurGoal()<18&&fabs(opp2ball.ang())<100&&ST->opp_ITInfo[ST->oppByDist2Ball[0]].dDist2Ball<1&&ST->opp_ITInfo[ST->oppByITCyc[0]].nCyc<4){
if(fabs(ball_agent_angle)>90&&global.wm.ballPos.x<-40&&fabs(global.wm.ballPos.y)<10) {
for(int i=0;i<19;i++) {
AddCommand(SoccerCommand(CT_KICK,50,100));
}
} else {
for(int i=0;i<19;i++) {
AddCommand(SoccerCommand(CT_KICK,30,100));
}
}
} else {
Vector3 p;
if(ST->isBallInOurControl()&&global.wm.myPos.x>=SS->mFieldLength/2-12) {
p=ST->passToMid();
} else if (ST->isBallInOurControl()&&global.wm.ballPos.x>0) {
p = ST->getBestPassPoint();
} else {
p = Vector3(X(100),0);
}
bool driForward=false;
Angle ang2ball=(global.wm.nextBallPos-global.wm.nextPos).ang();
Vector3 pp1(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);
for(int i=0;i<11;i++){
if((global.wm.oppPos[i]-global.wm.myPos).mod()>=1)
continue;
driForward=true;
}
if(driForward&&(global.wm.oppPos[0]-pp1).mod()>4.8){
as.dribbleForward( cmds);
} else {
as.interceptFastest(cmds,p);
}
ActionSystem::AddCommandQueue(cmds);
}
}
} else if(ST->shouldIIntercept()){
Vector3 p(X(98), 0, 0);
if(isShoot&&(global.wm.ballPos.getDistToOppGoal() < 12 ||
(global.wm.ballPos.getDistToOppGoal() < 20 && fabs(global.wm.ballPos.y) < 10))){
Vector3 apos=global.wm.nextPos;
Vector3 bpos = global.wm.ballPos+global.wm.ballVel;
Vector3 oppgoaliapos=global.wm.oppPos[0];
Vector3 g1=Vector3(X(100),SS->mGoalWidth/2.,0);
Vector3 g2=Vector3(X(100),-SS->mGoalWidth/2.,0);
Angle ang_ball2goaliaopp=(oppgoaliapos-bpos).ang();
Angle ang_ball2g1=(g1-bpos).ang();
Angle ang_ball2g2=(g2-bpos).ang();
Angle ang_adjust;
Dist dist_ball2goaliaopp=(oppgoaliapos-bpos).mod();
ang_adjust=asinDeg(1/dist_ball2goaliaopp);
Angle ang_ball2Goal1=ang_ball2goaliaopp+ang_adjust;
Angle ang_ball2Goal2=ang_ball2goaliaopp-ang_adjust;
Angle ang_b2a=(bpos-apos).ang();
if((ang_ball2Goal1>=ang_ball2g1-3&&ang_ball2Goal2<=ang_ball2g2+3)||ang_ball2Goal1<ang_ball2g2||ang_ball2Goal2>ang_ball2g1
||ang_ball2g1<-25||ang_ball2g2>25) {
if(global.wm.ballPos.x>X(95)&&fabs(global.wm.ballPos.y)<SS->mGoalWidth/2-0.5) {
p = Vector3(X(98),global.wm.ballPos.y,0);
}
} else {
Line l;
double value=0;
Angle dang1=ang_ball2g1-ang_ball2Goal1;
Angle dang2=-ang_ball2g2+ang_ball2Goal2;
if(dang1>0) {
Angle p_ang=(ang_ball2g1+ang_ball2Goal1)/2.;
double dang11=fabs(p_ang-ang_b2a);
l=l.makeLineFromPositionAndAngle(bpos, p_ang);
p.x=X(100);
p.y=l.getYGivenX(p.x);
#ifdef WIN32
ShowCircle(p,0.22,"0 255 0 2");
ShowLine(bpos,p,"255 120 0");
#endif
value=dang1/((p-bpos).mod()*(3+dang11/2));
}
if(dang2>0) {
Angle p_ang=(ang_ball2g2+ang_ball2Goal2)/2.;
double dang11=fabs(p_ang-ang_b2a);
l=l.makeLineFromPositionAndAngle(bpos, p_ang);
Vector3 tmp;
tmp.x=X(100);
tmp.y=l.getYGivenX(tmp.x);
#ifdef WIN32
ShowCircle(tmp,0.22,"0 255 0 2");
ShowLine(bpos,tmp,"255 120 0");
#endif
double valuetmp=dang2/((tmp-bpos).mod()*(3+dang11/2));
if(valuetmp>value) {
p=tmp;
}
}
}
} else {
if((ST->isBallInOurControl()&&global.wm.ballPos.x>-20&&global.wm.ballPos.getDistToOppGoal()>18)||global.wm.ballPos.getDistToOppGoal()<25) {
if(ST->isBallInOurControl()&&global.wm.myPos.x>=SS->mFieldLength/2-12
||(global.wm.myNumber>=9&&global.wm.myNumber<=11)) {
p=ST->passToMid();
} else {
p=ST->getBestPassPoint();
}
} else {
p = Vector3(X(90), 0, 0);
if(global.wm.ballPos.x<X(-20)) {
p=global.wm.ballPos;
p.x += 10;
}
if(ST->shouldIStopBall()) {//||(fabs(bvel.y)>0.2&&fabs(bvelang)>60&&fabs(bvelang)<120&&bpos.x>X(70)&&fabs(bpos.y)<SS->mGoalWidth))
as.interceptForStopBall(cmds);
} else {
as.interceptFastest(cmds,p);
}
ActionSystem::AddCommandQueue(cmds);
return;
}
}
#ifdef WIN32
ShowCircle(p.x, p.y, 0.4, "255 255 255 0");
#endif
as.interceptFastest(cmds,p);
ActionSystem::AddCommandQueue(cmds);
} else {
Vector3 pos;
pos = strategy.SBSPPosition(global.wm.myNumber);
if((global.wm.oppPos[ST->oppByDist2Ball[0]] - global.wm.ballPos).mod() < 2.5 &&
global.wm.ballPos.x<-20&&fabs(global.wm.ballPos.y)<20&&
global.wm.myNumber < 9 && global.wm.myNumber != 1&& global.wm.myNumber != 3&& global.wm.myNumber != 4){
Angle ang1,ang2;
ang1 = (Vector3(X(-100),0,0)-global.wm.ballPos).ang();
ang2 = (global.wm.nextPos-global.wm.ballPos).ang();
if(fabs(Normalize(ang1-ang2))<70){
Line l = Line::makeLineFromPositionAndAngle(global.wm.ballPos, ang1);
Vector3 o = l.getPointOnLineClosestTo(global.wm.nextPos);
#ifdef WIN32
ShowLine(global.wm.ballPos,100,ang1,"255 255 128");
ShowLine(global.wm.nextPos,o,"255 128 128");
#endif
if((o - global.wm.nextPos).mod() / ((o - global.wm.ballPos).mod() + 0.0001) < 1.2){
bool bFlag = true;
for(int i=0;i<11;i++){
if(i==global.wm.myNumber-1)
continue;
Vector3 oo = l.getPointOnLineClosestTo(global.wm.ourPos[i]);
if((oo - global.wm.nextPos).mod() / ((oo - global.wm.ballPos).mod() + 0.0001) < 1.2 &&
(oo - global.wm.ballPos).mod() < (o - global.wm.ballPos).mod()) {
Angle ang3 = (global.wm.ourPos[i]-global.wm.ballPos).ang();
if(fabs(Normalize(ang1-ang3))<70){
bFlag = false;
break;
}
}
}
if(bFlag){
if(fabs(Normalize(ang1-ang2))<30) {
pos = global.wm.ballPos;
} else {
pos = o;
}
}
}
}
}
bool revolve=false;
if(global.wm.myNumber>=9&&(global.wm.myPos-pos).mod()<1.5){
for(int k=0;k<11;k++){
if((global.wm.oppPos[k]-global.wm.myPos).mod()>1.5) {
continue;
}
revolve=true;
}
}
if(revolve) {
as.revolve(cmds);
} else {
as.runTo(cmds,pos);
}
ActionSystem::AddCommandQueue(cmds);
}
}
}
////////////////////////
//class SCENE_pass_center
////////////////////////
SCENE_pass_center::SCENE_pass_center()
{
}
SCENE_pass_center::~SCENE_pass_center()
{
}
bool SCENE_pass_center::isValid()
{
return false;
}
void SCENE_pass_center::Execute()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -