Robcup2D足球学习记录【2020.01.06】

本次学习过程主要阅读了所有核心球员代码

核心球员代码结构

核心球员的代码结构如下:

  1. 执行函数 bool RoleOffensiveHalf::execute(PlayerAgent * agent);
  2. 踢球动作函数 void RoleOffensiveHalf::doKick(PlayerAgent * agent);
  3. 移动函数 void RoleOffensiveHalf::doMove(PlayerAgent * agent);

对于每个函数的理解

execute函数
此函数为球员函数的核心函数,负责调用doKick函数和doMove函数来实现球员在场上的移动和踢球。
函数的大致内容如下:

  1. 首先判断自己是否具有踢球条件。
  2. 然后判断队友是否有更优先的踢球条件,如果有,则优先让给队友踢球。
  3. 如果队友没有优先踢球条件,并且自己有踢球条件,则调用doKick函数,执行踢球动作。
  4. 否则,调用domove函数,执行运动动作。

doKick函数
此函数为核心球员的踢球函数。
函数的大致内容如下:

  1. 首先判断当前球队是否在执行联合进攻。
  2. 如何判断结果为真,则不调用基本进攻踢球函数。
  3. 否则,调用基本进攻踢球函数。

doMove函数
此函数为核心球员的移动函数。
其原理如下:

  1. 将球场划分几个区域,如危险区、半场防守区、半场进攻区、运球区、传球区等等。
  2. 判断当前球落在哪个区域,不同的区域,球员执行不同的move函数。

函数的大致内容如下:

  1. 判断当前球落在哪个区域
  2. 通过switch语句,执行不同的move函数。

仍然存在的问题

  1. 源代码中为什么没有Bhv_ChainAction()函数,这个函数的具体原理是什么?
  2. Strategy类里面包含的函数具体作用是什么?
  3. 根据球的位置把球场划分成了不同的块,那么划分的依据与边界条件是什么?
  4. Strategy::BA_Cross与Strategy::BA_CrossBlock的区别是什么?
  5. wm.self().unum()是指的自己球员的球号吗?

体会

这一次学习,主要阅读了所有核心球员的源代码。其实读了一两个就会发现,所有球员的核心代码的大框架都是一模一样的。在执行函数里面调用相应的doKick函数和doMove函数。而区别不同球员的点在于,不同球员的doMove函数不一样。比如半场进攻球员的domove函数里面调用的,大多数都是attackMove函数。而半场防守球员的domove函数里面调用的,大多数都是DefensiveMove函数。所以可见,如果以后需要修改代码,最先需要考虑的就是修改核心球员代码的domove函数。球落在什么区域,执行什么样的move函数?这是第一层思考的点。还有就是不同的move函数可以做出什么样的改进?在实际过程中,发现大致的思路是对的,但是某个细化的move函数不太理想,那么这个时候就需要再挖一层,去到具体的move函数去修改代码了。
当然,这次学习过程也发现了自己有些地方需要加强。比如,很多底层代码,例如doOffensiveMove函数等等,我第一眼看过去都记不清这个函数的具体原理是什么,这样就很阻碍我对整个代码思想的理解。所以我在接下来阶段需要加强底层代码原理的理解。希望可以继续加油!~

posted @ 2020-01-06 15:39  南孚先生  阅读(172)  评论(0编辑  收藏  举报