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

📄 passball.cpp.svn-base

📁 一个巴西大学编写的2D仿真组足球机器人程序
💻 SVN-BASE
字号:
#include "PassBall.h"SoccerCommand PassBall::primaryAction(){   return primarySoc;}SoccerCommand PassBall::cuncurrentAction(){   return cuncurrentSoc;}/*! Este m�todo o usa o comportamento de passar a bola. Quando o passar a bola    retorna um comando ilegal, o novo comportamento escolhido � chutar a bola    para frente.     \return um comando para tocar ou chutar a bola */void PassBall::passBallFoward(){   primarySoc = passBall(false);   if (primarySoc.commandType == CMD_ILLEGAL)   {      VecPosition posGoal( PITCH_LENGTH/2.0,            (-1 + 2*(WM->getCurrentCycle()%2)) * 0.4 * SS->getGoalWidth() );      primarySoc = kickTo( posGoal, SS->getBallSpeedMax() ); // kick maximal   }   cuncurrentSoc = turnNeckToObject( OBJECT_BALL, primarySoc );}void PassBall::passBallBack(){   VecPosition posPass = WM->getGlobalPosition(OBJECT_TEAMMATE_5);   AngDeg *angMax=0;    primarySoc = throughPass( OBJECT_TEAMMATE_5, posPass, angMax); // pass ball   cuncurrentSoc = turnNeckToObject( OBJECT_BALL, primarySoc );}void PassBall::passBall(){   primarySoc = passBall(true);   if (primarySoc.commandType == CMD_ILLEGAL)   {      VecPosition posGoal( PITCH_LENGTH/2.0,            (-1 + 2*(WM->getCurrentCycle()%2)) * 0.4 * SS->getGoalWidth() );      primarySoc = kickTo( posGoal, SS->getBallSpeedMax() ); // kick maximal   }   cuncurrentSoc = turnNeckToObject( OBJECT_BALL, primarySoc );}/*! Este m�todo � usado para fazer o agente tocar a bola para seu companheiro de    time. A implementa��o deste m�todo foi inspirada no toque de bola criado por    Linder no Oxenteteam. Este Consiste em analisar a possibilidade de passe    para cada companheiro at� achar um que o n�vel de seguran�a seja maior do     que um n�vel preestabelecido. Se ao final desta an�lise nenhum companheiro     tiver sido escolhido ent�o este m�todo retorna um comando ilegal.    \return um comando de passar a bola ou chutar a goal. */SoccerCommand PassBall::passBall(bool lunchBall){   int index = 0;   ObjectT teamMate = WM->iterateObjectStart(index, OBJECT_SET_TEAMMATES);   ObjectT teamMatePass = teamMate;   VecPosition posTeamMate = WM->getGlobalPosition(teamMate);   VecPosition posPass = posTeamMate;   VecPosition posAgent = WM->getAgentGlobalPosition();   SoccerCommand soc;   double rSafety = 0;   double teammateSafety = getSafetyToPass(posAgent, posTeamMate);   bool badPass = true;   // analisa o passe para cada companheiro    //posAgent = WM->getAgentGlobalPosition();   while ( teamMate != OBJECT_ILLEGAL )   {      if  ( teamMate != OBJECT_TEAMMATE_GOALIE ) {         posTeamMate = WM->getGlobalPosition(teamMate);         rSafety = getSafetyToPass(posAgent, posTeamMate);         if ( (posTeamMate.isInFrontOf(posAgent) or lunchBall) and ( rSafety > teammateSafety ) and WM->isConfidenceGood( teamMate )){            posPass = posTeamMate;            teammateSafety = rSafety;            teamMatePass = teamMate;            badPass = false;         }      }      teamMate = WM->iterateObjectNext(index, OBJECT_SET_TEAMMATES);   }   if (badPass) {      soc.commandType = CMD_ILLEGAL;      return soc;   }   AngDeg *angMax=0;   soc = kickTo(posPass, 0.7); // pass ball   Log.log( 100, "pass ball" );   return soc;}/*         soc = leadingPass(OBJECT_TEAMMATE_10,1.0);         ACT->putCommandInQueue( soc );         ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );         agentHadBall = false; */void PassBall::simpleLeadingPass(ObjectT teammate){   primarySoc = leadingPass(teammate,1.0);   cuncurrentSoc =  turnNeckToObject( OBJECT_BALL, primarySoc );}void PassBall::advancedPass(ObjectT teammate){   VecPosition Pass;   /*double coordY = 1.0;   if(WM->getAgentGlobalPosition().getY() > 0 )      coordY = -1.0;*/   if(WM->getAgentGlobalPosition().getDistanceTo(WM->getGlobalPosition(teammate)) > 15.0 )   {      Pass.setX(WM->getGlobalPosition(teammate).getX()+10.0); Pass.setY(WM->getGlobalPosition(teammate).getY() );      primarySoc = kickTo(Pass,PS->getPassEndSpeed());   }   else   {      Pass.setX(WM->getGlobalPosition(teammate).getX()+5.0); Pass.setY(WM->getGlobalPosition(teammate).getY() );      primarySoc = kickTo(Pass,PS->getPassEndSpeed());   }   cuncurrentSoc =  turnNeckToObject( OBJECT_BALL, primarySoc );}/*!Este método consiste em prever a posição do agente após o passe e tocar nesta posição.*/void PassBall::predictPass( ObjectT teammate ){   int nrCycle = WM->predictNrCyclesToPoint( teammate , WM->getAgentGlobalPosition() );   primarySoc = kickTo( WM->predictPosAfterNrCycles( teammate , nrCycle) , 1.0);   cuncurrentSoc =  turnNeckToObject( OBJECT_BALL, primarySoc );}/*!Este metodo serve para que o agente de um passe rápido*/void PassBall::fastPass( ObjectT teammate ){   primarySoc = directPass( teammate , PASS_FAST );   cuncurrentSoc =  turnNeckToObject( OBJECT_BALL, primarySoc );}/*! Este metodo serve para o agente passar em jogadas de bola parada, ele observa o campo, avalia, entre dois companheiros o mais confiável e passa */void PassBall::cobranca( ObjectT teammate1 , ObjectT teammate2 ){   static Time   timeLastSearch;   VecPosition posTeammate1 = WM->getGlobalPosition(teammate1);   VecPosition posTeammate2 = WM->getGlobalPosition(teammate2);   VecPosition posAgent = WM->getAgentGlobalPosition();   if( WM->getPlayMode() == PM_PLAY_ON )   {      if( getSafetyToPass(posAgent,posTeammate1) > getSafetyToPass(posAgent,posTeammate2) )            primarySoc = leadingPass( teammate1 , 1.0 );         else            primarySoc = leadingPass( teammate2 , 1.0 );      cuncurrentSoc = turnNeckToObject( OBJECT_BALL, primarySoc );         timeLastSearch = WM->getCurrentTime();   }   else   {      if( WM->getCurrentTime().getTime() == timeLastSearch.getTime()  )      {         primarySoc = searchBall();         cuncurrentSoc = alignNeckWithBody( );      }      else      {         if( WM->getCurrentTime() - timeLastSearch > 12 )         {            if( getSafetyToPass(posAgent,posTeammate1) > getSafetyToPass(posAgent,posTeammate2) )               primarySoc = leadingPass( teammate1 , 1.0 );            else               primarySoc = leadingPass( teammate2 , 1.0 );            cuncurrentSoc = turnNeckToObject( OBJECT_BALL, primarySoc );            timeLastSearch = WM->getCurrentTime();         }         else if( WM->getCurrentTime() - timeLastSearch > 6 )         {            primarySoc = turnBodyToObject( OBJECT_BALL );            cuncurrentSoc = turnNeckToObject( OBJECT_BALL, primarySoc );         }         else         {            primarySoc = searchBall();            cuncurrentSoc = alignNeckWithBody( );         }      }   }}/*!Este método avalia, qual o companheiro mais confiável para tocar e toca.*/void safetyPass(){   /*VecPosition posTeammate = WM->getGlobalPosition(OBJECT_TEAMMATE_9);   VecPosition posAgent = WM->getAgentGlobalPosition();   VecPosition posAux = WM->getGlobalPosition(OBJECT_TEAMMATE_2);   double safetyTeammate, safetyAux;   safetyTeammate = getSafetyToPass( posAgent ,posTeammate );   safetyAux = getSafetyToPass( posAgent, posAux );*/}/*! Este metodo retorna um valor real indicando a confiabilidade do passe.    \param recebe o identificador do companheiro de time que dever� receber a bola.    \return o nivel de confiabilidade do passe.*/bool PassBall::confidenceToPass( ObjectT teammate ){   VecPosition posTeammate = WM->getGlobalPosition(teammate);   VecPosition posAgent = WM->getAgentGlobalPosition();   if ( WM->isVisible( teammate ) and ( getSafetyToPass( posAgent , posTeammate ) > 1.1 ))      return true;   else      return false;}	

⌨️ 快捷键说明

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