工具准备
VS 2019 : 用于编译代码,运行单元测试,条件断点,单步调试等。
炉石传说官方插件: 复盘录像,截图牌面,方便可视化理解单元测试。
棋牌类Ai算法的通用框架是
当前一共有哪些有效操作选择 考虑思考深度,不仅仅考虑本轮,考虑未来几回合之后,这就构成了一个庞大的牌面操作树。 树的节点是排名,连接是具体的执行操作。根节点是当前牌面,第一层节点是是本回合可能的操作后的牌面。 第二层节点是对方可能的操作后的牌面,第三层是己方。。 以此类推。 理论上,树如果足够深,是应该到分出输赢的程度,这样这棵树就是完备的,当前就可以做出完美的最优解。但常常受制于计算量过大,需要对树做剪枝,确保计算量可控。
每个操作选择带来的牌面评估 AI算法核心就是:牌面打分函数,基于打分,选择当前最优操作 如果搜索树是完备的,当前牌面打分函数就应该是选择胜率最高的,当通常没法暴力搜索全部,所以需要用一些特征和规则来预测胜率,给出牌面评估和打分。
我很快遇到的问题就是:我怎么知道我修改的是对的,我的参数知道要向变大的方向调整,到底是变大1.5倍,2倍还是10倍? 为了改好这个场景,我调整了这个地方,会不会导致别的好场景失败了?(其实这都是通用的算法策略参数调试的问题)
也就是 如何调试炉石AI策略和参数 ?
答案是构造单元测试用例,输入是一个牌面描述,输出当前打法,你看看是否吻合你的预期,每个这种单元测试都存下来,每次修改可以考虑相关用例都run一遍。
HSAi 主程序是AiTest.cs
代码逻辑
1.读入类似Test\Data目录的牌面信息文件(比如 eat415.txt),构造Playfield类
2.构造Ai类,请根据自己的策略,new出不同的Behavior子类。 Ai ai = Ai.Instance; ai.botBase = new BehaviorSecMage(); //根据卡组选择合适的策略,此处为奥秘法子类
3.运行Ai类,计算最佳操作,记录进入Logg.txt ai.autoTester(true, data, 2);// 0:全做 1:只斩杀 2:正常 有可能斩杀的场景请选0,不可能斩杀的场景请选择2,没看懂则请选0.
请在Logg.txt中查阅搜索树的每一层搜索的牌面情况,打分,以及动作,以及全局最优打法,看是否符合自己预期。
我的代码 新增了Test文件夹(AiTest.cs,测试样例所在目录),修改了上传的文件夹包括ai,behavior,以及DefaultRoutine里面几个文件
运行办法
有任何问题,欢迎评论留言,欢迎提供有趣的场面和对应txt文件。
代码 注意代码里面策略是不完整的,仅为演示单元测试。 可参考的地方是:
Test\Data里面有我收集的10多个测试用例场景,txt和配图都有,欢迎大家尝试,如果所有用例能跑通,上传说没问题。
参考资料
感谢Chunk等一系列大佬前辈的博客内容,以上内容主要参考了Chunk的Ai Test代码,并修改符合个人体验和最新版本。
更多内容见主页Wiki
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。