Robcup2D足球学习记录【2020.01.06】
核心球员代码结构
核心球员的代码结构如下:
- 执行函数 bool RoleOffensiveHalf::execute(PlayerAgent * agent);
- 踢球动作函数 void RoleOffensiveHalf::doKick(PlayerAgent * agent);
- 移动函数 void RoleOffensiveHalf::doMove(PlayerAgent * agent);
对于每个函数的理解
execute函数
此函数为球员函数的核心函数,负责调用doKick函数和doMove函数来实现球员在场上的移动和踢球。
函数的大致内容如下:
- 首先判断自己是否具有踢球条件。
- 然后判断队友是否有更优先的踢球条件,如果有,则优先让给队友踢球。
- 如果队友没有优先踢球条件,并且自己有踢球条件,则调用doKick函数,执行踢球动作。
- 否则,调用domove函数,执行运动动作。
doKick函数
此函数为核心球员的踢球函数。
函数的大致内容如下:
- 首先判断当前球队是否在执行联合进攻。
- 如何判断结果为真,则不调用基本进攻踢球函数。
- 否则,调用基本进攻踢球函数。
doMove函数
此函数为核心球员的移动函数。
其原理如下:
- 将球场划分几个区域,如危险区、半场防守区、半场进攻区、运球区、传球区等等。
- 判断当前球落在哪个区域,不同的区域,球员执行不同的move函数。
函数的大致内容如下:
- 判断当前球落在哪个区域
- 通过switch语句,执行不同的move函数。
仍然存在的问题
- 源代码中为什么没有Bhv_ChainAction()函数,这个函数的具体原理是什么?
- Strategy类里面包含的函数具体作用是什么?
- 根据球的位置把球场划分成了不同的块,那么划分的依据与边界条件是什么?
- Strategy::BA_Cross与Strategy::BA_CrossBlock的区别是什么?
- wm.self().unum()是指的自己球员的球号吗?
体会
这一次学习,主要阅读了所有核心球员的源代码。其实读了一两个就会发现,所有球员的核心代码的大框架都是一模一样的。在执行函数里面调用相应的doKick函数和doMove函数。而区别不同球员的点在于,不同球员的doMove函数不一样。比如半场进攻球员的domove函数里面调用的,大多数都是attackMove函数。而半场防守球员的domove函数里面调用的,大多数都是DefensiveMove函数。所以可见,如果以后需要修改代码,最先需要考虑的就是修改核心球员代码的domove函数。球落在什么区域,执行什么样的move函数?这是第一层思考的点。还有就是不同的move函数可以做出什么样的改进?在实际过程中,发现大致的思路是对的,但是某个细化的move函数不太理想,那么这个时候就需要再挖一层,去到具体的move函数去修改代码了。
当然,这次学习过程也发现了自己有些地方需要加强。比如,很多底层代码,例如doOffensiveMove函数等等,我第一眼看过去都记不清这个函数的具体原理是什么,这样就很阻碍我对整个代码思想的理解。所以我在接下来阶段需要加强底层代码原理的理解。希望可以继续加油!~