⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playerteams.cpp~

📁 对于2D ROBOCUP底层传球和定位球方面进行了严格的修改该
💻 CPP~
📖 第 1 页 / 共 3 页
字号:
	  {		// if fastest to ball		  Log.log ( 100, "I am fastest to ball; can get there in %d cycles", iTmp );		  soc = intercept ( false );                     // intercept the ball			  if ( soc.commandType == CMD_DASH &&            // if stamina low				     WM->getAgentStamina().getStamina() <				     SS->getRecoverDecThr() *SS->getStaminaMax() +200 )		  {			  soc.dPower = 30.0 * WM->getAgentStamina().getRecovery(); // dash slow			  ACT->putCommandInQueue ( soc );			  ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		  }		  else                                           // if stamina high		  {			  ACT->putCommandInQueue ( soc );              // dash as intended			  ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		  }	  }	  else if ( posAgent.getDistanceTo ( WM->getStrategicPosition() ) >			   1.5 + fabs ( posAgent.getX()-posBall.getX() ) /10.0 )		// if not near strategic pos	  {		  if ( WM->getAgentStamina().getStamina() >    // if stamina high				     SS->getRecoverDecThr() *SS->getStaminaMax() +800 )		  {			  soc = moveToPos ( WM->getStrategicPosition(),					    PS->getPlayerWhenToTurnAngle() );			  ACT->putCommandInQueue ( soc );           // move to strategic pos			  ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		  }		  else                                        // else watch ball		  {			  ACT->putCommandInQueue ( soc = turnBodyToObject ( OBJECT_BALL ) );			  ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		  }	  }	  else if ( fabs ( WM->getRelativeAngle ( OBJECT_BALL ) ) > 1.0 ) // watch ball	  {		  ACT->putCommandInQueue ( soc = turnBodyToObject ( OBJECT_BALL ) );		  ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );	  }	  else                                         // nothing to do		  ACT->putCommandInQueue ( SoccerCommand ( CMD_TURNNECK,0.0 ) );  }    else   {        formations->setFormation( FT_433_OFFENSIVE );	soc.commandType = CMD_ILLEGAL;		if ( WM->getConfidence ( OBJECT_BALL ) < PS->getBallConfThr() )	{		ACT->putCommandInQueue ( soc = searchBall() );  // if ball pos unknown		ACT->putCommandInQueue ( alignNeckWithBody( ) ); // search for it	}	/*else if ( WM -> isBallKickable())	{		VecPosition posGoal( PITCH_LENGTH/2.0,				     (-1 + 2*(WM->getCurrentCycle()%2)) * 	拿了球就踢的版本					     0.4 * SS->getGoalWidth() );		soc = kickTo( posGoal, SS->getBallSpeedMax() ); // kick maximal		Log.log( 100, "take kick in" );        	} */	else if ( WM -> isBallKickable())//正常版本	{				soc = dribble ( 0,DRIBBLE_FAST );		VecPosition posPassGoal = WM -> getGlobalPosition ( WM -> getClosestRelativeInSet ( OBJECT_SET_TEAMMATES_NO_GOALIE) ); //关于object T 以及最终实现为最近的人传球。。。		soc = kickTo( posPassGoal, SS->getBallSpeedMax() );		ACT->putCommandInQueue ( soc );		ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		Log.log ( 100, "pass ball" );	}	/*else if ( WM->isBallKickable() )                  // if kickable	{		VecPosition posGoal ( PITCH_LENGTH/2.0,					( -1 + 2* ( WM->getCurrentCycle() %2 ) ) * 0.4 * SS->getGoalWidth() );		soc = dribble ( 0,DRIBBLE_FAST ); // kick maximal	无脑带球版本		ACT->putCommandInQueue ( soc );		ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		Log.log ( 100, "kick ball" );	}*/	else if ( WM->getFastestInSetTo ( OBJECT_SET_TEAMMATES, OBJECT_BALL, &iTmp )			== WM->getAgentObjectType()  && !WM->isDeadBallThem() )	{		// if fastest to ball		Log.log ( 100, "I am fastest to ball; can get there in %d cycles", iTmp );		soc = intercept ( false );                     // intercept the ball			if ( soc.commandType == CMD_DASH &&            // if stamina low			WM->getAgentStamina().getStamina() <			SS->getRecoverDecThr() *SS->getStaminaMax() +200 )		{			soc.dPower = 30.0 * WM->getAgentStamina().getRecovery(); // dash slow			ACT->putCommandInQueue ( soc );			ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		}		else                                           // if stamina high		{			ACT->putCommandInQueue ( soc );              // dash as intended			ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		}	}	else if ( posAgent.getDistanceTo ( WM->getStrategicPosition() ) >			1.5 + fabs ( posAgent.getX()-posBall.getX() ) /10.0 )		// if not near strategic pos	{		if ( WM->getAgentStamina().getStamina() >    // if stamina high			SS->getRecoverDecThr() *SS->getStaminaMax() +800 )		{			soc = moveToPos ( WM->getStrategicPosition(),						PS->getPlayerWhenToTurnAngle() );			ACT->putCommandInQueue ( soc );           // move to strategic pos			ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		}		else                                        // else watch ball		{			ACT->putCommandInQueue ( soc = turnBodyToObject ( OBJECT_BALL ) );			ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );		}	}	else if ( fabs ( WM->getRelativeAngle ( OBJECT_BALL ) ) > 1.0 ) // watch ball	{		ACT->putCommandInQueue ( soc = turnBodyToObject ( OBJECT_BALL ) );		ACT->putCommandInQueue ( turnNeckToObject ( OBJECT_BALL, soc ) );	}	else                                         // nothing to do		ACT->putCommandInQueue ( SoccerCommand ( CMD_TURNNECK,0.0 ) );  } return soc;}/*!This method is a simple goalie based on the goalie of the simple Team of   FC Portugal. It defines a rectangle in its penalty area and moves to the   position on this rectangle where the ball intersects if you make a line   between the ball position and the center of the goal. If the ball can   be intercepted in the own penalty area the ball is intercepted and catched.*/SoccerCommand Player::deMeer5_goalie(  ){  int i;  SoccerCommand soc;  VecPosition   posAgent = WM->getAgentGlobalPosition();  AngDeg        angBody  = WM->getAgentGlobalBodyAngle();  // define the top and bottom position of a rectangle in which keeper moves  static const VecPosition posLeftTop( -PITCH_LENGTH/2.0 +               0.7*PENALTY_AREA_LENGTH, -PENALTY_AREA_WIDTH/4.0 );  static const VecPosition posRightTop( -PITCH_LENGTH/2.0 +               0.7*PENALTY_AREA_LENGTH, +PENALTY_AREA_WIDTH/4.0 );  // define the borders of this rectangle using the two points.  static Line  lineFront = Line::makeLineFromTwoPoints(posLeftTop,posRightTop);  static Line  lineLeft  = Line::makeLineFromTwoPoints(                         VecPosition( -50.0, posLeftTop.getY()), posLeftTop );  static Line  lineRight = Line::makeLineFromTwoPoints(                         VecPosition( -50.0, posRightTop.getY()),posRightTop );  if( WM->isBeforeKickOff( ) )  {    if( formations->getFormation() != FT_INITIAL || // not in kickoff formation        posAgent.getDistanceTo( WM->getStrategicPosition() ) > 2.0 )      {      formations->setFormation( FT_INITIAL );       // go to kick_off formation      ACT->putCommandInQueue( soc=teleportToPos(WM->getStrategicPosition()) );    }    else                                            // else turn to center    {      ACT->putCommandInQueue( soc = turnBodyToPoint( VecPosition( 0, 0 ), 0 ));      ACT->putCommandInQueue( alignNeckWithBody( ) );    }    return soc;  }  if( WM->getConfidence( OBJECT_BALL ) < PS->getBallConfThr() )  {                                                // confidence ball too  low    ACT->putCommandInQueue( searchBall() );        // search ball    ACT->putCommandInQueue( alignNeckWithBody( ) );  }  else if( WM->getPlayMode() == PM_PLAY_ON || WM->isFreeKickThem() ||           WM->isCornerKickThem() )                 {    if( WM->isBallCatchable() )    {      ACT->putCommandInQueue( soc = catchBall() );      ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );    }     else if( WM->isBallKickable() )    {       soc = kickTo( VecPosition(0,posAgent.getY()*2.0), 2.0 );           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() )    {      ACT->putCommandInQueue( soc = intercept( true ) );      ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );    }    else    {      // make line between own goal and the ball      VecPosition posMyGoal = ( WM->getSide() == SIDE_LEFT )             ? SoccerTypes::getGlobalPositionFlag(OBJECT_GOAL_L, SIDE_LEFT )             : SoccerTypes::getGlobalPositionFlag(OBJECT_GOAL_R, SIDE_RIGHT);      Line lineBall = Line::makeLineFromTwoPoints( WM->getBallPos(),posMyGoal);      // determine where your front line intersects with the line from ball      VecPosition posIntersect = lineFront.getIntersection( lineBall );      // outside rectangle, use line at side to get intersection      if (posIntersect.isRightOf( posRightTop ) )        posIntersect = lineRight.getIntersection( lineBall );      else if (posIntersect.isLeftOf( posLeftTop )  )        posIntersect = lineLeft.getIntersection( lineBall );      if( posIntersect.getX() < -49.0 )        posIntersect.setX( -49.0 );              // and move to this position      if( posIntersect.getDistanceTo( WM->getAgentGlobalPosition() ) > 0.5 )      {        soc = moveToPos( posIntersect, PS->getPlayerWhenToTurnAngle() );        ACT->putCommandInQueue( soc );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }      else      {        ACT->putCommandInQueue( soc = turnBodyToObject( OBJECT_BALL ) );        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }    }  }  else if( WM->isFreeKickUs() == true || WM->isGoalKickUs() == true )  {    if( WM->isBallKickable() )    {      if( WM->getTimeSinceLastCatch() == 25 && WM->isFreeKickUs() )      {        // move to position with lesser opponents.        if( WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS,                                           Circle(posRightTop, 15.0 )) <            WM->getNrInSetInCircle( OBJECT_SET_OPPONENTS,                                            Circle(posLeftTop,  15.0 )) )          soc.makeCommand( CMD_MOVE,posRightTop.getX(),posRightTop.getY(),0.0);        else          soc.makeCommand( CMD_MOVE,posLeftTop.getX(), posLeftTop.getY(), 0.0);        ACT->putCommandInQueue( soc );      }      else if( WM->getTimeSinceLastCatch() > 28 )      {        soc = kickTo( VecPosition(0,posAgent.getY()*2.0), 2.0 );            ACT->putCommandInQueue( soc );      }      else if( WM->getTimeSinceLastCatch() < 25 )      {        VecPosition posSide( 0.0, posAgent.getY() );         if( fabs( (posSide - posAgent).getDirection() - angBody) > 10 )        {          soc = turnBodyToPoint( posSide );          ACT->putCommandInQueue( soc );        }        ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );      }    }    else if( WM->isGoalKickUs()  )    {      ACT->putCommandInQueue( soc = intercept( true ) );      ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );    }    else      ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  }  else  {     ACT->putCommandInQueue( soc = turnBodyToObject( OBJECT_BALL ) );     ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );  }  return soc;}

⌨️ 快捷键说明

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