• 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函数等等,我第一眼看过去都记不清这个函数的具体原理是什么,这样就很阻碍我对整个代码思想的理解。所以我在接下来阶段需要加强底层代码原理的理解。希望可以继续加油!~

  • 相关阅读:
    省市区选择器
    查找算法 分享1:顺序查找
    查找算法 分享2:折半(二分)查找
    编程实现对键盘输入的英文名句子进行加密。用加密方法为,当内容为英文字母时其在26字母中的其后三个字母代替该字母,若为其它字符时不变。
    查找算法 分享3:分块查找
    NSMutableDicitionary 的setValue和setObject的区别
    查找算法 分享4:哈希查找
    玩转博客园的5个小技巧
    WCF读书笔记安全:基础知识(身份验证、授权、传输安全)
    北京的房价
  • 原文地址:https://www.cnblogs.com/782687539-nanfu/p/12707609.html
Copyright © 2020-2023  润新知