題目要求
//拿球后行為,利用已有 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
標籤:其他
