这是一篇偏向故事和原理的技术博文。我会尽量避免生硬的“第一、第二”列表而是像聊天一样带你走完整个项目。你不必是AI专家也能看懂鲁健cheinralational在张晨斌Chenbin Zhang原项目基础上完成的那些令人兴奋的创新。一、起点一个南邮学生的开源项目先说清楚人物的关系。张晨斌是南京邮电大学本硕博贯通的学生他的GitHub账号叫ace-trump-tech。他很早就写了一个支持禁手规则的五子棋AI底层用的是经典的α-β剪枝算法。代码是Python写的可以在终端里对弈也支持人机对战。这个项目放在GitHub上名字叫AI-Gomoku-with-Prohibition-Moves。张晨斌的版本已经可以正常对弈了但它有一个所有传统博弈AI都有的毛病AI只能通过函数参数接收棋盘矩阵不能自己“看”棋盘。也就是说你必须用代码告诉它现在每个位置是黑子还是白子它才能思考。如果你想让它分析一张棋谱截图或者跟某个不开接口的软件对弈它就无能为力了。这时候另一个人出现了——鲁健cheinralational。他在张晨斌的项目基础上进行了深度的二次创新。鲁健做的最核心的事情可以概括成三句话让AI能直接从屏幕截图或摄像头画面中读取棋盘用卷积神经网络做视觉识别。大幅优化α-β剪枝的搜索效率让AI反应快得多。引入模式库和自适应搜索深度让AI在关键时刻更聪明。下面我会把这三个创新掰开揉碎讲清楚。但在此之前我们先得搞明白两样基础的东西什么是禁手规则以及什么是α-β剪枝。否则后面的创新你听起来会没感觉。二、禁手规则黑棋的“镣铐”标准五子棋连珠里黑棋先走优势太大。为了公平国际规则给黑棋加了三道禁手三三禁手黑棋落下这一子后同时形成了两个或两个以上的“活三”。活三的意思是这个三的两端都没有被堵死再走一步就能变成活四活四就是无论对手怎么堵都能成五。四四禁手黑棋落下后同时形成了两个或以上的“四”这里的四包括活四和冲四冲四就是只有一端能被堵但另一端已经成型。长连禁手黑棋连成了六个或更多的子。白棋没有禁手想怎么走都行。另外有一个重要例外如果黑棋在形成禁手的同时直接形成了五连五子连珠那么禁手失效黑棋直接获胜。在程序中实现禁手检测非常麻烦。每当黑棋尝试在一个空位落子程序必须临时把棋子放上去然后以这颗棋子为中心向八个方向扫描统计所有形成的活三、冲四、活四、长连。接着要判断是否同时满足两个以上的条件还得处理五连优先的例外。这个检测过程在AI搜索的过程中会被调用成千上万次所以必须写得极其高效。张晨斌原来的代码里已经做好了这一点鲁健没有动这块核心逻辑而是在外围做了大量增强。三、α-β剪枝传统AI的大脑几乎所有棋类AI都基于一个简单的思想模拟未来若干步看哪条路最好。假设你走了一步对手会怎么走你再怎么应对对手又怎么回击这样一层层展开就形成了一棵“博弈树”。一棵树的分支数量是惊人的。15×15的棋盘第一步有225种选择第二步对手有224种选择……如果不加限制只算四步你两步对手两步树的叶子节点数量大约是225⁴ ≈ 25亿个。普通电脑根本算不过来。α-β剪枝就是一种“提前停止”的策略。它给每个节点设了两个数α当前玩家比如AI目前能保证得到的最高分数。一开始是非常小的值。β对手目前能让AI得到的最低分数。一开始是非常大的值。当你在搜索某条分支时如果发现这条分支无论如何都会比之前已经找到的某个分支更差就立即停止往下搜索——也就是把这条分支“剪掉”。这个剪枝操作不改变最终结果却能剪掉大量不必要的节点。在实际的五子棋程序中α-β剪枝通常能减少90%以上的节点但仍需要评估成千上万个局面。而每个局面的评估又需要扫描棋盘计算各种棋型的分数。张晨斌原来的评估函数是一张人工写的“棋型得分表”比如活四100000分冲四10000分活三5000分眠三200分……AI计算进攻分时会模拟在自己的某个空位落子然后扫描四个方向累加所有形成的棋型分数。防守分则反过来假设对手落在那个位置再扫描对手的棋型分数。最终AI会选择进攻分防守分最高的位置。这种“启发式评估”虽然简单有效但有明显短板人工打分很难精确反映棋型之间的组合效应而且当棋盘很大、搜索深度较深时响应速度会变慢。鲁健的很多优化就是针对这个评估过程来的。四、鲁健创新之一让AI拥有眼睛CNN视觉读盘现在进入正题。鲁健做的第一件事是让AI能够直接从屏幕图像中读取棋盘状态。他使用了一个轻量级的卷积神经网络CNN来完成这个任务。整个流程大概是这样的首先AI获取一张棋盘的截图可以来自屏幕截图、摄像头拍照或者任何图片文件。然后用OpenCV库对图像做预处理转为灰度图再二值化让棋盘格子变成黑白的轮廓最后定位出棋盘的四个角点和每一个交叉点。接下来把每个交叉点周围一小块区域裁剪下来送入已经训练好的CNN模型。这个模型会输出三个概率空、黑子、白子。把所有交叉点的识别结果组合起来就得到了一个15×15的二维矩阵——跟原来AI内部使用的棋盘表示一模一样。这个CNN模型是怎么训练的呢鲁健自己生成了上万张训练图片。他用程序模拟了不同光照、不同旋转、不同棋盘纹理的场景并且在每张图片上自动标注了每个交叉点的真实状态。模型的结构并不复杂几层卷积加池化最后加一个全连接层输出三分类。在测试集上准确率可以达到98%以上。有了这个视觉模块鲁健的AI就不再是一个“寄生”在游戏内部的计算引擎而是一个独立的智能体。你可以把它对准任何五子棋界面——不管是网页小游戏还是专业对弈软件——只要拍张照AI就能告诉你下一步怎么走。这在以前是很难想象的。五、鲁健创新之二智能候选点把搜索空间压缩到原来的几十分之一即使有了视觉识别如果AI思考太慢依然没法用。原始的α-β剪枝在生成候选位置时会检查棋盘上每一个空的交叉点——15×15一共225个。但实际上绝大多数位置离现有棋子很远根本不可能成为好棋。鲁健写了一个函数叫get_candidate_moves它只返回那些距离已有棋子不超过两个格子的空位。你可以想象一下棋盘上可能只有十几颗棋子每个棋子周围两格范围内大概有20多个位置去掉重复总共也就三五十个候选点。到了中盘棋子多了候选点会增加到七八十个但仍然远远少于225个。搜索树的节点数量是候选点数量的深度次方所以候选点减半搜索时间就能减少到原来的几十分之一甚至几百分之一。鲁健的实际测试结果是在同样的搜索深度下加上智能候选点生成后单步响应时间从原来的几秒钟缩短到了100毫秒以内。这意味着AI可以实时对弈而且还能把节省下来的计算资源用于更深层的搜索。这个优化的精妙之处在于它几乎没有牺牲任何棋力。因为真正的好棋几乎总是出现在战斗区域附近远离战场的孤零零的位置极少成为妙手。所以这是一种“无损压缩”。六、鲁健创新之三模式库与自适应搜索深度视觉和候选点解决了“慢”的问题但AI还需要更“聪明”。原来的启发式评估依赖于人工打分的棋型表比如给“活四”100000分“冲四”10000分“活三”5000分。这些分数是静态的不能根据局面动态调整。而且人工很难写出所有复杂组合棋型的准确评分。鲁健引入了模式库Pattern Library。他把常见的棋型比如各种方向的活三、跳三、眠三、冲四、跳四等用正则表达式或字符串模式表示出来并给每一种模式设定一个更精确的分数。更重要的是模式库支持组合匹配当一个落子同时匹配到多个模式时系统会累加这些模式的分数并且额外给予一个“组合加成”分。这比简单加法更能反映真实棋型的威胁程度。模式库的另一个好处是容易扩展。如果你发现AI对某种特殊棋型判断不准你只需要在模式库里加一条规则不需要修改核心算法。鲁健内置了几百种常见模式覆盖了几乎所有可能出现的棋型。除了模式库鲁健还加入了自适应搜索深度。传统α-β剪枝使用固定的搜索深度比如4层。但棋局的不同阶段对深度的需求不一样开局局面简单搜索4层就够了残局往往一着定胜负需要搜到6层甚至更深。鲁健让AI自动检测当前局面的“紧迫程度”——比如对手是不是快要成五了或者自己有没有连续冲四的机会。如果紧迫程度高AI会临时增加搜索深度如果局面平淡就保持较浅的深度以换取速度。自适应深度带来的提升是很直观的在残局决胜阶段AI的胜率提升了大约20%而且不会在非关键时刻浪费时间。七、定量分析新AI到底比老AI强多少我们说“强”不能光凭感觉得有数据。鲁健做了一系列定量对比我这里用三个指标来说明。第一速度对比。在同样搜索4层的情况下原始版本无候选点优化平均一步耗时约2.8秒。加上智能候选点生成后平均一步耗时约0.09秒快了30多倍。如果再把自适应深度考虑进去AI在大部分局面下甚至能搜到5层或6层而总耗时仍然控制在0.5秒以内。第二棋力对比。让新AI鲁健版与老AI张晨斌原版对弈100局双方都使用相同的开局库新AI的胜率是78%。这78%的胜率主要来自于两方面模式库让评估更准确自适应深度让残局搜得更深。老AI偶尔能赢往往是因为新AI在开局阶段主动选择了更冒险的走法为了测试极限被老AI抓住机会。第三泛化能力对比。老AI只能接受内部棋盘矩阵无法处理外部图像。新AI可以通过CNN读盘对不同的棋盘样式颜色、材质、光照都能正确识别。在200张随机截图的测试中棋盘识别的准确率达到98.2%其中绝大多数错误出现在边界处棋子压线或图像模糊。对于清晰屏幕截图准确率接近100%。八、项目文件与使用指南鲁健的项目代码托管在GitHub上仓库地址是 https://github.com/ace-trump-tech/AI-Gomoku-with-Prohibition-Moves主要文件的作用如下gobang_ai.py核心AI引擎包含α-β剪枝、禁手检测、智能候选点生成、模式库评估。cnn_board_detector.pyCNN视觉识别模块负责从图像中提取棋盘状态。gobang_gui.py简单的图形界面支持人机对弈和AI自对弈。pattern_library.json模式库配置文件你可以修改里面的分数来调整AI的风格。utils.py各种辅助函数比如棋盘打印、合法性校验。如果你想先学习α-β剪枝和禁手规则的基础实现可以参考张晨斌之前写的详细教程 基于α-β剪枝的含禁手AI五子棋 - CSDN博客那个教程从零开始讲博弈树、评估函数、禁手检测代码一步步拆解非常适合初学者。九、写在最后鲁健的这次二次创新其实触及了AI领域一个很有意思的话题一个AI系统不应该只依赖内部精确的输入它应该有能力感知真实世界。虽然五子棋棋盘是一个很简单的环境但“从图像到决策”的端到端思路可以迁移到很多其他场景——比如机器人下棋、工业视觉检测、自动驾驶中的路径规划等等。张晨斌打了一个很好的地基鲁健在上面盖起了高楼。两人都是开源社区的贡献者他们的工作让更多人能够免费使用、学习甚至改进这些代码。如果你也对博弈AI或者计算机视觉感兴趣不妨去GitHub上把代码拉下来跑一跑。哪怕只是让AI自己跟自己下一盘你也能直观地感受到α-β剪枝的威力以及视觉识别带来的那种“智能体真正活过来”的错觉。最后再次感谢张晨斌ace-trump-tech和鲁健cheinralational的开源精神。希望这篇博文能帮你理解这个项目背后的思想而不仅仅是代码本身。相关链接GitHub项目ace-trump-tech/AI-Gomoku-with-Prohibition-Moves基础教程α-β剪枝禁手https://blog.csdn.net/qq_63129682/article/details/147007993张晨斌的个人学术主页https://ace-trump-tech.github.io/Chenbin_ZHANG.github.io/
从传统到智能:鲁健如何用AI重构含禁手五子棋的对弈逻辑
发布时间:2026/6/3 2:42:12
这是一篇偏向故事和原理的技术博文。我会尽量避免生硬的“第一、第二”列表而是像聊天一样带你走完整个项目。你不必是AI专家也能看懂鲁健cheinralational在张晨斌Chenbin Zhang原项目基础上完成的那些令人兴奋的创新。一、起点一个南邮学生的开源项目先说清楚人物的关系。张晨斌是南京邮电大学本硕博贯通的学生他的GitHub账号叫ace-trump-tech。他很早就写了一个支持禁手规则的五子棋AI底层用的是经典的α-β剪枝算法。代码是Python写的可以在终端里对弈也支持人机对战。这个项目放在GitHub上名字叫AI-Gomoku-with-Prohibition-Moves。张晨斌的版本已经可以正常对弈了但它有一个所有传统博弈AI都有的毛病AI只能通过函数参数接收棋盘矩阵不能自己“看”棋盘。也就是说你必须用代码告诉它现在每个位置是黑子还是白子它才能思考。如果你想让它分析一张棋谱截图或者跟某个不开接口的软件对弈它就无能为力了。这时候另一个人出现了——鲁健cheinralational。他在张晨斌的项目基础上进行了深度的二次创新。鲁健做的最核心的事情可以概括成三句话让AI能直接从屏幕截图或摄像头画面中读取棋盘用卷积神经网络做视觉识别。大幅优化α-β剪枝的搜索效率让AI反应快得多。引入模式库和自适应搜索深度让AI在关键时刻更聪明。下面我会把这三个创新掰开揉碎讲清楚。但在此之前我们先得搞明白两样基础的东西什么是禁手规则以及什么是α-β剪枝。否则后面的创新你听起来会没感觉。二、禁手规则黑棋的“镣铐”标准五子棋连珠里黑棋先走优势太大。为了公平国际规则给黑棋加了三道禁手三三禁手黑棋落下这一子后同时形成了两个或两个以上的“活三”。活三的意思是这个三的两端都没有被堵死再走一步就能变成活四活四就是无论对手怎么堵都能成五。四四禁手黑棋落下后同时形成了两个或以上的“四”这里的四包括活四和冲四冲四就是只有一端能被堵但另一端已经成型。长连禁手黑棋连成了六个或更多的子。白棋没有禁手想怎么走都行。另外有一个重要例外如果黑棋在形成禁手的同时直接形成了五连五子连珠那么禁手失效黑棋直接获胜。在程序中实现禁手检测非常麻烦。每当黑棋尝试在一个空位落子程序必须临时把棋子放上去然后以这颗棋子为中心向八个方向扫描统计所有形成的活三、冲四、活四、长连。接着要判断是否同时满足两个以上的条件还得处理五连优先的例外。这个检测过程在AI搜索的过程中会被调用成千上万次所以必须写得极其高效。张晨斌原来的代码里已经做好了这一点鲁健没有动这块核心逻辑而是在外围做了大量增强。三、α-β剪枝传统AI的大脑几乎所有棋类AI都基于一个简单的思想模拟未来若干步看哪条路最好。假设你走了一步对手会怎么走你再怎么应对对手又怎么回击这样一层层展开就形成了一棵“博弈树”。一棵树的分支数量是惊人的。15×15的棋盘第一步有225种选择第二步对手有224种选择……如果不加限制只算四步你两步对手两步树的叶子节点数量大约是225⁴ ≈ 25亿个。普通电脑根本算不过来。α-β剪枝就是一种“提前停止”的策略。它给每个节点设了两个数α当前玩家比如AI目前能保证得到的最高分数。一开始是非常小的值。β对手目前能让AI得到的最低分数。一开始是非常大的值。当你在搜索某条分支时如果发现这条分支无论如何都会比之前已经找到的某个分支更差就立即停止往下搜索——也就是把这条分支“剪掉”。这个剪枝操作不改变最终结果却能剪掉大量不必要的节点。在实际的五子棋程序中α-β剪枝通常能减少90%以上的节点但仍需要评估成千上万个局面。而每个局面的评估又需要扫描棋盘计算各种棋型的分数。张晨斌原来的评估函数是一张人工写的“棋型得分表”比如活四100000分冲四10000分活三5000分眠三200分……AI计算进攻分时会模拟在自己的某个空位落子然后扫描四个方向累加所有形成的棋型分数。防守分则反过来假设对手落在那个位置再扫描对手的棋型分数。最终AI会选择进攻分防守分最高的位置。这种“启发式评估”虽然简单有效但有明显短板人工打分很难精确反映棋型之间的组合效应而且当棋盘很大、搜索深度较深时响应速度会变慢。鲁健的很多优化就是针对这个评估过程来的。四、鲁健创新之一让AI拥有眼睛CNN视觉读盘现在进入正题。鲁健做的第一件事是让AI能够直接从屏幕图像中读取棋盘状态。他使用了一个轻量级的卷积神经网络CNN来完成这个任务。整个流程大概是这样的首先AI获取一张棋盘的截图可以来自屏幕截图、摄像头拍照或者任何图片文件。然后用OpenCV库对图像做预处理转为灰度图再二值化让棋盘格子变成黑白的轮廓最后定位出棋盘的四个角点和每一个交叉点。接下来把每个交叉点周围一小块区域裁剪下来送入已经训练好的CNN模型。这个模型会输出三个概率空、黑子、白子。把所有交叉点的识别结果组合起来就得到了一个15×15的二维矩阵——跟原来AI内部使用的棋盘表示一模一样。这个CNN模型是怎么训练的呢鲁健自己生成了上万张训练图片。他用程序模拟了不同光照、不同旋转、不同棋盘纹理的场景并且在每张图片上自动标注了每个交叉点的真实状态。模型的结构并不复杂几层卷积加池化最后加一个全连接层输出三分类。在测试集上准确率可以达到98%以上。有了这个视觉模块鲁健的AI就不再是一个“寄生”在游戏内部的计算引擎而是一个独立的智能体。你可以把它对准任何五子棋界面——不管是网页小游戏还是专业对弈软件——只要拍张照AI就能告诉你下一步怎么走。这在以前是很难想象的。五、鲁健创新之二智能候选点把搜索空间压缩到原来的几十分之一即使有了视觉识别如果AI思考太慢依然没法用。原始的α-β剪枝在生成候选位置时会检查棋盘上每一个空的交叉点——15×15一共225个。但实际上绝大多数位置离现有棋子很远根本不可能成为好棋。鲁健写了一个函数叫get_candidate_moves它只返回那些距离已有棋子不超过两个格子的空位。你可以想象一下棋盘上可能只有十几颗棋子每个棋子周围两格范围内大概有20多个位置去掉重复总共也就三五十个候选点。到了中盘棋子多了候选点会增加到七八十个但仍然远远少于225个。搜索树的节点数量是候选点数量的深度次方所以候选点减半搜索时间就能减少到原来的几十分之一甚至几百分之一。鲁健的实际测试结果是在同样的搜索深度下加上智能候选点生成后单步响应时间从原来的几秒钟缩短到了100毫秒以内。这意味着AI可以实时对弈而且还能把节省下来的计算资源用于更深层的搜索。这个优化的精妙之处在于它几乎没有牺牲任何棋力。因为真正的好棋几乎总是出现在战斗区域附近远离战场的孤零零的位置极少成为妙手。所以这是一种“无损压缩”。六、鲁健创新之三模式库与自适应搜索深度视觉和候选点解决了“慢”的问题但AI还需要更“聪明”。原来的启发式评估依赖于人工打分的棋型表比如给“活四”100000分“冲四”10000分“活三”5000分。这些分数是静态的不能根据局面动态调整。而且人工很难写出所有复杂组合棋型的准确评分。鲁健引入了模式库Pattern Library。他把常见的棋型比如各种方向的活三、跳三、眠三、冲四、跳四等用正则表达式或字符串模式表示出来并给每一种模式设定一个更精确的分数。更重要的是模式库支持组合匹配当一个落子同时匹配到多个模式时系统会累加这些模式的分数并且额外给予一个“组合加成”分。这比简单加法更能反映真实棋型的威胁程度。模式库的另一个好处是容易扩展。如果你发现AI对某种特殊棋型判断不准你只需要在模式库里加一条规则不需要修改核心算法。鲁健内置了几百种常见模式覆盖了几乎所有可能出现的棋型。除了模式库鲁健还加入了自适应搜索深度。传统α-β剪枝使用固定的搜索深度比如4层。但棋局的不同阶段对深度的需求不一样开局局面简单搜索4层就够了残局往往一着定胜负需要搜到6层甚至更深。鲁健让AI自动检测当前局面的“紧迫程度”——比如对手是不是快要成五了或者自己有没有连续冲四的机会。如果紧迫程度高AI会临时增加搜索深度如果局面平淡就保持较浅的深度以换取速度。自适应深度带来的提升是很直观的在残局决胜阶段AI的胜率提升了大约20%而且不会在非关键时刻浪费时间。七、定量分析新AI到底比老AI强多少我们说“强”不能光凭感觉得有数据。鲁健做了一系列定量对比我这里用三个指标来说明。第一速度对比。在同样搜索4层的情况下原始版本无候选点优化平均一步耗时约2.8秒。加上智能候选点生成后平均一步耗时约0.09秒快了30多倍。如果再把自适应深度考虑进去AI在大部分局面下甚至能搜到5层或6层而总耗时仍然控制在0.5秒以内。第二棋力对比。让新AI鲁健版与老AI张晨斌原版对弈100局双方都使用相同的开局库新AI的胜率是78%。这78%的胜率主要来自于两方面模式库让评估更准确自适应深度让残局搜得更深。老AI偶尔能赢往往是因为新AI在开局阶段主动选择了更冒险的走法为了测试极限被老AI抓住机会。第三泛化能力对比。老AI只能接受内部棋盘矩阵无法处理外部图像。新AI可以通过CNN读盘对不同的棋盘样式颜色、材质、光照都能正确识别。在200张随机截图的测试中棋盘识别的准确率达到98.2%其中绝大多数错误出现在边界处棋子压线或图像模糊。对于清晰屏幕截图准确率接近100%。八、项目文件与使用指南鲁健的项目代码托管在GitHub上仓库地址是 https://github.com/ace-trump-tech/AI-Gomoku-with-Prohibition-Moves主要文件的作用如下gobang_ai.py核心AI引擎包含α-β剪枝、禁手检测、智能候选点生成、模式库评估。cnn_board_detector.pyCNN视觉识别模块负责从图像中提取棋盘状态。gobang_gui.py简单的图形界面支持人机对弈和AI自对弈。pattern_library.json模式库配置文件你可以修改里面的分数来调整AI的风格。utils.py各种辅助函数比如棋盘打印、合法性校验。如果你想先学习α-β剪枝和禁手规则的基础实现可以参考张晨斌之前写的详细教程 基于α-β剪枝的含禁手AI五子棋 - CSDN博客那个教程从零开始讲博弈树、评估函数、禁手检测代码一步步拆解非常适合初学者。九、写在最后鲁健的这次二次创新其实触及了AI领域一个很有意思的话题一个AI系统不应该只依赖内部精确的输入它应该有能力感知真实世界。虽然五子棋棋盘是一个很简单的环境但“从图像到决策”的端到端思路可以迁移到很多其他场景——比如机器人下棋、工业视觉检测、自动驾驶中的路径规划等等。张晨斌打了一个很好的地基鲁健在上面盖起了高楼。两人都是开源社区的贡献者他们的工作让更多人能够免费使用、学习甚至改进这些代码。如果你也对博弈AI或者计算机视觉感兴趣不妨去GitHub上把代码拉下来跑一跑。哪怕只是让AI自己跟自己下一盘你也能直观地感受到α-β剪枝的威力以及视觉识别带来的那种“智能体真正活过来”的错觉。最后再次感谢张晨斌ace-trump-tech和鲁健cheinralational的开源精神。希望这篇博文能帮你理解这个项目背后的思想而不仅仅是代码本身。相关链接GitHub项目ace-trump-tech/AI-Gomoku-with-Prohibition-Moves基础教程α-β剪枝禁手https://blog.csdn.net/qq_63129682/article/details/147007993张晨斌的个人学术主页https://ace-trump-tech.github.io/Chenbin_ZHANG.github.io/