basicplayer_8c-source.html
来自「仿真人工智能是指用人工的方法和技术」· HTML 代码 · 共 526 行 · 第 1/5 页
HTML
526 行
00587 <font class="comment">// first predict the angle between the agent and the ball after two cycles,</font>00588 <font class="comment">// is this larger than the angle when to turn, turn to position of the ball</font>00589 <font class="comment">// after two cycles. Then perform a dash based on the position of the ball</font>00590 <font class="comment">// after two cycles and the position of the agent after the turn. If after</font>00591 <font class="comment">// these two command the agent is in the kickable distance, return turn</font>00592 <font class="comment">// command.</font>00593 posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 2 );00594 posPred = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 2, 0 );00595 ang = (posBall - posPred).getDirection();00596 ang = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( ang - angBody );00597 <font class="keywordflow">if</font> (fabs( ang ) > <a class="code" href="classBasicPlayer.html#n3">PS</a>-><a class="code" href="classPlayerSettings.html#a9">getPlayerWhenToTurnAngle</a>() ) <font class="comment">// if we want to turn</font>00598 {00599 soc = <a class="code" href="classBasicPlayer.html#b1">turnBodyToPoint</a>( posBall, 2 ); <font class="comment">// perform turn</font>00600 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>(soc,&posPred,&velMe,&angBody,&ang,&sta );00601 dPower = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(posBall-posPred,angBody,velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>());00602 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( dPower, &posPred, &velMe, &sta, angBody);00603 <font class="keywordflow">if</font> (posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>(posBall) < <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a210">getMaximalKickDist</a>())00604 <font class="keywordflow">return</font> soc;00605 }00606 00607 <font class="comment">// try two dashes</font>00608 <font class="comment">// first predict the position in the next cycle when dash with full power</font>00609 <font class="comment">// is performed. Then calculate the dash power to reach the point where the</font>00610 <font class="comment">// ball will be in two cycles and predict the global position of the agent</font>00611 <font class="comment">// after a dash with this power. If the position is in the kickable distance</font>00612 <font class="comment">// return a dash with full power.</font>00613 soc = <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a181">CMD_DASH</a>, <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a94">getMaxPower</a>() );00614 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>(soc,&posPred,&velMe,&angBody,&ang,&sta );00615 dPower=<a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(posBall-posPred,angBody,velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>());00616 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( dPower, &posPred, &velMe, &sta, angBody );00617 <font class="keywordflow">if</font> (posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>(posBall) < <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a210">getMaximalKickDist</a>())00618 <font class="keywordflow">return</font> soc;00619 00620 <font class="comment">// try three dashes</font>00621 <font class="comment">// same as with two dashes, but now try two maximum dashes and</font>00622 posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 3 );00623 soc = <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a181">CMD_DASH</a>, <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a94">getMaxPower</a>() );00624 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>(soc,&posPred,&velMe,&angBody,&ang,&sta );00625 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a102">predictStateAfterCommand</a>( soc, &posPred, &velMe, &angBody, &ang,&sta );00626 dPower=<a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(posBall-posPred,angBody,velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>());00627 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( dPower, &posPred, &velMe, &sta, angBody );00628 <font class="keywordflow">if</font> (posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>(posBall) < <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a210">getMaximalKickDist</a>())00629 <font class="keywordflow">return</font> soc;00630 00631 <font class="comment">// cannot intercept ball in two cycles</font>00632 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a180">CMD_ILLEGAL</a> );00633 }00634 <a name="l00671"></a><a class="code" href="classBasicPlayer.html#b16">00671</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b16">BasicPlayer::interceptCloseGoalie</a>( )00672 {00673 <a class="code" href="classSoccerCommand.html">SoccerCommand</a> soc;00674 <font class="keywordtype">double</font> dPower, dDist;00675 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> ang;00676 <a class="code" href="classVecPosition.html">VecPosition</a> posClosestToBall;00677 00678 <font class="comment">// initialize all variables with information from worldmodel.</font>00679 <a class="code" href="classVecPosition.html">VecPosition</a> posPred = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 1, 0 );00680 <a class="code" href="classVecPosition.html">VecPosition</a> posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 1 );00681 <a class="code" href="classVecPosition.html">VecPosition</a> velMe = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a41">getAgentGlobalVelocity</a>( );00682 <a class="code" href="classStamina.html">Stamina</a> sta = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a39">getAgentStamina</a>( );00683 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angBody = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a38">getAgentGlobalBodyAngle</a>( );00684 <a class="code" href="classLine.html">Line</a> lineGoalie=<a class="code" href="classLine.html#d1">Line::makeLineFromPositionAndAngle</a>(posPred,angBody);00685 00686 <font class="comment">// when it is theoretical possible</font>00687 <font class="comment">// try one dash and check whether ball is in catchable area</font>00688 dDist = <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a66">getBallSpeedMax</a>()+<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a14">getPlayerSpeedMax</a>()+<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a48">getCatchableAreaL</a>();00689 <font class="keywordflow">if</font>( <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a54">getRelativeDistance</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a> ) < dDist )00690 {00691 posClosestToBall = lineGoalie.<a class="code" href="classLine.html#a5">getPointOnLineClosestTo</a>( posBall );00692 dPower = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(00693 posClosestToBall-posPred,00694 angBody,00695 velMe,00696 sta.<a class="code" href="classStamina.html#a4">getEffort</a>() );00697 posPred = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 1, (<font class="keywordtype">int</font>)dPower);00698 <font class="keywordflow">if</font> ( posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>( posBall ) < <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a48">getCatchableAreaL</a>() )00699 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a181">CMD_DASH</a>, dPower );00700 }00701 00702 <font class="comment">// when it is theoretical possible</font>00703 <font class="comment">// try two dashes and check whether ball is in catchable area</font>00704 <font class="comment">// otherwise try first two dashes and check whether ball is in catchable</font>00705 <font class="comment">// area, thereafter for turn and dash.</font>00706 dDist = <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a66">getBallSpeedMax</a>()*(1.0+<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a60">getBallDecay</a>())00707 + 2*<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a14">getPlayerSpeedMax</a>()00708 + <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a48">getCatchableAreaL</a>();00709 <font class="keywordflow">if</font>( <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a54">getRelativeDistance</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a> ) < dDist )00710 {00711 <font class="comment">// try two dashes</font>00712 <font class="comment">// first predict the position in the next cycle when dash with full power</font>00713 <font class="comment">// is performed. Then calculate the dash power to reach the point where the</font>00714 <font class="comment">// ball will be in two cycles and predict the global position of the agent</font>00715 <font class="comment">// after a dash with this power. If the position is in the catchable area</font>00716 <font class="comment">// return a dash with full power.</font>00717 posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 2 );00718 soc = <a class="code" href="classBasicPlayer.html#b5">dashToPoint</a>( posBall );00719 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>(soc,&posPred,&velMe,&angBody,&ang,&sta );00720 dPower=<a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(posBall-posPred,angBody,velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>());00721 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( dPower, &posPred, &velMe, &sta, angBody );00722 <font class="keywordflow">if</font>( posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>(posBall) < <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a48">getCatchableAreaL</a>() )00723 <font class="keywordflow">return</font> soc;00724 00725 <font class="comment">// try one turn and a dash</font>00726 posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 2 );00727 posPred = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 2, 0 );00728 ang = (posBall - posPred).getDirection();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?