📄 passball.cpp.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 + -