Robotcup2D学习记录四
Robotcup2D学习记录四
这几天学习的重点我放在了如何修改代码的构思上,我个人想把修改的重点放在进攻球员身上,所以这几天反复看了一下进攻球员的代码,阅读记录如下:
bhv_prepare_set_play_kick
//这里的代码写的很简单,就是踢球前的准备动作
bool
Bhv_PrepareSetPlayKick::execute( PlayerAgent * agent )
{static int s_rest_wait_cycle = -1;// not reach the ball sideif ( Bhv_GoToStaticBall( M_ball_place_angle ).execute( agent ) ){return true;}// reach to ball sideif ( s_rest_wait_cycle < 0 ){s_rest_wait_cycle = M_wait_cycle;}
//设置为当前的cycleif ( s_rest_wait_cycle == 0 ){if ( agent->world().self().stamina() < ServerParam::i().staminaMax() * 0.9|| agent->world().seeTime() != agent->world().time() ){s_rest_wait_cycle = 1;}}if ( s_rest_wait_cycle > 0 ){if ( agent->world().gameMode().type() == GameMode::KickOff_ ){AngleDeg moment( ServerParam::i().visibleAngle() );agent->doTurn( moment );}else{Body_TurnToBall().execute( agent );}agent->setNeckAction( new Neck_ScanField() );s_rest_wait_cycle--;dlog.addText( Logger::TEAM,__FILE__": wait. rest cycles=%d",s_rest_wait_cycle );return true;}s_rest_wait_cycle = -1;return false;
}bhv_set_play_free_kick//球员踢球的动作
bool
Bhv_SetPlayFreeKick::execute( PlayerAgent * agent )
{dlog.addText( Logger::TEAM,__FILE__": Bhv_SetPlayFreeKick" );//---------------------------------------------------if ( Bhv_SetPlay::is_kicker( agent ) ){ //可以踢球就踢球doKick( agent );}else{ //不能踢球的情况下,移动doMove( agent );}return true;
}/*-------------------------------------------------------------------*/
/*!*/
void
Bhv_SetPlayFreeKick::doKick( PlayerAgent * agent )
{dlog.addText( Logger::TEAM,__FILE__": (doKick)" );//// go to the ball position//if ( Bhv_GoToStaticBall( 0.0 ).execute( agent ) ){return;}//// wait//if ( doKickWait( agent ) ){return;}//// kick//const WorldModel & wm = agent->world();const double max_ball_speed = wm.self().kickRate() * ServerParam::i().maxPower();//// pass//if ( Bhv_ChainAction().execute( agent ) ){agent->debugClient().addMessage( "FreeKick:Chain" );agent->setIntention( new IntentionWaitAfterSetPlayKick() );return;}const PlayerObject * nearest_teammate = wm.getTeammateNearestToSelf( 10, false ); // without goalieif ( nearest_teammate&& nearest_teammate->distFromSelf() < 20.0&& ( nearest_teammate->pos().x > -30.0|| nearest_teammate->distFromSelf() < 10.0 ) ){Vector2D target_point = nearest_teammate->inertiaFinalPoint();target_point.x += 0.5;
//这部分是传球的代码double ball_move_dist = wm.ball().pos().dist( target_point );int ball_reach_step= static_cast< int >( std::ceil( calc_length_geom_series( max_ball_speed,ball_move_dist,ServerParam::i().ballDecay() ) ) );double ball_speed = 0.0;if ( ball_reach_step > 3 ){ball_speed = calc_first_term_geom_series( ball_move_dist,ServerParam::i().ballDecay(),ball_reach_step );}else{ball_speed = calc_first_term_geom_series_last( 1.4,ball_move_dist,ServerParam::i().ballDecay() );ball_reach_step= static_cast< int >( std::ceil( calc_length_geom_series( ball_speed,ball_move_dist,ServerParam::i().ballDecay() ) ) );}ball_speed = std::min( ball_speed, max_ball_speed );
//对球的速度进行调整agent->debugClient().addMessage( "FreeKick:ForcePass%.3f", ball_speed );agent->debugClient().setTarget( target_point );dlog.addText( Logger::TEAM,__FILE__": force pass. target=(%.1f %.1f) speed=%.2f reach_step=%d",target_point.x, target_point.y,ball_speed, ball_reach_step );Body_KickOneStep( target_point, ball_speed ).execute( agent );agent->setNeckAction( new Neck_ScanField() );return;}}//// clear//if ( ( wm.ball().angleFromSelf() - wm.self().body() ).abs() > 1.5 ){agent->debugClient().addMessage( "FreeKick:Clear:TurnToBall" );dlog.addText( Logger::TEAM,__FILE__": clear. turn to ball" );Body_TurnToBall().execute( agent );agent->setNeckAction( new Neck_ScanField() );return;}agent->debugClient().addMessage( "FreeKick:Clear" );dlog.addText( Logger::TEAM,__FILE__": clear" );Body_ClearBall().execute( agent );agent->setNeckAction( new Neck_ScanField() );
}/*-------------------------------------------------------------------*/
/*!*/
bool
Bhv_SetPlayFreeKick::doKickWait( PlayerAgent * agent )
{const WorldModel & wm = agent->world();dlog.addText( Logger::TEAM,__FILE__": (doKickWait)" );const int real_set_play_count= static_cast< int >( wm.time().cycle() - wm.lastSetPlayStartTime().cycle() );if ( real_set_play_count >= ServerParam::i().dropBallTime() - 5 ){dlog.addText( Logger::TEAM,__FILE__": (doKickWait) real set play count = %d > drop_time-10, force kick mode",real_set_play_count );return false;}const Vector2D face_point( 40.0, 0.0 );const AngleDeg face_angle = ( face_point - wm.self().pos() ).th();if ( wm.time().stopped() != 0 ){Body_TurnToPoint( face_point ).execute( agent );agent->setNeckAction( new Neck_ScanField() );return true;}
//拖延策略if ( Bhv_SetPlay::is_delaying_tactics_situation( agent ) ){agent->debugClient().addMessage( "FreeKick:Delaying" );dlog.addText( Logger::TEAM,__FILE__": (doKickWait) delaying" );Body_TurnToPoint( face_point ).execute( agent );agent->setNeckAction( new Neck_ScanField() );return true;}
//无队友情况下if ( wm.teammatesFromBall().empty() ){agent->debugClient().addMessage( "FreeKick:NoTeammate" );dlog.addText( Logger::TEAM,__FILE__": (doKickWait) no teammate" );Body_TurnToPoint( face_point ).execute( agent );agent->setNeckAction( new Neck_ScanField() );return true;}
//根据playCount进行调整if ( wm.setplayCount() <= 3 ){agent->debugClient().addMessage( "FreeKick:Wait%d", wm.setplayCount() );Body_TurnToPoint( face_point ).execute( agent );agent->setNeckAction( new Neck_ScanField() );return true;}if ( wm.setplayCount() >= 15&& wm.seeTime() == wm.time()&& wm.self().stamina() > ServerParam::i().staminaMax() * 0.6 ){dlog.addText( Logger::TEAM,__FILE__": (doKickWait) set play count = %d, force kick mode",wm.setplayCount() );return false;}if ( ( face_angle - wm.self().body() ).abs() > 5.0 ){agent->debugClient().addMessage( "FreeKick:Turn" );Body_TurnToPoint( face_point ).execute( agent );agent->setNeckAction( new Neck_ScanField() );return true;}if ( wm.seeTime() != wm.time()|| wm.self().stamina() < ServerParam::i().staminaMax() * 0.9 ){Body_TurnToBall().execute( agent );agent->setNeckAction( new Neck_ScanField() );agent->debugClient().addMessage( "FreeKick:Wait%d", wm.setplayCount() );dlog.addText( Logger::TEAM,__FILE__": (doKickWait) no see or recover" );return true;}return false;
}/*-------------------------------------------------------------------*/
/*!*/
void
Bhv_SetPlayFreeKick::doMove( PlayerAgent * agent )
{const WorldModel & wm = agent->world();dlog.addText( Logger::TEAM,__FILE__": (doMove)" );Vector2D target_point = Strategy::i().getPosition( wm.self().unum() );if ( wm.setplayCount() > 0&& wm.self().stamina() > ServerParam::i().staminaMax() * 0.9 ){const PlayerObject * nearest_opp = agent->world().getOpponentNearestToSelf( 5 );
//存在对方球员在抢球区if ( nearest_opp && nearest_opp->distFromSelf() < 3.0 ){Vector2D add_vec = ( wm.ball().pos() - target_point );add_vec.setLength( 3.0 );long time_val = agent->world().time().cycle() % 60;if ( time_val < 20 ){}else if ( time_val < 40 ){target_point += add_vec.rotatedVector( 90.0 );}else{target_point += add_vec.rotatedVector( -90.0 );}target_point.x = min_max( - ServerParam::i().pitchHalfLength(),target_point.x,+ ServerParam::i().pitchHalfLength() );target_point.y = min_max( - ServerParam::i().pitchHalfWidth(),target_point.y,+ ServerParam::i().pitchHalfWidth() );}}target_point.x = std::min( target_point.x,agent->world().offsideLineX() - 0.5 );
//下面的代码是修改冲刺的体力double dash_power= Bhv_SetPlay::get_set_play_dash_power( agent );double dist_thr = wm.ball().distFromSelf() * 0.07;if ( dist_thr < 1.0 ) dist_thr = 1.0;agent->debugClient().addMessage( "SetPlayMove" );agent->debugClient().setTarget( target_point );agent->debugClient().addCircle( target_point, dist_thr );if ( ! Body_GoToPoint( target_point,dist_thr,dash_power).execute( agent ) ){// already thereBody_TurnToBall().execute( agent );}if ( wm.self().pos().dist( target_point )> std::max( wm.ball().pos().dist( target_point ) * 0.2, dist_thr ) + 6.0|| wm.self().stamina() < ServerParam::i().staminaMax() * 0.7 ){if ( ! wm.self().staminaModel().capacityIsEmpty() ){agent->debugClient().addMessage( "Sayw" );agent->addSayMessage( new WaitRequestMessage() );}}agent->setNeckAction( new Neck_TurnToBallOrScan() );
}
这几天一直在寻找有关策略的相关资料,但是还没有确定如何下手,初步设想是从阵型开始入手,然后就修改球员之间的跑位和信息交流等。在修改之前,还需要时间去进一步巩固一下相关的代码。
Robotcup2D学习记录四相关推荐
- leveldb 学习记录(四)Log文件
前文记录 leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice leveldb 学习记录(三) MemTable 与 Immutable Memtable le ...
- MySQL学习记录 (四) ----- SQL数据管理语句(DML)
相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...
- Kafka学习记录(四)——消费者
Kafka学习记录(四)--消费者 目录 Kafka学习记录(四)--消费者 对应课程 Kafka消费者工作流程 消费方式和流程 消费者组原理 消费者组初始化流程 消费者组详细消费流程 重要参数 ka ...
- 【故障诊断发展学习记录四——数字孪生与控制系统健康管理(DT PHM)】
数字数字 目录 1. 数字孪生的起源 1.1 数字工程 1.2 模型贯穿决策 1.3 数字工程路线图 1.4 数字工程战略目标 2. 美军数字工程 2.1 生态系统全视图 2.2 支持采办的的完整视 ...
- gRPC学习记录(四)--官方Demo
了解proto3后,接下来看官方Demo作为训练,这里建议看一遍之后自己动手搭建出来,一方面巩固之前的知识,一方面是对整个流程更加熟悉. 官方Demo地址: https://github.com/gr ...
- grpc简单使用 java_gRPC学习记录(四)-官方Demo - Java 技术驿站-Java 技术驿站
了解proto3后,接下来看官方Demo作为训练,这里建议看一遍之后自己动手搭建出来,一方面巩固之前的知识,一方面是对整个流程更加熟悉. 官方Demo地址: https://github.com/gr ...
- 《你好,放大器》----学习记录(四)
4 使用放大器的共性问题 4.1 放大器的封装 选择运放的封装,对整体电路板尺寸.焊接工艺和散热有影响,对电路性能也有影响 4.1.1 关于封装的一些基本概念 关于封装,主要关心两个参数: 管脚间距 ...
- python3.10官方文档学习记录四__赋值、比较运算
1 先来个例子: Python 还可以完成比二加二更复杂的任务. 例如,可以编写 斐波那契数列 的初始子序列,如下所示: >>> # 斐波那契级数: ... # 两个元素的和定义了下 ...
- Linux 学习记录 四(Bash 和 Shell scirpt).
一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...
- Spring-Security (学习记录四)--配置权限过滤器,采用数据库方式获取权限
目录 1. 需要在spring-security.xml中配置验证过滤器,来取代spring-security.xml的默认过滤器 2. 配置securityMetadataSource,可以通过ur ...
最新文章
- android的oomkiller_Android分析之LowMemoryKiller
- 循环相关函数range、enumerate、zip
- UA MATH571A 检验异方差的非参数回归方法
- Acwing 232. 守卫者的挑战
- 电脑桌面归纳小窗口_电脑一分钟小技巧:如何将电脑设置为定时关机?
- C++中指针与引用的区别
- Java log4j使用
- 如何在 Pr 中创建动作序列?
- MPLS ××× 的基本配置(二)
- 使用vue模拟通讯录列表,对中文名拼音首字母提取并排序
- 物品领用 系统 php,EXCEL物品管理系统V1.0(开放源码)
- Excel数据填充技巧
- 王者荣耀 露娜 技巧-教学-总结
- 计算机多媒体技术操作题,计算机多媒体技术操作题.doc
- 百度网盘mac损害计算机,百度网盘Mac版和Mac同步盘有哪些区别?百度网盘Mac版常见问题解答...
- yarn logs 查看日志
- 一文读懂锁相环基本原理
- php将json转化成数组,php如何把json转换成数组
- drill down roll up
- python2.7入门---XML解析