playerteams.cpp

来自「根据 trilearn_base_sources-3.3 (一般称做UVA底层)」· C++ 代码 · 共 423 行 · 第 1/2 页

CPP
423
字号
                         VecPosition( -51.5, posRightTop.getY()) );  static Line  lineLeft  = Line::makeLineFromTwoPoints(                         VecPosition( -51.5, posLeftTop.getY()), posLeftTop );  static Line  lineRight = Line::makeLineFromTwoPoints(                         VecPosition( -51.5, posRightTop.getY()),posRightTop );  //定义两个矩形用于判断开球时哪一侧对方球员比较多  static Rect rectLeft(VecPosition(-35,-5),VecPosition(-20,-20));  static Rect rectRight(VecPosition(-35,20),VecPosition(-20,5));  //开球之后  if( !WM->isBeforeKickOff( ) )  {    //足球位置的可信度过低,去寻找球的位置    if( WM->getConfidence( OBJECT_BALL ) < PS->getBallConfThr() )    {                                                // confidence ball too  low      ACT->putCommandInQueue( SoccerCommand( CMD_CHANGEVIEW, VA_WIDE, VQ_HIGH ) );      ACT->putCommandInQueue( searchBall() );        // search ball      ACT->putCommandInQueue( alignNeckWithBody( ) );    }    //如果比赛的模式是正在比赛中,或者是对方的几种可能靠近我方球门的死球    else if( WM->getPlayMode() == PM_PLAY_ON || WM->isFreeKickThem() ||WM->isFreeKickFaultUs()          || WM->isCornerKickThem() || WM->isBackPassUs()  )    {      //根据周期的不同连续更换视觉状态      if( cycle % 2 == 0 )      { ACT->putCommandInQueue( SoccerCommand( CMD_CHANGEVIEW, VA_NORMAL, VQ_HIGH ) ); }      else      { ACT->putCommandInQueue( SoccerCommand( CMD_CHANGEVIEW, VA_NARROW, VQ_HIGH ) ); }      //判断现在是谁正在控球      who_control=WM->whoControlBall(&distUs,&distThem);      //如果和last_control不同并且不是一个无效值,需要更新last_control      if( who_control!=last_control && who_control!= CONTROL_ILLEGAL &&          who_control!=CONTROL_NONE )//&& who_control!= CONTROL_UNKNOW )      { last_control=who_control; }      //可以扑到球的话,而且不是我方球员的回传球      if( WM->isBallCatchable() && last_control!=CONTROL_US )      {        //cout<<"Goalie:catch ball!"<<endl;        ACT->putCommandInQueue( soc = catchBall() );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }      //如果球是可以踢到的      else if( WM->isBallKickable() )      {        //cout<<"Goalie:kick ball!"<<endl;        //将球踢向中场的两侧        soc = kickTo( VecPosition(0,sign(posAgent.getY())*PITCH_W_HALF), 3.0 );        ACT->putCommandInQueue( soc );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }      //在球正飞向我们的球门时      else if( WM->isBallHeadingToGoal() )      {        cout<<cycle<<":warning!Ball is heading to goal!"<<endl;        //截住飞向球门的球        soc = interceptScoringAttempt( );        ACT->putCommandInQueue( soc );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }      //在截球点我们的禁区内,并且守门员是可以最快截球的队员(含对方球员)      else if( WM->isInOwnPenaltyArea(getInterceptionPointBall( &i, true )) &&               WM->getFastestInSetTo( OBJECT_SET_PLAYERS, OBJECT_BALL, &i ) ==                                                 WM->getAgentObjectType() )      {        //cout<<"Goalie:intercept the ball!"<<endl;        ACT->putCommandInQueue( soc = intercept( true ) );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }      //在产生单刀情况时      else if(WM->isDanDao(&posUs,&posThem))      {        cout<<cycle<<":warning!There is a DanDao!"<<endl;        //紧急截球        soc = intercept( true );        ACT->putCommandInQueue( soc );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }      //在球已经距离我方球门很远时      else if(posBall.getX()>-25)      {        VecPosition pos( -49.5, 0 );        //如果距离本位点过远,需要跑动        if( posAgent.getDistanceTo( pos ) > 1.0 )        {          soc = moveToPos( pos, PS->getPlayerWhenToTurnAngle() );          //保存体力          if( soc.commandType == CMD_DASH )          {            if( WM->getAgentStamina().getStamina()<3000 )            {              soc.dPower = 30.0*WM->getAgentStamina().getRecovery();            }            else if( WM->getAgentStamina().getStamina()<2000 && dist<5 )            {              soc.dPower = 10.0*WM->getAgentStamina().getRecovery();            }          }        }        //否则转向足球就可以了        else        {          soc = turnBodyToObject( OBJECT_BALL );        }        ACT->putCommandInQueue( soc );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }      //其它情况(就是说球不是处于上面所说的特殊状况,而且也不是距离球门很远)      else      {        //在球门线上防守        if( posBall.getX()< posAgent.getX() )        { soc = defendGoalLine( 52.5 - fabs( posBall.getX() ) ); }        else        { soc = defendGoalLine( 3.0 ); }        ACT->putCommandInQueue( soc );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }    }    //如果是我们的任意球或者门球    else if( WM->isFreeKickUs() == true || WM->isGoalKickUs() ==true )    {      //已经可以踢球了      if( WM->isBallKickable() )      {        //如果是在拿到球20个周期了        if( WM->getTimeSinceLastCatch() == 20 && WM->isFreeKickUs() )        {          //移动到对方球员更少的一边          if( WM->getNrInSetInRectangle(OBJECT_SET_OPPONENTS,&rectLeft) <              WM->getNrInSetInRectangle(OBJECT_SET_OPPONENTS,&rectRight) )          { soc = teleportToPos(posLeftTop); }          else          { soc = teleportToPos(posRightTop); }          //命令入队列          ACT->putCommandInQueue( soc );        }        //已经大于35周期了,发球        else if( WM->getTimeSinceLastCatch() > 35 )        {          soc = kickTo( VecPosition(0,sign(posAgent.getY())*PITCH_W_HALF), 3.0 );          ACT->putCommandInQueue( soc );        }        //30个周期以内的时候        else if( WM->getTimeSinceLastCatch() < 30 )        {          VecPosition posSide( 0.0, posAgent.getY() );           if( fabs( (posSide - posAgent).getDirection() - angBody) > 10 )          {            soc = turnBodyToPoint( posSide );            ACT->putCommandInQueue( soc );          }          ACT->putCommandInQueue( lookAround( 45.0,soc ) );        }      }      //是门球的话首先需要跑向发球点      else if( WM->isGoalKickUs() )      {        //跑向发球点        soc = intercept( true ) ;        //保存体力        if(soc.commandType == CMD_DASH)        {          if( WM->getAgentStamina().getStamina()<3000 )          {            soc.dPower=30.0*WM->getAgentStamina().getRecovery();          }          else if( WM->getAgentStamina().getStamina()<2000 && dist<5 )          {            soc.dPower=0.0*WM->getAgentStamina().getRecovery();          }        }        //命令入队列        ACT->putCommandInQueue( soc );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }      //否则转向球看就可以了      else        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );    }    else    {      ACT->putCommandInQueue( soc = turnBodyToObject( OBJECT_BALL ) );      ACT->putCommandInQueue( lookAround( 45.0,soc ) );    }  }  //开球之前  else  {    //阵形不是默认开球阵形的话,更改阵形    if( formations->getFormation() != FT_BlueSky_INIT )    {      formations->setFormation( FT_BlueSky_INIT );    }    //距离本位点过远的情况下,将球员直接移动到本位点    if( posAgent.getDistanceTo( WM->getStrategicPosition() ) > 2.0 )    {      ACT->putCommandInQueue( soc=teleportToPos( WM->getStrategicPosition() ));    }    //否则的话转向球场正中央    else    {      ACT->putCommandInQueue( soc = turnBodyToPoint( VecPosition( 0, 0 ), 0 ));      ACT->putCommandInQueue( lookAround( 45.0,soc ) );    }  }  return soc;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?