# HSAi **Repository Path**: thatcool/HSAi ## Basic Information - **Project Name**: HSAi - **Description**: 炉石传说Ai,仅用于个人编程语言学习,请勿用于商业或其他不合规用途 - **Primary Language**: C# - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 47 - **Forks**: 12 - **Created**: 2021-04-25 - **Last Updated**: 2024-10-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **工具准备** VS 2019  : 用于编译代码,运行单元测试,条件断点,单步调试等。  炉石传说官方插件: 复盘录像,截图牌面,方便可视化理解单元测试。 **棋牌类Ai算法的通用框架是** 1. 当前一共有哪些有效操作选择 考虑思考深度,不仅仅考虑本轮,考虑未来几回合之后,这就构成了一个庞大的牌面操作树。 树的节点是排名,连接是具体的执行操作。根节点是当前牌面,第一层节点是是本回合可能的操作后的牌面。 第二层节点是对方可能的操作后的牌面,第三层是己方。。  以此类推。 理论上,树如果足够深,是应该到分出输赢的程度,这样这棵树就是完备的,当前就可以做出完美的最优解。但常常受制于计算量过大,需要对树做剪枝,确保计算量可控。 2. 每个操作选择带来的牌面评估 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里面几个文件 **运行办法** 1. 确保你的老代码在vs里面可以编译通过,并请备份你的老代码一份(避免覆盖后无法还原)。 2. 下载我的DefaultRoutine文件夹,替换覆盖你的同名文件夹。 注意:不要删除原文件夹,因为几个没修改的文件夹我没上传比如很占地的card,data等目录。 3. 如果你的策略和我的策略同名(比如你用的就是rush,奥秘法等),也就是你的策略被步骤2覆盖,需要在behavior里面,重新增加你的策略文件夹。如果你的策略没被覆盖,忽略此步骤。 4. 修改AiTest.cs中需要new的策略子类 确保AiTest.cs输入的测试样例文件路径,TestBase.cs中card读取路径正确。 如果填错了,运行会报错,很明显。 5. VS 编译,运行,去Data目录里面看运行结果 Logg.txt,一般几k到几m不等,拖到结尾,可以看到最优打法输出。 有任何问题,欢迎评论留言,欢迎提供有趣的场面和对应txt文件。 **代码** 注意代码里面策略是不完整的,仅为演示单元测试。 可参考的地方是: 1. 有个测试框架,可以打印非常详细的搜索树每层情况,方便理解搜索打分过程 调参调策略 2. 把策略代码尽量放入Behavior文件夹,特定卡组的卡牌使用也都用虚函数getComboPenality里实现,方便修改单一卡组策略。而非最初都很乱的放在ai文件夹PenalityManager里面。 Test\Data里面有我收集的10多个测试用例场景,txt和配图都有,欢迎大家尝试,如果所有用例能跑通,上传说没问题。 **参考资料** 感谢Chunk等一系列大佬前辈的博客内容,以上内容主要参考了Chunk的Ai Test代码,并修改符合个人体验和最新版本。 更多内容见主页Wiki