合工大机器人足球仿真robocup2D球队代码实验七实验验收
//这是2020年某上海第一建筑施工队亚军球队代码,仅供参考
/*
Copyright (c) 2000-2003, Jelle Kok, University of Amsterdam
All rights reserved.
Modified by ming gao Hfut..for server V14
1). dash dirction for not only forward and back but also left right and other 45*(-3,-1,1,3) dirction,,
2). add Stamina.Capacity and the senceHandle analy systerm and worldmodel update
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the University of Amsterdam nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*! \file PlayerTeams.cpp
<pre>
<b>File:</b> PlayerTest.cpp
<b>Project:</b> Robocup Soccer Simulation Team: UvA Trilearn
<b>Authors:</b> Jelle Kok
<b>Created:</b> 10/12/2000
<b>Last Revision:</b> $ID$
<b>Contents:</b> This file contains the class definitions for the
Player that are used to test the teams' high level
strategy.
<hr size=2>
<h2><b>Changes</b></h2>
<b>Date</b> <b>Author</b> <b>Comment</b>
10/12/2000 Jelle Kok Initial version created
</pre>
*/
#include "Player.h"
/*!This method is the first complete simple team and defines the actions taken
by all the players on the field (excluding the goalie). It is based on the
high-level actions taken by the simple team FC Portugal that it released in
2000. The players do the following:
- if ball is kickable
kick ball to goal (random corner of goal)
- else if i am fastest player to ball
intercept the ball
- else
move to strategic position based on your home position and pos ball */
///misol.gao fixed--->
///澶у濂斤紒寰堥珮鍏翠綘浠壘鍒颁簡杩欎釜鍑芥暟锛佽繖涓嚱鏁帮紝灏辨槸鎴戜滑鐞冮槦鍐崇瓥鐨勮捣鐐癸紝鎵€鏈夌殑姣旇禌绛栫暐閮藉湪杩欓噷锛屼粠杩欓噷鍑哄彂锛屼笉浼氶敊鐨勶紒
/// deMeer5 鏄悆鍛樼殑绛栫暐鍑芥暟锛?鍦ㄤ笅闈綘浠細鍙戠幇 deMeer5_goalie 閭d釜鏄畧闂ㄥ憳鐨勶紝鐩墠鍩烘湰鍙互蹇界暐銆?
SoccerCommand Player::deMeer5( )
{
SoccerCommand soc(CMD_ILLEGAL);// 瀹氫箟涓€涓懡浠ゅ璞★紝鍚庨潰浼氶绻佺敤瀹冩潵鏋勯€犱竴涓悆鍛樺姩浣滃懡浠?
VecPosition posAgent = WM->getAgentGlobalPosition();// 涓€涓偣瀵硅薄锛岃〃绀篈gent(鍙互鐞嗚В鎴愬綋鍓嶅湪鎵ц杩欎釜浠g爜鐨勭悆鍛樺畠鑷繁)鐨勪綅缃?
///涓嬮潰鎴戜滑鎶娾€滄垜鈥滃氨鐞嗚В鎴愬綋鍓嶆墽琛岃繖涓唬鐮佺殑Agent锛屽洜涓烘湁11涓悆鍛樺湪鎵ц杩欎釜浠g爜锛屾墍浠ュ浜庢瘡涓悆鍛?鑲畾鏈変竴涓€滄垜鈥濆瓨鍦ㄣ€?
VecPosition posBall = WM->getBallPos();// 鐞冪殑浣嶇疆
int iTmp;
if ( WM->isBeforeKickOff( ) ) /// 濡傛灉杩樻病鏈夊紑鐞?娉ㄦ剰锛?杩欓噷鍙槸杩樻病鏈夊紑鐞冪殑鎯呭喌锛?瑕佸仛寮€鐞冨悗鐨勫喅绛栵紝鍚戜笅闈㈢户缁壘鍙﹀涓€涓?WM->isBeforeKickOff( )
{
if ( WM->isKickOffUs( ) && WM->getPlayerNumber() == 9 ) // 9 takes kick //灏辨壘9鍙峰幓寮€鐞冿紙鍒ゆ柇浜嗘槸涓嶆槸鎴戜滑寮€鐞冿紝鍜屾垜"Agent"鏄笉鏄?鍙凤級
{
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 off" );
}
else //濡傛灉鐞冨浜庢垜涓嶅彲韪紝閭f垜灏卞幓鎶㈢悆锛?
{
soc = intercept( false );
Log.log( 100, "move to ball to take kick-off" );
}
ACT->putCommandInQueue( soc );
ACT->putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) );
return soc;
}
//涓嬮潰涓嶇敤绠★紒
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( ) );
}
}
else /// 杩欎釜else 澶у搴旇鍙互鐭ラ亾锛屾槸寮€鐞冧互鍚庣殑鍐崇瓥锛?涔熷氨鏄渶閲嶈鐨勬瘮璧涙甯告ā寮忎笅鐨勫喅绛栵紒 寰堥噸瑕侊紝鎴戜滑灏变粠杩欓噷寮€濮嬶紒锛侊紒锛?Start锛?
{
formations->setFormation( FT_433_OFFENSIVE );//璁剧疆鐞冮槦鍑哄満闃靛舰锛?
soc.commandType = CMD_ILLEGAL;//鍒濆鍖杝oc鍛戒护瀵硅薄
///test SoccerCommand(CMD_DASH, 80, 45) for v14 ... fixed by misol.gao
/* if ( WM->getPlayerNumber() == 8 )
{
soc = SoccerCommand(CMD_DASH, 80, 45);
ACT->putCommandInQueue( soc ); // 鏀惧叆鍛戒护闃熷垪
ACT->putCommandInQueue( alignNeckWithBody() );
return soc;
}*/
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()) // if kickable // 濡傛灉鐞冨凡鐭ワ紝鑰屼笖褰撳墠鐞冨湪鎴戣剼涓?鍙涪)
{
/*
wm->ndjvnjdsnjvkxjc???
cdskvkvmnsncmsm;;
s,c,,s,c,s,c ''
asmdkasmkcs,???
fw3f,smcscsc
s,xs,c ,sca
aslc,salc,ac
*/
//浠ヤ笂鏄紪璇戞í鍛戒护锛屼笉鐢ㄧ
Log.log( 100, "chongf f f f !!!", iTmp );
soc = intercept( false );
if ( soc.commandType == CMD_DASH &&
WM->getAgentStamina().getStamina() <
SS->getRecoverDecThr()*SS->getStaminaMax()+200 )
{
soc.dPower = 30.0 * WM->getAgentStamina().getRecovery();
}
else
{
VecPosition posGoal(PITCH_LENGTH/2.0,
(-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());
soc = kickTo(posGoal,SS->getBallSpeedMax());
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() ) // 濡傛灉鐞冧笉鍦ㄦ垜鐨勬帶鍒惰寖鍥翠笅锛屼絾鏄綋鍓嶈兘鏈€蹇姠鍒扮悆鐨勬槸鎴戯紝閭f垜灏卞幓鎵ц鎶㈢悆鍔ㄤ綔
{ // 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 // 杩欓噷鏄浣撳姏鐨勪竴涓繚鎶わ紝浣撳姏杩囦綆灏辨妸Dash鐨刣Power鍑忓皬 淇濇姢浣撳姏
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( ) )
{/*
a,a mav
sadasd
xc
x
cx
c
x
c
x
c
x
c
xc
x
x
x
x
x
xx
*/
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
//This is a joke!!!
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;
}
合工大机器人足球仿真robocup2D球队代码实验七实验验收相关推荐
- 合工大机器人足球仿真考试题56题(底层uva)
题目要求 //拿球后行为,利用已有 Worldmodel(21) (1)在 playOn 模式下,拿到球以后朝前方快速带球. (2)在 PlayOn 模式下,拿到球以后朝球门方向慢速带球. (3)在 ...
- 机器人足球仿真第一次作业
机器人足球仿真第一次作业 机器人足球仿真是一门与RoboCup有关的一门课程,讲到了有关球员的决策,球队的开发等知识. 这是老师布置的第一次作业,基本任务就是解析字符串,其功能相当于uva中Prase ...
- 机器人足球仿真中的三角进攻算法研究
摘 要:机器人足球仿真系统提供了实时对抗环境下研究多智能体协作问题的一个良好平台.本文基于仿真环境下的理论基础及模型,通过逐场次逐帧地测试与分析研究,设计出用于控制机器人协作队形的三角进攻算法,并对基 ...
- 合肥工业大学机器人足球仿真robcup作业二(python实现)附代码有注释
用面向对象的思维设计相关类,从而实现直线与直线.直线与圆.直线与矩形的交点. 要求各给出每个案例的至少一个示例的程序. 这是第二次机器人足球的作业代码,写的比较潦草,但是用的方法还是通俗易懂的,基本都 ...
- 合工大 机器人技术 作业
共四次作业报告,CSDN下载:下载链接 作业内容: <机器人技术>第一次作业 题目: 在机器人足球比赛中,server和球员client之间通过发送字符串来进行信息交互,其中server要 ...
- 合肥工业大学机器人足球仿真robcup作业三(python实现)附代码有注释
第三次作业 题目:已知2个点的信息,定位自己的绝对坐标. 设图中C(0,0),P1(-52.5,-32), P2(-52.5, 32), P3(52.5,32), P4(52.5,-32), P5(0 ...
- 合工大机器人技术第四次作业
仿真 足球机器人 第四次作业 决策树 该实例中总共有12个对象,6个类为"是",6个类为"否" I(p,n)=-(6/12)log2(6/12)-(6/12)l ...
- 机器人足球仿真第二次作业
要求 用面向对象的思维设计相关类,从而实现直线与直线.直线与圆.直线与矩形的交点 思路 设计直线,圆,矩形的类,运用数学定义来判断是否有交点,并计算出交点的坐标. 代码示例:(使用 VS Code 运 ...
- 合工大机器人技术第一次个人作业
一点说明: 由于处理see信息的模式字符串过于复杂,而且耗费精力,此处仅仅使用了字典来进行处理,而且也没有分清楚每个数字具体的物理意义.最后将字典格式的json文件写入了文件.可以使用format() ...
最新文章
- 通过三个直观步骤理解ROC曲线
- ExtJs中column与form布局的再次领悟
- RhinoMock入门(7)——Do,With和Record-playback
- linux下syscall函数 间接系统调用
- 地磅称重软件源码_【漯河衡器】浅谈地磅称重的发展趋势
- 【theano-windows】学习笔记七——logistic回归
- lintcode 最大子数组III
- 电脑字体模糊_小红书上传视频模糊?做小红书视频99%的工具都在这了
- 怎样去掉a标签的蓝框
- oracle下查询的sql已经超出IIS响应时间
- ISweek工采网·工采电子参展OFweek维科网 2021全球数字经济产业大会圆满落幕
- pdf照片显示正常打印时被翻转_【20考研】现场确认完没事了?!准考证打印别大意!...
- java 校验银行卡号_Java之——基于Luhn算法的银行卡卡号的格式校验
- 【spring事务管理】
- JS - 解决鼠标单击、双击事件冲突问题(同时实现两种事件响应)
- 当人们流行“炮轰”联想时:没想到的联想
- 超强指南!1分钟学会给电脑磁盘分区!
- mysql 复制数据库
- 《宝宝出生特别纪念日》
- powerdesinger 批量修改表前缀