basicplayer_8c-source.html
来自「仿真人工智能是指用人工的方法和技术」· HTML 代码 · 共 526 行 · 第 1/5 页
HTML
526 行
00354 00355 <a name="l00361"></a><a class="code" href="classBasicPlayer.html#b10">00361</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b10">BasicPlayer::communicate</a>( <font class="keywordtype">char</font> *str )00362 {00363 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a189">CMD_SAY</a>, str );00364 }00365 <a name="l00370"></a><a class="code" href="classBasicPlayer.html#b11">00370</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b11">BasicPlayer::teleportToPos</a>( <a class="code" href="classVecPosition.html">VecPosition</a> pos )00371 {00372 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a187">CMD_MOVE</a>, pos.<a class="code" href="classVecPosition.html#a26">getX</a>(), pos.<a class="code" href="classVecPosition.html#a28">getY</a>() );00373 00374 }00375 00376 <font class="comment">/********************** INTERMEDIATE LEVEL SKILLS ****************************/</font>00377 <a name="l00386"></a><a class="code" href="classBasicPlayer.html#b12">00386</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b12">BasicPlayer::turnBodyToObject</a>( <a class="code" href="SoccerTypes_8h.html#a240">ObjectT</a> o )00387 {00388 <font class="keywordflow">return</font> <a class="code" href="classBasicPlayer.html#b1">turnBodyToPoint</a>( <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>(o, 1) );00389 }00390 <a name="l00406"></a><a class="code" href="classBasicPlayer.html#b13">00406</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b13">BasicPlayer::turnNeckToObject</a>( <a class="code" href="SoccerTypes_8h.html#a240">ObjectT</a> o, <a class="code" href="classSoccerCommand.html">SoccerCommand</a> soc )00407 {00408 <font class="keywordflow">return</font> <a class="code" href="classBasicPlayer.html#b3">turnNeckToPoint</a>( <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>(o, 1), soc );00409 }00410 <a name="l00442"></a><a class="code" href="classBasicPlayer.html#b14">00442</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b14">BasicPlayer::moveToPos</a>( <a class="code" href="classVecPosition.html">VecPosition</a> posTo, <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angWhenToTurn,00443 <font class="keywordtype">double</font> dDistBack, <font class="keywordtype">bool</font> bMoveBack )00444 {00445 <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 );00446 <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>();00447 <a class="code" href="classVecPosition.html">VecPosition</a> posAgent = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a43">getAgentGlobalPosition</a>(); 00448 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angTo = ( posTo - posPred ).getDirection();00449 angTo = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( angTo - angBody );00450 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angBackTo = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( angTo + 180 );00451 <font class="keywordtype">double</font> dDist = posAgent.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>( posTo );00452 00453 <font class="keywordflow">if</font>( bMoveBack )00454 {00455 <font class="keywordflow">if</font>( fabs( angBackTo ) < angWhenToTurn )00456 <font class="keywordflow">return</font> <a class="code" href="classBasicPlayer.html#b5">dashToPoint</a>( posTo );00457 <font class="keywordflow">else</font>00458 <font class="keywordflow">return</font> <a class="code" href="classBasicPlayer.html#b2">turnBackToPoint</a>( posTo );00459 }00460 <font class="keywordflow">else</font> <font class="keywordflow">if</font>( fabs( angTo ) < angWhenToTurn ||00461 (fabs( angBackTo ) < angWhenToTurn && dDist < dDistBack ) )00462 <font class="keywordflow">return</font> <a class="code" href="classBasicPlayer.html#b5">dashToPoint</a>( posTo );00463 <font class="keywordflow">else</font>00464 <font class="keywordflow">return</font> <a class="code" href="classBasicPlayer.html#b1">turnBodyToPoint</a>( posTo );00465 }00466 <a name="l00531"></a><a class="code" href="classBasicPlayer.html#b15">00531</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b15">BasicPlayer::interceptClose</a>( )00532 {00533 <a class="code" href="classSoccerCommand.html">SoccerCommand</a> soc;00534 <font class="keywordtype">double</font> dPower, dDist;00535 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> ang, ang2;00536 <a class="code" href="classVecPosition.html">VecPosition</a> s1, s2;00537 00538 <font class="comment">// first determine whether if distance to ball is not too large</font>00539 dDist = 2*<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a14">getPlayerSpeedMax</a>()00540 + (1.0 + <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a60">getBallDecay</a>())*<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a66">getBallSpeedMax</a>()00541 + <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a210">getMaximalKickDist</a>();00542 <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 )00543 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a180">CMD_ILLEGAL</a> );00544 00545 <font class="comment">// initialize all variables with information from worldmodel.</font>00546 <a class="code" href="classVecPosition.html">VecPosition</a> posAgent = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a43">getAgentGlobalPosition</a>( );00547 <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 );00548 <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 );00549 <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>( );00550 <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>( );00551 <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>( );00552 00553 <font class="comment">// make a line from center of body in next cycle with direction of body</font>00554 <font class="comment">// use next cycle since current velocity is always propogated to position in</font>00555 <font class="comment">// next cycle. Make a circle around the ball with a radius equal to the</font>00556 <font class="comment">// sum of your own body, the ball size and a small buffer. Then calculate</font>00557 <font class="comment">// the intersection between the line and this circle. These are the (two)</font>00558 <font class="comment">// points that denote the possible agent locations close to the ball</font>00559 <font class="comment">// From these two points we take the point where the body direction of the</font>00560 <font class="comment">// agent makes the smallest angle with the ball (with backward</font>00561 <font class="comment">// dashing we sometime have to dash "over" the ball to face it up front)</font>00562 <a class="code" href="classLine.html">Line</a> line = <a class="code" href="classLine.html#d1">Line::makeLineFromPositionAndAngle</a>(posPred,angBody);00563 dDist = <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a6">getPlayerSize</a>()+<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a58">getBallSize</a>()+<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a76">getKickableMargin</a>()/6;00564 <font class="keywordtype">int</font> iSol = line.<a class="code" href="classLine.html#a3">getCircleIntersectionPoints</a>( <a class="code" href="classCircle.html">Circle</a>(posBall,dDist), &s1, &s2);00565 <font class="keywordflow">if</font> (iSol > 0) <font class="comment">// if a solution</font>00566 {00567 <font class="keywordflow">if</font> (iSol == 2) <font class="comment">// take the best one</font>00568 {00569 ang = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>((posBall - s1).getDirection() -angBody);00570 ang2 = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>((posBall - s2).getDirection() -angBody);00571 <font class="keywordflow">if</font> ( fabs(ang2) < 90)00572 s1 = s2; <font class="comment">// and put it in s1</font>00573 }00574 00575 <font class="comment">// try one dash</font>00576 <font class="comment">// now we have the interception point we try to reach in one cycle. We</font>00577 <font class="comment">// calculate the needed dash power from the current position to this point,</font>00578 <font class="comment">// predict were we will stand if we execute this command and check whether</font>00579 <font class="comment">// we are in the kickable distance</font>00580 dPower = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(s1-posAgent, angBody, velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>() );00581 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);00582 <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>() )00583 <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 );00584 }00585 00586 <font class="comment">// try turn and then dash</font>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?