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 + -
显示快捷键?