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学习记录四相关推荐

  1. leveldb 学习记录(四)Log文件

    前文记录 leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice leveldb 学习记录(三) MemTable 与 Immutable Memtable le ...

  2. MySQL学习记录 (四) ----- SQL数据管理语句(DML)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  3. Kafka学习记录(四)——消费者

    Kafka学习记录(四)--消费者 目录 Kafka学习记录(四)--消费者 对应课程 Kafka消费者工作流程 消费方式和流程 消费者组原理 消费者组初始化流程 消费者组详细消费流程 重要参数 ka ...

  4. 【故障诊断发展学习记录四——数字孪生与控制系统健康管理(DT PHM)】

    数字数字 目录 1. 数字孪生的起源 1.1 数字工程 1.2  模型贯穿决策 1.3 数字工程路线图 1.4 数字工程战略目标 2. 美军数字工程 2.1 生态系统全视图 2.2 支持采办的的完整视 ...

  5. gRPC学习记录(四)--官方Demo

    了解proto3后,接下来看官方Demo作为训练,这里建议看一遍之后自己动手搭建出来,一方面巩固之前的知识,一方面是对整个流程更加熟悉. 官方Demo地址: https://github.com/gr ...

  6. grpc简单使用 java_gRPC学习记录(四)-官方Demo - Java 技术驿站-Java 技术驿站

    了解proto3后,接下来看官方Demo作为训练,这里建议看一遍之后自己动手搭建出来,一方面巩固之前的知识,一方面是对整个流程更加熟悉. 官方Demo地址: https://github.com/gr ...

  7. 《你好,放大器》----学习记录(四)

    4 使用放大器的共性问题 4.1 放大器的封装 选择运放的封装,对整体电路板尺寸.焊接工艺和散热有影响,对电路性能也有影响 4.1.1 关于封装的一些基本概念 关于封装,主要关心两个参数: 管脚间距 ...

  8. python3.10官方文档学习记录四__赋值、比较运算

    1 先来个例子: Python 还可以完成比二加二更复杂的任务. 例如,可以编写 斐波那契数列 的初始子序列,如下所示: >>> # 斐波那契级数: ... # 两个元素的和定义了下 ...

  9. Linux 学习记录 四(Bash 和 Shell scirpt).

    一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...

  10. Spring-Security (学习记录四)--配置权限过滤器,采用数据库方式获取权限

    目录 1. 需要在spring-security.xml中配置验证过滤器,来取代spring-security.xml的默认过滤器 2. 配置securityMetadataSource,可以通过ur ...

最新文章

  1. android的oomkiller_Android分析之LowMemoryKiller
  2. 循环相关函数range、enumerate、zip
  3. UA MATH571A 检验异方差的非参数回归方法
  4. Acwing 232. 守卫者的挑战
  5. 电脑桌面归纳小窗口_电脑一分钟小技巧:如何将电脑设置为定时关机?
  6. C++中指针与引用的区别
  7. Java log4j使用
  8. 如何在 Pr 中创建动作序列?
  9. MPLS ××× 的基本配置(二)
  10. 使用vue模拟通讯录列表,对中文名拼音首字母提取并排序
  11. 物品领用 系统 php,EXCEL物品管理系统V1.0(开放源码)
  12. Excel数据填充技巧
  13. 王者荣耀 露娜 技巧-教学-总结
  14. 计算机多媒体技术操作题,计算机多媒体技术操作题.doc
  15. 百度网盘mac损害计算机,百度网盘Mac版和Mac同步盘有哪些区别?百度网盘Mac版常见问题解答...
  16. yarn logs 查看日志
  17. 一文读懂锁相环基本原理
  18. php将json转化成数组,php如何把json转换成数组
  19. drill down roll up
  20. python2.7入门---XML解析

热门文章

  1. android 侧滑删除方法,Android recyclerview实现拖拽排序和侧滑删除
  2. 软件工程课程设计分组与选题名单
  3. 谷歌浏览器设置关闭搜索记录
  4. Python技术pip的使用命令总结
  5. Codeforces 106C Buns 【0-1背包】
  6. Windows 10 布置IP安全策略
  7. Linux下校对服务器时间同网络时间一致
  8. 什么是监管数据?什么是监管信息系统?监管数据安全管理办法说了什么?
  9. 迪普科技“高”在哪里?
  10. 隔离太无聊!不如用Python实现愤怒的小鸟,看看能否通关!