电脑象棋开发-eleeye学习总结

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/buck84/article/details/8630924

这个引擎共分为几个步骤:

1. ucci.h/cpp 协议定义

主要是引擎有3种状态

引导:此时只接受ucci协议,收到后转到空闲状态

空闲:此时接受setoption(设置) position(局面) banmoves(设置禁手) go(进入思考状态) quit(退出)

思考:此时接受stop(停止) ponderhit(改变思考方式),输出bestmove或nobestmove后转到空闲状态

详细的说明可以参考官方网站


2. pregen.h/cpp 一些定义

棋盘定义(棋盘区域表,城池区域表,升变区域表),合理走法定义(合理走法跨度表,马腿表)

车炮位列数组生成,对于车或炮的某一个列或行,生成预定义数组,表示在一个局面下可走到的最大、最小位置、尺子可以走到的最大、最小位置

对车炮以外的其它子,生成普通走法数组(即在棋盘上某个位置可以走到的所有位置)


3. position.h/cpp 局面表示

棋子位置、逻辑定义,包括搜索中的一些变量,比如局面评价值、裁剪参数。从fen串识别局面


4. genmoves.cpp 局面表示

包括PositionStruct结构的4个比较复杂的函数:

Protected 判断某个位置是否被某个子保护

GenCapmoves 和 GenNonCapMoves 分别生成吃子和不吃子的走法,采用pregen.h/cpp中定义的位列技术和预定义表

ChasedBy 检测捉子,不是所有子,根据情况判断被捉子是否有根


5. hash.h/cpp 置换表

存取、获取置换表技术


6. book.h/cpp 开局库


7. movesort.h/cpp 走子与局面判断

每一次搜索过程中的走法过程:置换表->吃子走法->杀手走法->普通走法

走法排序中采用了shell排序

其它内容跟象棋小巫师教程里面内容差不多


8. search.h/cpp  递归搜索

搜索过程与教程中相比加入了更多内容,因为作为引擎,需要处理很多响应

这一部分与第7部分movesort是eleeye的主要内容,也应该是每一个引擎的主要内容

SearchMain做以下处理:

判断和棋和重复局面

搜索开局库

迭代遍历根节点

判断是否和棋或输棋

其它主要搜索过程有:根节点搜索,主变例搜索,唯一着法搜索,零窗口搜索


9. eleeye.cpp main文件

主要过程是:初始化 -> 设置局面 -> 搜索 -> 退出


10. preeval.h/cpp 扩展的局面评价(局面预评价)

计算当前局面下每个棋子在各个位置的实际值(开中局或残局),保存在PreEvalStruct中ucvlWhitePieces和ucvlBlackPieces

计算当前局面下空头炮、窝心马威胁,保存在PreEvalStructEx中vlHollowThreat和vlCentralThreat

计算当前局面下双方进攻状态vlBlackAdvisorleakage和vlWhiteAdvisorLeakage


11 evaluate.cpp 局面评价

第10和11部分是对局面的评价,感觉看完代码对提高下棋中局面评价也是有帮助的


eleeye中可能的问题:

搜索过程中记录主要变例AppendPvLine按照从前到后顺序记录,符合正常思维,但是每次都有一个while减慢了速度,我觉得可以先将其反向记录,最后输出的时候做一次翻转即可。

展开阅读全文

没有更多推荐了,返回首页