主頁 >  其他 > 合工大機器人足球仿真考試題56題(底層uva)

合工大機器人足球仿真考試題56題(底層uva)

2020-10-28 13:59:32 其他

題目要求

//拿球后行為,利用已有 Worldmodel(21)
(1)在 playOn 模式下,拿到球以后朝前方快速帶球,
(2)在 PlayOn 模式下,拿到球以后朝球門方向慢速帶球,
(3)在 playOn 模式下,拿到球以后把球圍繞自己身體逆時針轉,
(4)在 playOn 模式下,拿到球后,有人逼搶(自身周圍 7 米范圍有至少 1 名對方
球員),則把球踢到距離對手的另外一側,安全帶球(如對手在右側,把球踢
到左側,如對手仔左側,把球踢到右側),
(5)在 playOn 模式下,拿到球以后,有人逼搶,傳球給最近的隊友;否則向球門
方向快速帶球,
(6)在 playOn 模式下,如果有人逼搶(自身周圍 7 米范圍有至少 1 名對方球員), 則安全帶球;否則向球門方向快速帶球,
(7)在 PlayOn 模式下,若前方沒有對方球員,則直接以最大速度向對方球門射門
(周期數為偶數,球門的右側射門,周期為奇數,向球門的左側射門),
(8)在 playOn 模式下,拿到球后,在本方半場踢到球場中心點;過了半場,快速
帶球到對方球門,
(9)在 PlayOn 模式下,拿到球后,把傳給最近的周圍沒人防守的隊友(沒有人防
守以其周圍 5 米范圍是否有對方球員為準)腳下,
(10) 在 playOn 模式下,拿到球后,把球傳給最靠近自己的前方的沒人防守的
隊友(判斷隊友身邊 5 米范圍是否有對方防守隊員),
(11) 在 playOn 模式下,拿到球后以后,在本方半場傳給次近的隊友;在對方
半場,非 10 號球員傳球給 10 號球員,10 號球員則快速向球門方向帶球,
(12) 在 playOn 模式下,如果在本方半場,則朝前方慢速帶球,如果在對方半
場,則朝球門快速帶球,
(13) 在 playOn 模式下,拿到球后,如果是 2 號,則把球踢到左側邊線,如果
是 5 號,則把球踢到右側邊線,并把脖子方向轉向球;其他球員則向前帶球,
(14) 在 playOn 模式下,拿到球后,如果 4 號,則傳球給 7 號; 否則的話,傳
球給最近的隊友;到對方禁區后以最大速度射向空隙大的球門一側,
(15) 在 playOn 模式下,拿球后垂直帶球,
(16) 在 playOn 模式下,拿到球后帶球到達球場中心;在球場中心附近位置(中 心位置周圍 2 米半徑范圍內)傳給最近的球員,
(17) 在 playOn 模式下,如果 10 號控球,則其帶球前進,然后 5 號跟著 10
號一起前進,兩球員在同一水平線上,且距離為 5,
(18) 在 playon 模式下,如果是 10 號球員,在可踢球的狀態下,如果自身的
x 軸坐標大于 30,則直接朝著離對方球員遠的球門點射門,
(19) 在 playOn 模式下,如果是 9 號拿到球,則令 9 號和 10 號同時沖至敵方
球門處,在球門前,9 號傳給 10 號,由 10 號進行射門
(20) 在 playOn 模式下,如果我是 4 號球員并且拿到了球,則傳給 7 號球員,
同時 7 號球員再傳給 9 號球員,9 號球員繼續以最大速度沖到球門處射門,
(21) 在 playOn 模式下,如果在我方半場拿到球,則向中場線以最大的速度踢,
如果在敵方半場拿到球,則向敵方球門處以最大的速度踢
//拿球以后,需要自己添加 WorldModel 函式(12)
(22) 在 playOn 模式下,拿球后傳球給更靠近對方球門的最近隊友,
(23) 在 playOn 模式下,拿球后,搜索前方-30~30 之間距離自己 20 米內是否
有隊友,如果有則傳給該隊友,否則自己帶球,
(24) 在 playon 模式下,求出 y 軸等于 0 的兩側的對方球員數量,將球傳向對
手少的一方,并且 x 軸值最大的隊友,
(25) 在 playon 模式下,如果自身 7 米范圍內有兩個或兩個以上的對手的話,
則傳球到 x 軸值最大的隊友,
(26) 在 playon 模式下,求出己方的越位線,存在可以踢球的隊友的話,如果
自身是 10 號,那么 10 球員垂直跑向越位線的 x 軸值-2 米,y 軸不變的點,
(27) 在 playon 的模式下,求出球運動方向(即求出其對應的直線方程),并
且求出自己到該直線的距離,如果距離小于 4 的話,那么就垂直跑向該條直
線,
(28) 在 playon 的模式下,如果是自己可以踢球的狀態下,如果自身 7 米內沒
有對方球員的話,則快速帶球,帶球方向是朝著點(53,0)方向,
(29) 在 playon 的模式下,如果距離球最近的是我方隊友的話,如果我的 x
坐標小于 30 的話,并且我是 10 號,那么我跑向球的坐標加上(0,10)的坐
標位置,
(30) 在 playon 的模式下,發現前方沒有隊友的時候,如果自身 5 米內有兩個
及兩個以上的對手的話,那么將球傳給最近的隊友,
(31) 在 playon 的模式下,發現前方沒有對方球員的時候,則快速向球門放向
帶球,距離守門員 5-10 米時向空隙較大的一側射門,
(32) 在 playon 的模式下,發現前方沒有對方球員的時候,則快速向球門放向
帶球,距離守門員 5-10 米時向空隙較大的一側射門,
(33) 在 playon 的模式下,(8,9,10,11)前方沒有對方球員的時候,則快 速向球門放向帶球,距離守門員 5-10 米時向空隙較大的一側射門,
//其他比賽模式下,進攻行為(8)
(34) 在本方角球模式下,如果自己是 10 號球員,則跑向角球點,并開球(球
可踢,則踢球給 9 號);如果自己是 9 號球員,則跑向距離角球點附近(隨
機選一點),準備接應球,其他球員跑本位點.
(35) 在本方邊線球模式下,如果自己是距離球最近的隊員,跑向球;并開球
(球在自己腳下則把球傳給最近的隊友),
(36) 在本方邊線球模式下,在本方半場左側,則由 2 號去發;如果是本方半
場右側,則由 5 號去發;球在 2 號或者 5 號腳下,則踢向距離自己最近的隊
友,
(37) 在本方邊線球的模式下,如果我是距離第二近的隊友的話,那么我也跑
朝著球的位置跑,直到距離球 7 米的范圍,
(38) 在本方邊線球的模式下,如果我是 4 號的話,并且距離球最近的隊友不
是我,那么我將跑向球的坐標加上(5,0)的位置上去,
(39) 在本方邊線球的模式下,如果我是距離球第二近的隊友,那么我跑向距
離球 12 米的范圍內,并且距離對方球門點(53,0)最近的點,
(40) 在本方邊線球的模式下,距離球最近的隊友跑向球并開球,如果我不是
距離球第二近的隊友,那么我向自身向量(5,0)的方向跑去,
(41) 在本方邊線球的模式下,距離球最近的隊友跑向球并開球,如果我不是
距離球第二近的隊友,那么求出距離球第二近的隊友的坐標加上(10,5)的
點;如果該點在球場內,則跑向該點,如果該點在場外,則計算距離該點最 近的邊界點,
//playOn 模式下,防守行為(8)
(42) 在 playOn 模式下,5 號球員與拿球的對方球員的距離始終為 5,
(43) 在 playOn 模式下,2 號和 4 號一起去盯防對方拿球隊員,
(44) 在 playOn 模式下,如果對方 10 號拿球,如果我是 2、3、4 號,則去盯
防 10 號,
(45) 在 playOn 模式下,如對方 9 號拿球,我方 2、3、4 號距離球最近的球員
去盯防 9 號,其他隊員盯防距離自己最近的對方球員
(46) 在 playOn 模式下,如果對方比我先接近球,則離球最近的隊員去盯球,
其他球員盯防距離自己最近的對方球員,
(47) 在 playOn 模式下,如果對方 11 號拿到球,則 7 號球員從左邊去斷球,8 號球員從右邊去斷球,
(48) 在 playOn 模式下,防守模式下(即球不在我方球員腳下),我方 6 號球
員始終跟著敵方 9 號,我方 7 號始終跟著敵方 10 號,8 號球員始終跟著敵方
11 號球員,
(49) 在 playOn 模式下,防守模式下(即球不在我方球員腳下),我方距離球
最近的 2 名隊員負責去盯防對方離球最近的球員,其他球員其他球員采用人 球都盯的方式盯防防距離自己最近的對方球員(即跑到距離自己最近的對方
球員的可能接球路線的前面位置點) //其他比賽模式下,防守行為(7)
(50) 在對方邊線球的模式下,如果我是 4 號,那么我就跑向距離球最近的對
方球員處,
(51) 在對方邊線球的模式下,如果我是距離球第二近的隊員的話,那么我跑
向距離球第二近的對方球員的位置,
(52) 在對方角球模式情況下,如果球在我方左側,則 2,3,6,7 號平均分布
在以球的位置為圓心,半徑 10 米的圓弧上(其中 2 號的初始位置可以自行設
定,間距也可以自行設定,但是需要保證 2,3,6,7 都在場內);如果球在
我方右側,則 4,5,7,8 號平均分布在以球的位置為圓心,半徑 10 米的圓 弧上(其中 4 號的初始位置可以自行設定,間距也可以自行設定,但是需要
保證 4,5,7,8 都在場內),
(53) 在對方邊線球的模式下,如果我不是距離球最近的隊友,并且我的 x 軸
坐標大于 0 的話,那么我跑向自身位置加(-10,0)的點的位置去,
(54) 在對方邊線球的模式下,如果我身邊 5 米內有對方球員的話,那么我跑
向身邊對方球員的位置,并且我的 x 軸坐標的值要比該對方的大 2,
(55) 在對方邊線球的模式下,如果球的位置的 x 軸小于 0,如果我是 4 號或 5
號的話,一起跑向距離球第二近的對方球員的位置,
(56) 在對方角球模式情況下,如果球在我方左側,則 2,3 號負責盯防對方距 離球第二近的對方球員;如果球在我方右側,則 4,5 號負責盯防對方距離球
第二近的對方球員,

注:本代碼中的fabs(),sqrt()函式,由于使用的時候編譯器報錯,添加了檔案還是報錯,所以使用這兩個函式的時候注意,
本代碼未經測驗,僅供參考,如有錯誤,歡迎指正!如有更好地思路,歡迎交流!

添加函式
WorldModel.h
    /*************************add***************************/
    /*----------------start---------------------*/
    ObjectT getTeammateClosestToGoalAndAgent();
    ObjectT getTeammateAtAngleDist( AngDeg ang1, AngDeg ang2, double dist );
    int getOpponentNumSideY( int mark );
    ObjectT getXMaxTeammateBySide( int mark );
    ObjectT getClosestFlagToPos( VecPosition pos );
    bool isTeammateAtAngle( AngDeg ang1, AngDeg ang2 );
    double getAgentDistFromGoalie();
    ObjectT getNearestBallObj( ObjectT obj1, ObjectT obj2);
    ObjectT getOppByDistAndPos( double dist, double x, double y );
    /*----------------end----------------------*/
WorldModel.cpp
/****************************add***************************/
/*----------------------start-------------------------------*/
ObjectT WorldModel::getTeammateClosestToGoalAndAgent()
{
    int iIndex;
    ObjectT closeAgent = OBJECT_ILLEGAL;
    ObjectT closeBoth = OBJECT_ILLEGAL;
    VecPosition posGoal( 52.5, 0 );
    VecPosition posAgent = getGlobalPosition( getAgentObjectType() );
    
    for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_TEAMMATES);
         o == OBJECT_ILLEGAL;
         o = iterateObjectNext(iIndex, OBJECT_SET_TEAMMATES))
    {  
        if( closeAgent==OBJECT_ILLEGAL || posAgent.getDistanceTo( o )<posAgent.getDistanceTo( closeAgent ))
        {
            closeAgent = o;
            if( closeBoth==OBJECT_ILLEGAL || posGoal.getDistanceTo( closeAgent )<posGoal.getDistanceTo( closeBoth ))
                closeBoth = closeAgent;
        }   
    }
    iterateObjectDone( iIndex );
    return closeBoth; 
}

ObjectT WorldModel::getTeammateAtAngleDist( AngDeg ang1, AngDeg ang2, double dist)
{
    VecPosition posAgent = getAgentGlobalPosition();
    VecPosition posTeammate;
    AngDeg ang;
    int iIndex;
    
    for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_TEAMMATES);
         o == OBJECT_ILLEGAL;
         o = iterateObjectNext(iIndex, OBJECT_SET_TEAMMATES))
    {
        posTeammate = getGlobalPosition( o );
        ang = (posTeammate - posAgent).getDirection();
        if( (ang>=ang1 && ang<=ang2) && (posAgent.getDistanceTo(posTeammate) < dist))
            return o;
    }
    iterateObjectDone(iIndex);
    
    return OBJECT_UNKNOWN;
}

int WorldModel::getOpponentNumSideY( int mark )// mark<0獲得 Y<0半場 對方球員 數
{
    VecPosition posOpp;
    int iIndex;
    int oppNumT;
    int oppNumB;
    
    for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_OPPONENTS);
         o == OBJECT_ILLEGAL;
         o = iterateObjectNext(iIndex, OBJECT_SET_OPPONENTS))
    {
        posOpp = getGlobalPosition( o );
        if( posOpp.getY() < 0 )
            oppNumT++;
        else if( posOpp.getY() > 0)
            oppNumB++;
    }
    iterateObjectDone(iIndex);
    
    if( mark < 0)
        return oppNumT;
    else if( mark > 0)
        return oppNumB;
    else
        return 65001;
}

ObjectT WorldModel::getXMaxTeammateBySide( int mark )// mark<0獲得 Y<0半場
{
    int iIndex;
    ObjectT maxTeammate = OBJECT_ILLEGAL;
    
    for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_TEAMMATES);
         o == OBJECT_ILLEGAL;
         o = iterateObjectNext(iIndex, OBJECT_SET_TEAMMATES))
    {
        VecPosition pos = getGlobalPosition( o );
        if( (pos.getY()<0 && mark<0) || (pos.getY()>0 && mark>0) )
        {
            if( maxTeammate==OBJECT_ILLEGAL || pos.getX()>getGlobalPosition( maxTeammate ).getX() )
                maxTeammate = o;
        }
    }
    iterateObjectDone( iIndex );
    return  maxTeammate; 
}

ObjectT WorldModel::getClosestFlagToPos( VecPosition pos )
{
    int iIndex;
    double dist = 65001;
    ObjectT flag = OBJECT_ILLEGAL; 
    
    for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_FLAGS);
         o == OBJECT_ILLEGAL;
         o = iterateObjectNext(iIndex, OBJECT_SET_FLAGS))
    {
        if( pos.getDistanceTo( o ) < dist )
        {
            dist = pos.getDistanceTo( o );
            flag = o;
        }
    }
    iterateObjectDone( iIndex );
    return flag; 
}
bool WorldModel::isTeammateAtAngle( AngDeg ang1, AngDeg ang2 )
{
    VecPosition posAgent = getAgentGlobalPosition();
    VecPosition posTeammate;
    AngDeg ang;
    int iIndex;
    
    for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_TEAMMATES);
         o == OBJECT_ILLEGAL;
         o = iterateObjectNext(iIndex, OBJECT_SET_TEAMMATES))
    {
        posTeammate = getGlobalPosition( o );
        ang = (posTeammate - posAgent).getDirection();
        if( ang>=ang1 && ang<=ang2 )
            return true;    
    }
    iterateObjectDone(iIndex);
    return false;
}

double WorldModel::getAgentDistFromGoalie()
{
    VecPosition posAgent = getAgentGlobalPosition();
    VecPosition posGoalie = getGlobalPosition( getOppGoalieType() );
    
    return  posAgent.getDistanceTo( posGoalie );

}

ObjectT WorldModel::getNearestBallObj( ObjectT obj1, ObjectT obj2)
{
    VecPosition pos1 = getGlobalPosition( obj1 );
    VecPosition pos2 = getGlobalPosition( obj2 );
    VecPosition posBall = getGlobalPosition( OBJECT_BALL );
    double dist1 = posBall.getDistanceTo( pos1 );
    double dist2 = posBall.getDistanceTo( pos2 );
    if( dist1 >= dist2 )
        return obj1;
    else
        return obj2;
}

//獲得與我距離dist,x軸坐標值相差x,y軸坐標值相差y的對方球員
ObjectT WorldModel::getOppByDistAndPos( const double dist, const double x, const double y )
{
    int iIndex;
    VecPosition posAgent = getAgentGlobalPosition();
    for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_OPPONENTS);
         o == OBJECT_ILLEGAL;
         o = iterateObjectNext(iIndex, OBJECT_SET_OPPONENTS))
    {
        VecPosition pos = getGlobalPosition( o );
        if( posAgent.getDistanceTo( o )==dist && (posAgent.getX()-pos.getX())==x &&(posAgent.getY()-pos.getY())==y )
            return o;
    }
    iterateObjectDone( iIndex );
}
/*-----------------------end------------------------------*/


PlayerTeams.cpp
 /*********************exam questions****************************/
        /*---------------------------start-------------------------------*/
        /*1*/
        if( WM->isBallKickable() )
        {
            AngDeg ang = 0.0;
            soc = dribble( ang, DRIBBLE_FAST );
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*2*/
        if( WM->isBallKickable() )
        {
            VecPosition vec = VecPosition(52.5, 0) - WM->getAgentGlobalPosition();//我的位置到球門位置的向量
            AngDeg ang = vec.getDirection(); //獲得角度
            soc = dribble( ang, DRIBBLE_SLOW );
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*3*/
        if( WM->isBallKickable() )
        {
            soc = kickBallCloseToBody(-180);//逆時針旋轉角度為負
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*4*/
        if( WM->isBallKickable() )
        {
            Circle cir( posAgent, 7.0 );  //建立以自身位置 為圓心,7 為半徑的圓
            int oppNum = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir ); //獲得圓內 對方球員的個數
            if( oppNum >= 1 )
            {
                ObjectT opp = WM->getClosestInSetTo(OBJECT_SET_OPPONENTS, posAgent);//獲得 離我最近的對方球員
                VecPosition oppPos = WM->getGlobalPosition(opp);  //獲得他的  位置
                VecPosition  meOpp = oppPos - posAgent; // 我與他連線的向量
                AngDeg ang = meOpp.getDirection();
                if( ang >= 0 )
                {
                    ang -= 60;
                }
                else
                {
                    ang += 60;
                }
                soc = dribble( ang, DRIBBLE_ILLEGAL );               
            }
            else
            {
                soc = dribble( 0.0, DRIBBLE_FAST );//否則向前快速 帶球,可寫可不寫
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*5*/
        if( WM->isBallKickable() )
        {
            Circle cir( posAgent, 7.0 );
            int oppNum = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir );
            if( oppNum >= 1)
            {
                ObjectT teammate = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, posAgent );//獲得離我最 近的隊友
                VecPosition vec = WM->getGlobalPosition( teammate ) - posAgent;
                soc = kickTo( vec, PS->getPassEndSpeed() );
            }
            else
            {
                soc = dribble( (VecPosition(52.5, 0) - posAgent).getDirection(), DRIBBLE_FAST );
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*6*/
        if( WM->isBallKickable() )
        {
            Circle cir( posAgent, 7.0 );
            int oppNum = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir );
            AngDeg ang = (VecPosition(52.5, 0) - posAgent).getDirection();
            if( oppNum >= 1)
            {
                soc = dribble( ang, DRIBBLE_ILLEGAL );
            }
            else
            {
                soc = dribble( ang, DRIBBLE_FAST );
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*7*/
        if( WM->isBallKickable() )
        {
            if( WM->isOpponentAtAngle(-30.0, 30.0) )//如果  我前方60度范圍內沒有 對方球員
            {
                VecPosition posGoal( PITCH_LENGTH/2.0,
                                     (-1 + 2*(WM->getCurrentCycle()%2)) * 0.4 * SS->getGoalWidth() );//根據當前的周期數  交替的 踢向球門的 兩個死角
                soc = kickTo( posGoal, SS->getBallSpeedMax() );
                ACT->putCommandInQueue( soc );
                ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
            }
        }
        
        /*8*/
        if( WM->isBallKickable() )
        {
            if( posBall.getX() < 0)// 球在我方半場
            {
                soc = kickTo( VecPosition(0.0, 0.0), PS->getPassEndSpeed() );
            }
            else
            {
                soc = dribble( (VecPosition(52.5, 0) - posAgent).getDirection(), DRIBBLE_FAST );
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*9*/
        if( WM->isBallKickable() )
        {
            ObjectT teammate = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, posAgent );
            Circle cir( WM->getGlobalPosition(teammate), 5.0 );
            int oppNum = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir );
            if( oppNum <= 0 )
            {
                soc = leadingPass( teammate, PS->getPassEndSpeed() );
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*10*/
        if( WM->isBallKickable() )
        {
            ObjectT teammate = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, posAgent );
            VecPosition teammatePos = WM->getGlobalPosition( teammate );
            Circle cir( teammatePos, 5.0 );
            int oppNum = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir );
            AngDeg ang = ( teammatePos - posAgent ).getDirection();
            if( oppNum<=0 && (ang>=-90 && ang<=90) )//判斷 該 隊友是否有人 防守 是否  在我  前方
            {
                soc = leadingPass( teammate, PS->getPassEndSpeed() );
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*11*/
        if( WM->isBallKickable() )
        {
            if( posBall.getX() < 0 )
            {
                soc = leadingPass( WM->getSecondClosestInSetTo( OBJECT_SET_TEAMMATES, WM->getAgentObjectType() ), PS->getPassEndSpeed() );
            }
            else
            {
                if( WM->getAgentObjectType() == OBJECT_TEAMMATE_10 )//如果 我是 10號
                    soc = dribble( VecPosition(52.5, 0).getDirection(), DRIBBLE_FAST );
                else
                    soc = leadingPass( OBJECT_TEAMMATE_10, PS->getPassEndSpeed() );
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*12*/
        if( WM->isBallKickable() )
        {
            if( posBall.getX() < 0)
                soc = dribble( 0.0, DRIBBLE_SLOW );
            else
                soc = dribble( (VecPosition(52.5, 0)- posAgent).getDirection(), DRIBBLE_FAST );
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*13*/
        if( WM->isBallKickable() )
        {
            if( WM->getAgentObjectType() == OBJECT_TEAMMATE_2 )
            {
                soc = kickTo( VecPosition( posBall.getX(), -34 ), PS->getPassEndSpeed() );              
                ACT->putCommandInQueue( soc );
            }
            else if( WM->getAgentObjectType() == OBJECT_TEAMMATE_5 )
            {
                soc = kickTo( VecPosition( posBall.getX(), 34 ), PS->getPassEndSpeed() );
                ACT->putCommandInQueue( soc );
                ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
            }
            else
            {
                soc = dribble( 0.0, DRIBBLE_ILLEGAL );
                ACT->putCommandInQueue( soc );
                ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
            }
        }
        
        /*14*/
        if( WM->isBallKickable() )
        {
            if( WM->getAgentObjectType() == OBJECT_TEAMMATE_4 )
                soc = leadingPass( OBJECT_TEAMMATE_7, PS->getPassEndSpeed() );
            else
                soc = leadingPass( WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, posAgent), PS->getPassEndSpeed() );
            if( WM->isInTheirPenaltyArea( posBall ))//如果在 對方禁區
            {
                 VecPosition posGoalie = WM->getGlobalPosition( OBJECT_OPPONENT_GOALIE );//對方守門員位置
                 AngDeg meGoalie = (posGoalie - posAgent).getDirection();
                 AngDeg angTop = ( VecPosition(52.5, 6.0) - posAgent ).getDirection();
                 AngDeg angBottom = ( VecPosition(52.5 -6.0) - posAgent ).getDirection();
                 // 由于編譯器不支持我使用fabs()函式,所以這里采用這種形式求絕對值
                 AngDeg ang1 = (angTop-meGoalie)>=0 ? (angTop-meGoalie) : (-1)*(angTop-meGoalie);
                 AngDeg ang2 = (angBottom-meGoalie)>=0 ? (angBottom-meGoalie) : (-1)*(angBottom-meGoalie);
                  if( ang1 >= ang2 )
                      soc = kickTo( VecPosition(52.5, 6.0) - posAgent, SS->getBallSpeedMax() );
                  else
                      soc = kickTo( VecPosition(52.5, -6.0) - posAgent, SS->getBallSpeedMax() );
                  ACT->putCommandInQueue( soc );
                  ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
            }
        }
        
        /*15*/
        if( WM->isBallKickable() )
        {
            //  沿著y軸 跑
            if( posBall.getY() <= 0)
                soc = dribble( -90, DRIBBLE_SLOW );
            else
                soc = dribble( 90, DRIBBLE_SLOW );
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*16*/
        if( WM->isBallKickable() )
        {
            soc = dribble( (VecPosition(0,0)-posAgent).getDirection(), DRIBBLE_WITHBALL );//拿到球后帶球到達球場中心
 
            ObjectT teammate = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, posAgent );
            if( posAgent.getDistanceTo( teammate ) <= 2.0)
                soc = leadingPass( teammate, PS->getPassEndSpeed() );
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
            
        /*17*/
        if( WM->getPlayerNumber() == 10 )
        {
            soc = dribble( 0.0, DRIBBLE_WITHBALL );
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        if( WM->getPlayerNumber() == 5)
        {
            VecPosition pos( posBall.getX() - 5, posBall.getY() ); //保持五米
            soc = moveToPos( pos, PS->getPlayerWhenToTurnAngle() );
            ACT->putCommandInQueue( soc );
        }
        
        /*18*/
        if( WM->getPlayerNumber()==10 && WM->isBallKickable() && posAgent.getX()>30 )
        {
            VecPosition posGoalie = WM->getGlobalPosition( OBJECT_OPPONENT_GOALIE );
            AngDeg meGoalie = (posGoalie - posAgent).getDirection();
            AngDeg angTop = ( VecPosition(52.5, 6.0) - posAgent ).getDirection();
            AngDeg angBottom = ( VecPosition(52.5 -6.0) - posAgent ).getDirection();
            // 由于編譯器不支持我使用fabs()函式,所以這里采用這種形式求絕對值
            //AngDeg ang1 = (angTop-meGoalie)>=0 ? (angTop-meGoalie) : (-1)*(angTop-meGoalie);
            //AngDeg ang2 = (angBottom-meGoalie)>=0 ? (angBottom-meGoalie) : (-1)*(angBottom-meGoalie);
             if( fabs(angTop-meGoalie) >= fabs(angBottom-meGoalie) )
                 soc = kickTo( VecPosition(52.5, 6.0) - posAgent, SS->getBallSpeedMax() );
             else
                 soc = kickTo( VecPosition(52.5, -6.0) - posAgent, SS->getBallSpeedMax() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*19*/
        if( WM->getPlayerNumber()==9 && WM->isBallKickable() )
        {
            soc = dribble( (VecPosition(52.5, 0)-posAgent).getDirection(), DRIBBLE_FAST );//9號快速帶球  到球門 處
            if( WM->getAgentObjectType() == OBJECT_TEAMMATE_10 )
                soc = dashToPoint( VecPosition(52.5, 0), WM->getCurrentCycle() );//10號跑向球門
            if( WM->isInTheirPenaltyArea( posBall ) )
            {
                soc = leadingPass( OBJECT_TEAMMATE_10, PS->getPassEndSpeed() );//傳球給 10號
                if( WM->getAgentObjectType() == OBJECT_TEAMMATE_10 )
                    soc = kickTo( (VecPosition(52.5, 0) - posAgent).getDirection(), SS->getBallSpeedMax() );
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*20*/
        if( WM->getPlayerNumber()==4 && WM->isBallKickable() )
        {
            soc = leadingPass( OBJECT_TEAMMATE_7, PS->getPassEndSpeed() );
            if( WM->getAgentObjectType()==OBJECT_TEAMMATE_7 && WM->isBallKickable() )//7號拿球    可踢
                soc = leadingPass( OBJECT_TEAMMATE_9, PS->getPassEndSpeed() ); // 傳給9號
            if( WM->getAgentObjectType()==OBJECT_TEAMMATE_9 && WM->isBallKickable() )//9號拿球   可踢
            {
                if( WM->getRelativeDistance( WM->getOppGoalieType() ) >= 20 )//距離對方球門較遠時
                    soc =  dribble( (VecPosition(52.5, 0) - posAgent).getDirection(), DRIBBLE_FAST );//快速向球門帶球
                 soc = kickTo( VecPosition(52.5, 0), SS->getBallSpeedMax() );
            }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*21*/
        if( WM->isBallKickable() && posBall.getX()<0 )
            soc = kickTo( VecPosition( 0, posBall.getY() ), SS->getBallSpeedMax() );
        else if( WM->isBallKickable() && posBall.getX()>0)
            soc = kickTo( VecPosition(52.5, 0), SS->getBallSpeedMax() );
        ACT->putCommandInQueue( soc );
        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        
        /*22*/
        if( WM->isBallKickable() )
        {
            soc = leadingPass( WM->getTeammateClosestToGoalAndAgent(), PS->getPassEndSpeed() );
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*23*/
        if( WM->isBallKickable() )
        {
            ObjectT o = WM->getTeammateAtAngleDist(-30, 30, 20.0);
            if( o != OBJECT_UNKNOWN )
                soc = leadingPass( o, PS->getPassEndSpeed() );
            else
                soc = dribble( (VecPosition(52.5, 0) - posAgent).getDirection(), DRIBBLE_ILLEGAL );
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
        }
        
        /*24*/
         if( WM->isBallKickable() )
         {
             ObjectT maxX;
             if( WM->getOpponentNumSideY( -1 ) > WM->getOpponentNumSideY( 1 ))// 我方半場 對方球員 較多
                  maxX = WM->getXMaxTeammateBySide( 1 );
             else
                 maxX = WM->getXMaxTeammateBySide( -1 );
             soc = leadingPass( maxX, PS->getPassEndSpeed() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
             
         }
         
         /*25*/
         if( WM->isBallKickable() )
         {
             Circle cir( posAgent, 7.0 );
             int oppNum = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir );
             if( oppNum >= 2)
             {
                 ObjectT mate = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, VecPosition( 52.0, 0) );// x 最大的隊友 離對方 球門最近
                 soc = leadingPass( mate, PS->getPassEndSpeed() );
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*26*/
         if( WM->getPlayerNumber()==10 && WM->isBallInOurPossesion() )
             soc = moveToPos( VecPosition(WM->getOffsideX()-2, posAgent.getY() ), 30);
         ACT->putCommandInQueue( soc );
         ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         
         /*27*/
         Line ballLine = Line::makeLineFromPositionAndAngle( WM->getBallPos(), WM->getBallDirection() );//  根據球的位置和方向 角 創建直線
         if( ballLine.getDistanceWithPoint( posAgent ) < 4)
             soc = moveToPos( ballLine.getPointOnLineClosestTo( posAgent ), 30);
         ACT->putCommandInQueue( soc );
         ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         
         /*28*/
         if( WM->isBallKickable() )
         {
             Circle cir( posAgent, 7.0 );
             int oppNum = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir );
             if( oppNum <= 0 )
                 soc = dribble( (VecPosition(53.0, 0)-posAgent).getDirection(), DRIBBLE_FAST );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*29*/
         if( WM->isBallInOurPossesion() && posAgent.getX()<30 && WM->getPlayerNumber()==10 )
         {
             soc = moveToPos( (VecPosition(0, 10)+posAgent), 30);
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*30*/
         if( WM->isBallKickable() )
         {
             Circle cir( posAgent, 5.0 );
             int oppNum = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir );
             if( oppNum>=2 && WM->isTeammateAtAngle(-30, 30) )
                 soc = leadingPass( WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, posAgent), PS->getPassEndSpeed() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*31*/
         if( WM->isBallKickable() )
         {
             if( !WM->isOpponentAtAngle( -30, 30 ) )
                 soc = dribble( (VecPosition(52.5, 0)-posAgent).getDirection(), DRIBBLE_FAST );
             double dist = WM->getAgentDistFromGoalie();
             if( dist>=5 && dist<=10 )
             {
                 VecPosition posGoalie = WM->getGlobalPosition( OBJECT_OPPONENT_GOALIE );//對方守門員位置
                 AngDeg meGoalie = (posGoalie - posAgent).getDirection();
                 AngDeg angTop = ( VecPosition(52.5, 6.0) - posAgent ).getDirection();
                 AngDeg angBottom = ( VecPosition(52.5, -6.0) - posAgent ).getDirection();
                 // 由于編譯器不支持我使用fabs()函式,所以這里采用這種形式求絕對值
                 //AngDeg ang1 = (angTop-meGoalie)>=0 ? (angTop-meGoalie) : (-1)*(angTop-meGoalie);
                 //AngDeg ang2 = (angBottom-meGoalie)>=0 ? (angBottom-meGoalie) : (-1)*(angBottom-meGoalie);
                  if( fabs(angTop-meGoalie) >= fabs(angBottom-meGoalie) )
                      soc = kickTo( VecPosition(52.5, 6.0) - posAgent, SS->getBallSpeedMax() );
                  else
                      soc = kickTo( VecPosition(52.5 -6.0) - posAgent, SS->getBallSpeedMax() );
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*33*/
         int playNum = WM->getPlayerNumber();
         if( (playNum==8 || playNum==9 || playNum==10 || playNum==11) && WM->isOpponentAtAngle( -30, 30 ) )
         {
             soc = dribble( (VecPosition(52.5, 0)-posAgent).getDirection(), DRIBBLE_FAST );
             double dist = WM->getAgentDistFromGoalie();
             if( dist>=5 && dist<=10 )
             {
                 VecPosition posGoalie = WM->getGlobalPosition( OBJECT_OPPONENT_GOALIE );//對方守門員位置
                 AngDeg meGoalie = (posGoalie - posAgent).getDirection();
                 AngDeg angTop = ( VecPosition(52.5, 6.0) - posAgent ).getDirection();
                 AngDeg angBottom = ( VecPosition(52.5, -6.0) - posAgent ).getDirection();
                 // 由于編譯器不支持我使用fabs()函式,所以這里采用這種形式求絕對值
                 //AngDeg ang1 = (angTop-meGoalie)>=0 ? (angTop-meGoalie) : (-1)*(angTop-meGoalie);
                 //AngDeg ang2 = (angBottom-meGoalie)>=0 ? (angBottom-meGoalie) : (-1)*(angBottom-meGoalie);
                  if( fabs(angTop-meGoalie) >= fabs(angBottom-meGoalie) )
                      soc = kickTo( VecPosition(52.5, 6.0) - posAgent, SS->getBallSpeedMax() );
                  else
                      soc = kickTo( VecPosition(52.5 -6.0) - posAgent, SS->getBallSpeedMax() );
             }
            ACT->putCommandInQueue( soc );
            ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*34*/
         if( WM->isCornerKickUs() )
         {
             if( WM->getAgentObjectType() == OBJECT_TEAMMATE_10 )
             {
                 if( WM->isBallKickable() )
                     soc = leadingPass( OBJECT_TEAMMATE_9, PS->getPassEndSpeed() );
                 else
                     soc = moveToPos( posBall, 30);
             }
             if( WM->getAgentObjectType() == OBJECT_TEAMMATE_9 )    
             {
                 VecPosition pos;
                 pos.setX( posBall.getX() );
                 if( posBall.getY() > 0 )
                     pos.setY( posBall.getY() - 10 );
                 else
                     pos.setY( posBall.getY() + 10 );
                 soc = moveToPos( pos, 30 );
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*35*/
         if( WM->isOffsideUs() )
         {
             if( WM->getFastestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL ) == WM->getAgentObjectType() )
                soc = moveToPos( posBall, PS->getPlayerWhenToTurnAngle() );
              if( WM->isBallKickable() )
                  soc = leadingPass( WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, WM->getAgentObjectType() ), PS->getPassEndSpeed() );
              ACT->putCommandInQueue( soc );
              ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*36*/
         if( WM->isOffsideUs() )
         {
             if( posBall.getX()<0 && posBall.getY()<0 && WM->getAgentObjectType()==OBJECT_TEAMMATE_2 )
                 soc = moveToPos( posBall, PS->getPlayerWhenToTurnAngle() );
             else if( posBall.getX()<0 && posBall.getY()>0 && WM->getAgentObjectType()==OBJECT_TEAMMATE_5 )
                 soc = moveToPos( posBall, PS->getPlayerWhenToTurnAngle() );
             if( WM->isBallKickable() && (WM->getAgentObjectType()==OBJECT_TEAMMATE_2 || WM->getAgentObjectType()==OBJECT_TEAMMATE_5) )
                 soc = leadingPass( WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, WM->getAgentObjectType() ), PS->getPassEndSpeed() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      
         }
         
         /*37*/
         if( WM->isOffsideUs() )
         {
             double dist = sqrt((posAgent.getX()-posBall.getX())*(posAgent.getX()-posBall.getX()) + (posAgent.getY()-posBall.getY())*(posAgent.getY()-posBall.getY()));
             if( WM->getSecondClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL)==WM->getAgentObjectType() && dist>=7 )
             {
                 VecPosition pos = posBall - posAgent;
                 double d = posBall.getDistanceTo( posAgent );
                 VecPosition target( (pos.getX()/d)*7.0, (pos.getY()/d)*7.0 );
                 soc = moveToPos( posAgent+target, PS->getPlayerWhenToTurnAngle() );
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
         }
         
         /*38*/
         if( WM->isOffsideUs() )
         {
             if( WM->getPlayerNumber() == 4)
             {
                 if( WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL ) != WM->getAgentObjectType() )
                     soc = moveToPos( posBall+VecPosition( 5, 0 ), PS->getPlayerWhenToTurnAngle() );
                 ACT->putCommandInQueue( soc );
                 ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
             }
         }
         
         /*39*/
         if( WM->isOffsideUs() )
         {
             if( WM->getSecondClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL ) == WM->getAgentObjectType() )
             {
                 VecPosition posGoal( 53, 0 );
                 double dist = posBall.getDistanceTo( posGoal );// 球和 球門間的 距離
                 if( dist > 12 )
                 {
                     VecPosition pos = posGoal - posBall;
                     VecPosition target( (pos.getX()/dist)*12, (pos.getY()/dist)*12 );
                     soc = moveToPos( posBall+target, PS->getPlayerWhenToTurnAngle() );//  球員在 球與球門 連線上, 距離球12
                     ACT->putCommandInQueue( soc );
                     ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
                 }
             }
         }
         
         /*40*/
         if( WM->isOffsideUs() )
         {
             ObjectT nearestMate = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL );
             if( nearestMate == WM->getAgentObjectType() )
                 soc = moveToPos( posBall, PS->getPlayerWhenToTurnAngle() );
             if( WM->getSecondClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL ) != WM->getAgentObjectType() )
                 soc = moveToPos( posAgent+VecPosition( 5, 0 ), PS->getPlayerWhenToTurnAngle() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
         }
         
         /*41*/
         if( WM->isOffsideUs() )
         {  
             if( WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL ) == WM->getAgentObjectType() )
                 soc = moveToPos( posBall, PS->getPlayerWhenToTurnAngle() );
             ObjectT secNear = WM->getSecondClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL );
             if( secNear != WM->getAgentObjectType() )
             {
                 VecPosition pos = WM->getGlobalPosition( secNear ) + VecPosition( 10, 5 );
                 if( WM->isInField( pos ) )
                     soc = moveToPos( pos, PS->getPlayerWhenToTurnAngle() );
                 else
                 {
                     ObjectT o = WM->getClosestFlagToPos( pos );
                     soc = moveToPos( WM->getGlobalPosition( o ), PS ->getPlayerWhenToTurnAngle() );
                 }   
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
         }
         
         /*42*/
         if( WM->getPlayerNumber() == 5)
         {
             ObjectT oppBallKeeper = WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
             VecPosition posOpp = WM->getGlobalPosition( oppBallKeeper );
             VecPosition pos =  posAgent - posOpp;
             double d = posOpp.getDistanceTo( posAgent );
             VecPosition target( (pos.getX()/d)*5, (pos.getY()/d)*5 );
             soc = moveToPos( posOpp+target, PS->getPlayerWhenToTurnAngle() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
         }
         
         /*43*/
         if( WM->getPlayerNumber()==2 || WM->getPlayerNumber()==4)
         {
             ObjectT oppBallKeeper = WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
             soc = mark( oppBallKeeper, 0.0, MARK_BALL );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
         }
         
         /*44*/
         ObjectT oppBallKeeper = WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
         if( oppBallKeeper == OBJECT_OPPONENT_10 )
         {
              if( WM->getAgentObjectType()==OBJECT_TEAMMATE_2
                  || WM->getAgentObjectType()==OBJECT_TEAMMATE_3
                  || WM->getAgentObjectType()==OBJECT_TEAMMATE_4 )
              {
                  soc = mark( oppBallKeeper, 0.0, MARK_BISECTOR );
                  ACT->putCommandInQueue( soc );
                  ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
              } 
         }
         
         /*45*/
         ObjectT oppBallKeeper = WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
         if( oppBallKeeper == OBJECT_OPPONENT_9 )
         {
             ObjectT nearestBall = WM->getNearestBallObj( OBJECT_TEAMMATE_2, WM->getNearestBallObj( OBJECT_TEAMMATE_3, OBJECT_TEAMMATE_4 ) );
             if( nearestBall == WM->getAgentObjectType() )
                 soc = mark( oppBallKeeper, 0.0, MARK_BISECTOR );
             else
             {
                 ObjectT nearestOpp = WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, WM->getAgentObjectType() );
                 soc = mark( nearestOpp, 0.0, MARK_ILLEGAL );
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  
         }
         
         /*46*/
         double *dist1;
         double *dist2;
         WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL, dist1 );
         WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL, dist2 );
         if( *dist1 < *dist2 )
         {
             ObjectT nearestBall = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL );
             if( nearestBall == WM->getAgentObjectType() )
                 soc = mark( nearestBall, 0.0, MARK_BISECTOR );
             else
                 soc = mark( WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, WM->getAgentObjectType() ), 5.0, MARK_ILLEGAL );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*47*/
         //這個所謂的左右,你就當自己是 站在球場上的球員,來判斷左右,  注意 球場上y軸正方向 朝下
         if( !WM->isBallKickable() && WM->getAgentObjectType()==OBJECT_OPPONENT_11 )
         {
             if( WM->getPlayerNumber() == 7)
             {
                 soc = moveToPos( WM->getGlobalPosition( OBJECT_OPPONENT_11 )+VecPosition( 0, -5 ), PS->getPlayerWhenToTurnAngle() );
                 soc = intercept( true );
             }
             else if( WM->getPlayerNumber() == 8 )
             {
                 soc = moveToPos( WM->getGlobalPosition( OBJECT_OPPONENT_11 )+VecPosition( 0, 5 ), PS->getPlayerWhenToTurnAngle() );
                 soc = intercept( true );
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*48*/
         if( !WM->isBallInOurPossesion() )
         {
             if( WM->getPlayerNumber() == 6 )
                 soc = moveToPos( WM->getGlobalPosition( OBJECT_OPPONENT_9 ), PS->getPlayerWhenToTurnAngle() );
             else if( WM->getPlayerNumber() == 7 )
                 soc = moveToPos( WM->getGlobalPosition( OBJECT_OPPONENT_10 ), PS->getPlayerWhenToTurnAngle() ); 
             else if( WM->getPlayerNumber() == 8 )
                 soc = moveToPos( WM->getGlobalPosition( OBJECT_OPPONENT_11 ), PS->getPlayerWhenToTurnAngle() ); 
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*49*/
         if( !WM->isBallInOurPossesion() )
         {
             ObjectT teammate1 = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL );
             ObjectT teammate2 = WM->getSecondClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL );
             ObjectT opp = WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
             //ObjectT opp2 = WM->getSecondClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
             if( WM->getAgentObjectType()==teammate1 || WM->getAgentObjectType()==teammate2 ) 
                 soc = mark( opp, 0.0, MARK_ILLEGAL );
             else
             {
                 ObjectT nearestOpp = WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, WM->getAgentObjectType() );
                 VecPosition posOpp = WM->getGlobalPosition( nearestOpp );
                 VecPosition oppToBall = posBall - posOpp;
                 VecPosition target( oppToBall.getX()/2.0, oppToBall.getY()/2.0 );
                 soc = moveToPos( posAgent+target, PS->getPlayerWhenToTurnAngle() );// 跑到對方球員 與球連線的 中點
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*50*/
         if( WM->isOffsideThem() )
         {
             if( WM->getPlayerNumber() == 4)
                 soc = moveToPos( WM->getClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL ), PS->getPlayerWhenToTurnAngle() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*51*/
         if( WM->isOffsideThem() )
         {
             ObjectT o = WM->getSecondClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL );
             if( WM->getAgentObjectType() == o )
             {
                 ObjectT opp = WM->getSecondClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
                 soc = moveToPos( WM->getGlobalPosition( opp ), PS->getPlayerWhenToTurnAngle() );   
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*52*/
         if( WM->isCornerKickThem() )
         {
             if( posBall.getY() < 0 )
             {
                 VecPosition pos2 = WM->getGlobalPosition( OBJECT_TEAMMATE_2 );
                 VecPosition pos3 = WM->getGlobalPosition( OBJECT_TEAMMATE_3 );
                 VecPosition pos6 = WM->getGlobalPosition( OBJECT_TEAMMATE_6 );
                 VecPosition pos7 = WM->getGlobalPosition( OBJECT_TEAMMATE_7 );
                 if( WM->isInField( pos2 ) && WM->isInField( pos3 ) && WM->isInField( pos6 ) && WM->isInField( pos7 ))
                 {
                     if( WM->getAgentObjectType() == OBJECT_TEAMMATE_2 )
                         soc = moveToPos( posBall+VecPosition( 10, 0 ), PS->getPlayerWhenToTurnAngle() );
                     if( WM->getAgentObjectType() == OBJECT_TEAMMATE_3 )
                         soc = moveToPos( posBall+VecPosition( -10, 0 ), PS->getPlayerWhenToTurnAngle() );
                     if( WM->getAgentObjectType() == OBJECT_TEAMMATE_6 )
                         soc = moveToPos( posBall+VecPosition( 0, 10 ), PS->getPlayerWhenToTurnAngle() );
                     if( WM->getAgentObjectType() == OBJECT_TEAMMATE_7 )
                         soc = moveToPos( posBall+VecPosition( 0, -10 ), PS->getPlayerWhenToTurnAngle() );
                 }
             }
             else
             {
                 VecPosition pos4 = WM->getGlobalPosition( OBJECT_TEAMMATE_4 );
                 VecPosition pos5 = WM->getGlobalPosition( OBJECT_TEAMMATE_5 );
                 VecPosition pos7 = WM->getGlobalPosition( OBJECT_TEAMMATE_7 );
                 VecPosition pos8 = WM->getGlobalPosition( OBJECT_TEAMMATE_8 );
                 if( WM->isInField( pos4 ) && WM->isInField( pos5 ) && WM->isInField( pos7 ) && WM->isInField( pos8 ))
                 {
                     if( WM->getAgentObjectType() == OBJECT_TEAMMATE_4 )
                         soc = moveToPos( posBall+VecPosition( 10, 0 ), PS->getPlayerWhenToTurnAngle() );
                     if( WM->getAgentObjectType() == OBJECT_TEAMMATE_5 )
                         soc = moveToPos( posBall+VecPosition( -10, 0 ), PS->getPlayerWhenToTurnAngle() );
                     if( WM->getAgentObjectType() == OBJECT_TEAMMATE_7 )
                         soc = moveToPos( posBall+VecPosition( 0, 10 ), PS->getPlayerWhenToTurnAngle() );
                     if( WM->getAgentObjectType() == OBJECT_TEAMMATE_8 )
                         soc = moveToPos( posBall+VecPosition( 0, -10 ), PS->getPlayerWhenToTurnAngle() );
                 }
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*53*/
         if( WM->isOffsideThem() )
         {
             ObjectT o = WM->getClosestInSetTo( OBJECT_SET_TEAMMATES, OBJECT_BALL );
             ObjectT agent = WM->getAgentObjectType();
             if( agent!=o && WM->getGlobalPosition( agent ).getX()>0 )
                 soc = moveToPos( posAgent+VecPosition( -10, 0 ), PS->getPlayerWhenToTurnAngle() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*54*/
         if( WM->isOffsideThem() )
         {
             Circle cir( posAgent, 5 );
             int num = WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS, cir );
             if( num > 0 )
                soc = moveToPos( WM->getGlobalPosition( WM->getOppByDistAndPos( 5, 2, 0 )), PS->getPlayerWhenToTurnAngle() );
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
         
         /*55*/
         if( WM->isOffsideThem() )
         {
             if( posBall.getX() < 0 )
             {
                 ObjectT agent = WM->getAgentObjectType();
                 if( agent==OBJECT_TEAMMATE_4 || agent==OBJECT_TEAMMATE_5 )
                 {
                     ObjectT opp = WM->getSecondClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
                     soc = moveToPos( WM->getGlobalPosition( opp ), PS->getPlayerWhenToTurnAngle() );
                 }
                 ACT->putCommandInQueue( soc );
                 ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
             }
         }
         
         /*56*/
         if( WM->isCornerKickThem() )
         {
             ObjectT agent = WM->getAgentObjectType();
             ObjectT oppSecNearBall = WM->getSecondClosestInSetTo( OBJECT_SET_OPPONENTS, OBJECT_BALL );
             if( posBall.getY() < 0)
             {
                 if( agent==OBJECT_TEAMMATE_2 || agent==OBJECT_TEAMMATE_3 )
                     soc = moveToPos( WM->getGlobalPosition( oppSecNearBall ), PS->getPlayerWhenToTurnAngle() );
             }
             else
             {
                 if( agent==OBJECT_TEAMMATE_4 || agent==OBJECT_TEAMMATE_5 )
                     soc = moveToPos( WM->getGlobalPosition( oppSecNearBall ), PS->getPlayerWhenToTurnAngle() );
             }
             ACT->putCommandInQueue( soc );
             ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
         }
        /*-----------------------------end---------------------------------*/


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/195280.html

標籤:其他

上一篇:來自東南亞的極兔被“封殺”,老家還能保住嗎?

下一篇:貪吃蛇--小白學習C語言一周產出--《C語言基礎知識點羅列》--適合新手

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more