agent2d简介
ps:agent2d是指现在最新的版本
agent2d是日本的Helios球队开发的底层。
agent2d的底层代码很强。在agent2d的3.x版本刚问世的时候,几乎不用怎么改动,就能在国赛或者世界杯上面取得很好的成绩。16年国赛,安徽建筑大学的球队就是用改了一点阵型的底层3-1把16年的季军球队南邮给做掉了。所以不要小看底层队伍。
agent2d的代码量很多。我之前,用wc工具统计了它的src和librcsc里面的代码。好像是在10万行左右。
agent2d的lib里面封装了很多有用的库。改动比较简单。
agent2d的文件组织
lib-rcsc (最新版本)
rcsc/action 动作类(重点)
rcsc/ann 人工神经网络类
rcsc/coach 在线教练类
rcsc/common 公共的类
rcsc/formation 一些阵型类(agent2d只使用了DT跑位)
rcsc/geom 一些几何类
rcsc/net 一些与server交换数据的类
rcsc/param 一些参数类
rcsc/player 一些球员类(重点)
rcsc/time 时间类(一般用不到)
rcsc/trainer 一些离线教练类
rcsc/util game_mode math version
agent2d (YuShan_Base)
src/
以bhv开头的都是在各种情况下的动作执行类(重要)
以role开头的都是角色类
以sample开头的都是示例,可以模仿其结构修改代码
以intertion开头的是意图类
以neck开头的是转脖子动作
data/formations-dt
保存了一些阵型的数据
src/chain_action
agent2d底层的决策核心(非常重要)
决策流程
sample_player.cpp (218hang)
/*!
main decision
virtual method in super class
*/
void
SamplePlayer::actionImpl()
{
//
// update strategy and analyzer
//
Strategy::instance().update( world() ); //更新决策模型
FieldAnalyzer::instance().update( world() ); //更新评估模型
//
// prepare action chain
//
M_field_evaluator = createFieldEvaluator(); //创建区域评估器
M_action_generator = createActionGenerator(); //创建动作链
ActionChainHolder::instance().setFieldEvaluator( M_field_evaluator ); //设置评估器
ActionChainHolder::instance().setActionGenerator( M_action_generator ); //设置动作链
//
// special situations (tackle, objects accuracy, intention...)
//一些特殊的情形
// check tackle expires
// check self position accuracy
// ball search
// check queued intention
// check simultaneous kick
//
if ( doPreprocess() )
{
dlog.addText( Logger::TEAM,
__FILE__": preprocess done" );
return;
}
//
// update action chain
//
ActionChainHolder::instance().update( world() );//更新动作链和评估
//
// create current role
//
SoccerRole::Ptr role_ptr;
{
role_ptr = Strategy::i().createRole( world().self().unum(), world() );//根据球员号码创建角色
if ( ! role_ptr )
{
std::cerr << config().teamName() << ": "
<< world().self().unum()
<< " Error. Role is not registerd.\nExit ..."
<< std::endl;
M_client->setServerAlive( false );
return;
}
}
//
// override execute if role accept
//
if ( role_ptr->acceptExecution( world() ) )
{
role_ptr->execute( this );//角色动作执行
return;
}
//
// play_on mode 正常比赛模式
//
if ( world().gameMode().type() == GameMode::PlayOn )
{
role_ptr->execute( this );
return;
}
//
// penalty kick mode 点球模式
//
if ( world().gameMode().isPenaltyKickMode() )
{
dlog.addText( Logger::TEAM,
__FILE__": penalty kick" );
Bhv_PenaltyKick().execute( this );
return;
}
//
// other set play mode 其它比赛模式
//
Bhv_SetPlay().execute( this );
}
role_x_x.cpp
bool
RoleCenterBack::execute( PlayerAgent * agent )
{
bool kickable = agent->world().self().isKickable();
if ( agent->world().existKickableTeammate()
&& agent->world().teammatesFromBall().front()->distFromBall()
< agent->world().ball().distFromSelf() )
{
kickable = false;
}
if ( kickable )//如果自身可踢球
{
doKick( agent ); //踢球
}
else
{//不可踢
doMove( agent );//跑位
}
return true;
}
agent2d球员角色分配
agent2d把球员角色划分为
中锋(11号)
边锋(9,10号)
边后卫(2,5号)
中后卫(3,4号)
防守型中场(6号)
进攻型中场(7.8号)
具体代码在ROLE_角色名中查看
具体角色划分在strategy.cpp里面
异构球员的顺序在sample_coach.cpp里面
代码执行流程
引用YuShan2011TDP内容
2.1 底层的执行流程
Agent2D底层执行的过程如下:先由Main()函数开始,首先是一些环境变
量设置,启动球员类。进入BasicClient类中,执行Run()函数,RunOnline()
调用PlayerAgent 类的 HandleMessage ()函数处理获得的信息,
HandleMessage () 函数调用在PlayerAgent类中的Action()函数进行动作决
策和Server参数的解析parse()函数。 在Action()函数中依次执行ActionImpl()
函数,DoArmAction()函数,DoViewAction()函数,DoNeckAction()函数
以及CommunicationImpl()函数。 其中ActionImpl()函数是主要的决策函数的
框架。基于球员在场上的角色(Role)以及场上位置(Home_Position),执
行相应的Role策略,这种基于角色的策略增加了球员的灵活性,使不同类型的
球员具有不同的策略,对于球场动态环境具有更强的自适应性。
ps:个人觉得这篇TDP干货很多,很适合入门学习。就放到云里面了。
链接:http://pan.baidu.com/s/1dF2rc0D 密码:gdq7
下周周末,有时间再写如何修改代码。