尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Unity多棋种合集:从规则引擎到AI搜索的完整工程实践
简介这是一份面向 Unity 开发者的棋盘游戏合集源码涵盖中国象棋、围棋、五子棋、国际象棋、日本将棋、黑白棋、扫雷、数独等十余款经典棋类与益智游戏。项目既包含单机 AI 对战也实现了部分联机玩法代码结构清晰适合作为游戏逻辑、AI 算法及网络同步的学习范本也可直接改造用于商业或毕设项目。整份资源共 2000 个文件压缩包体积 85.61MB其中有 535 个 C# 脚本、195 个预制体和 19 个 asset 配置同时包含 997 个 meta 文件以及 159 个 md 说明文档能看出工程完整且附带使用说明。基于 Unity 2019.4.24f1c1 及以上版本额外包含安卓相关 aar 与 dll 插件方便移动端适配。目前已有 786 人学习下载适合希望系统了解多种棋盘玩法和 AI 实现的开发者参考。通过本合辑可以一次摸清不同棋类的规则抽象、走法生成、胜负判断与人机交互流程联机模块也提供了现成的网络框架对想扩充个人作品集或做游戏原型验证的开发者是一份扎实的实用资源。 做了几年 Unity 开发棋类游戏一直是我用来练手和梳理基本功的首选项目。它不依赖重美术资源逻辑密度却高得惊人一套棋类合集做下来等于把状态管理、规则引擎、UI 编排、AI 搜索、数据持久化这些 Unity 经典问题全部过了一遍。最近我把中国象棋、围棋、五子棋等棋种整合进了同一个 Unity 工程整理成了一套可运行的棋盘游戏合集源码趁热把从设计到落地的完整思路写下来给想动手做棋类游戏、或者想研究棋类算法的朋友当一份参考地图。这个合集解决的核心痛点是很多新手写棋类项目都是每个棋种单独开工程UI 和输入逻辑重复写规则模块却耦合在一起改一个地方崩一片。我在这个项目里把规则引擎与表现层彻底分离共享框架、各自实现既能降低维护成本也方便后续扩展新棋种。无论你是刚学 Unity 想找个练手项目还是想深入理解 minimax 搜索、蒙特卡洛树搜索这类算法这套代码都值得拆开看看。1. 项目整体设计思路把三种棋装进一个工程1.1 为什么选择多棋种合一的框架很多人第一反应是中国象棋、围棋、五子棋玩法完全不同硬凑到一个工程里不是自找麻烦吗实际做下来我的体会恰恰相反棋类之间的差异集中在规则引擎层而工程框架层的需求高度一致——都需要启动流程、场景切换、UI 面板管理、音效播放、存档设置这些完全可以共用一套代码。设计的关键在于克制不要为了统一而强行抽象一套走法接口。五子棋是空格落子中国象棋是棋子沿规则移动围棋是区域死活判断这三者的底层建模差异太大强行抽象出统一接口反而会让每个棋种都写得很别扭。我的方案是只约定最小公共接口比如棋盘的初始化、是否是有效落点、当前轮到哪方、是否结束具体规则各自实现。这样既省了重复劳动又不牺牲各棋种的自由度。1.2 工程目录与模块划分目录结构决定了项目的可维护性我在这次整理中把代码按通用核心 单棋种 表现层 AI四个大块组织。核心层放所有棋种共用的东西比如 GameManager、场景状态机、UI 面板基类单棋种模块则完全独立互不引用。Assets/Scripts/ Core/ # 通用核心场景状态机、事件中心、存档服务 GameManager.cs SceneStateMachine.cs EventBus.cs Chess/ # 中国象棋 ChessBoardModel.cs ChessPiece.cs ChessRuleValidator.cs Go/ # 围棋 GoBoardModel.cs GoRuleManager.cs Gomoku/ # 五子棋 GomokuBoardModel.cs GomokuWinDetector.cs UI/ PanelBase.cs BoardInputController.cs AI/ MinimaxAI.cs GomokuEvaluator.cs GoMCTS.cs这样划分有个很直接的好处新增一个棋种时不需要改动已有棋种的任何代码。目录里每种棋都是一个完整的功能域规则逻辑都放在纯 C# 类中完全不挂 MonoBehaviour调试和测试都方便很多。1.3 规则引擎与表现层彻底解耦我一直强调棋类项目的规则引擎要写成纯 C# 类不依赖任何 Unity API。这样做的好处有三个第一可以直接跑单元测试把棋盘状态喂进去断言落子结果是否合法极大缩短调试时间第二以后如果要做联机对战这套逻辑可以平移成服务器端的判定模块第三渲染层只负责显示状态和接收输入逻辑层只负责计算状态两边的 bug 不容易互相污染。表现层的 BoardInputController 拿到玩家的点击坐标后只做一件事把坐标转换成逻辑落点调用规则引擎的 TryMove 或 PlaceStone 方法返回成功后再刷新棋盘显示。任何动画、音效、特效都不允许插在规则调用中间否则状态机和表现会越搅越乱。2. 核心规则模块拆解三种棋的规则引擎实现2.1 中国象棋规则格点建模、走法与特殊局面中国象棋的棋盘是 9 列 10 行的格点模型。我用Vector2Int表示坐标column 和 row 分别对应棋盘的列与行棋盘本身就是一个byte[10, 9]的二维数组0 表示空1 表示红方2 表示黑方。每一枚棋子的类型和归属则单独存在一个结构体数组里和棋盘数据分开管理。走法生成是整个引擎的核心我在基类中定义了一个统一入口ListMove GetLegalMoves(int row, int col)每个棋子类型覆盖这个方法来返回候选走法。以马为例它走日字八个方向都要判断是否蹩马腿比如向右上跳时需要检查右侧紧邻的位置是否被占被占则不能走。拿到候选走法后还要做一层全局过滤模拟走完这一步看己方的将帅是否处于被吃状态如果是则裁掉这个走法。这层过滤就是很多新手容易漏掉的将帅不能照面规则没有它双方将帅会在同一条竖线上隔空相对局面直接非法。对局流程上我把核心机制设计成一个循环模型一方走完 → 合法性校验 → 更新棋盘 → 检查将军、被将死或和棋 → 切换回合。这个模型无论做人机还是人人对战都通用。特别提醒一点长将长捉这类循环局面的自动判和很复杂参考源码里我用的是简单的步数 局面重复次数阈值判断够用但不追求极致如果想做专业级裁判逻辑还需要叠加 Zobrist 哈希做局面去重。2.2 围棋规则气的统计、提子与劫争围棋的规则模型比象棋更抽象。棋盘是 19×19 的交叉点落子不再是移动棋子而是在某个空点放置己方棋子然后根据气的规则进行提子和禁着点判断。气的定义是一块棋子连通区域相邻的空点总数。一旦某个连通块的气为 0这个连通块就要被提走也就是从棋盘上移除。我在实现中把提子和气的统计合并成了一个局部更新的过程每落一子在 (r, c)先检查周围四个相邻位置中对手棋子的连通块是否有气再检查己方连通块是否有气顺序有讲究——如果己方落子后形成己方无气但对手同时无气按围棋规则先提对方再提己方实现时要先扫描周围对方的连通块确认无气就提走然后再处理己方。这个顺序我曾经写反过结果遇到打吃反提的棋型直接出 bug。劫争是最让人头疼的规则之一完整实现需要记录上一手棋面并使用同型禁着判断。我在参考源码里做了简化只在规则管理器里记录上一手棋的位置和棋子信息若当前落子导致提子数恰好为 1且提掉的位置正好是对方上一手落子的位置判定为劫当前这一手不允许落在那个点。这个简化版本能处理 99% 的入门棋局专业级角度的无休劫等复杂规则不在此列但作为学习和演示足够。2.3 五子棋规则棋盘、落子与胜负判定五子棋是三款里最简单也最适合入门学习的一个。我用 15×15 的二维数组建模落子只有空位检查判定胜负时的核心是方向扫描。每次最后落子的位置为起点沿四个方向水平、垂直、两条对角线分别统计连续同色棋子数只要其中一组数量达到 5 就判定胜利。private readonly (int dr, int dc)[] directions { (1, 0), // 纵向 (0, 1), // 横向 (1, 1), // 右下对角线 (1, -1) // 左下对角线 }; public bool CheckWin(int row, int col, byte player) { foreach (var dir in directions) { int count 1; count CountContinuous(row, col, player, dir.dr, dir.dc); count CountContinuous(row, col, player, -dir.dr, -dir.dc); if (count 5) return true; } return false; } private int CountContinuous(int row, int col, byte player, int dr, int dc) { int count 0; int r row dr, c col dc; while (r 0 r 15 c 0 c 15 board[r, c] player) { count; r dr; c dc; } return count; }只需要扫描以最后落子为中心的四条线不需要全盘遍历落子越靠中心命中五连的效率越高。这种以最后一手为起点的思路也是其他棋类判定逻辑里最常用的优化方式。3. 交互与 UI 实现让棋局在屏幕上活起来3.1 逻辑坐标与屏幕坐标的映射棋类游戏的交互链路是玩家点击屏幕 → 得到屏幕坐标 → 转换为棋盘逻辑坐标 → 调用规则引擎。因为三种棋盘尺寸不同我抽了一个IBoardView接口内部提供ScreenToLogical(Vector2 pos)和LogicalToScreen(Vector2Int logicalPos)两个方法每种棋盘各写一套实现。有一个很关键的优化不要在 Update 里反复计算坐标映射。棋盘上的格点位置在初始化后是恒定不变的我在加载棋盘时就把所有逻辑坐标对应的屏幕坐标缓存到一个字典里点击检测时直接查字典配合反向查找省掉了大量重复计算。手机屏幕适配方面我用 Canvas Scaler 将参考分辨率设置为 1920×1080 的等比缩放棋盘基座和棋子的锚点都放在屏幕中心横竖屏切换时只需要重新计算一次缓存坐标即可。3.2 落子动画、提示与输入锁定动画反馈在棋类游戏中主要有两种移动类中国象棋的走子和放置类围棋、五子棋的落子。移动类动画我用协程配合简单的插值函数实现把棋子从起点平滑移动到终点300 毫秒左右的时长手感最自然放置类则给棋子加一个从放大到回弹的缩放入场效果视觉上更有啪嗒落地的感觉。实战中最容易踩的坑是动画期间的输入锁定。玩家在棋子移动动画没结束的时候连续点击会导致状态机出现当前棋子已被移动但棋盘数据还没更新的异常。我在 BoardInputController 里维护了一个isAnimating标志任何动画播放期间直接吞掉点击事件。还有一个细节音效也应该绑定在动画结束的回调里而不是点击瞬间播放否则快速操作时音效会严重早于实际落子体验非常差。3.3 菜单、悔棋、重开与状态流转UI 面板我用一个轻量级状态机来管理。整个游戏循环被拆分为 MainMenu、GamePlay、Settings、GameOver 四个状态每个状态对应一个面板状态切换时统一关闭旧面板、打开新面板。这样一来从主菜单进入中国象棋、围棋还是五子棋只是切换对局的模式参数底层框架完全不用改。悔棋功能是这次重构中比较满意的一块设计。我没有为每个棋种单独写 Undo 逻辑而是用命令模式统一记录操作每次落子或走一步生成一个 Command 压入栈中悔棋就是弹栈并调用 Undo 方法。中国象棋的 Command 需要记录起止坐标和被吃掉的棋子围棋需要记录提走的棋子集合五子棋最简单只需要记录清空位置。这样无论哪种棋多步悔棋、重开一局、甚至录制复盘数据都复用同一套命令栈逻辑。4. AI 与对战逻辑从无脑随机到有章法的搜索4.1 五子棋 AI评估函数与搜索深度五子棋 AI 是入门搜索算法的绝佳载体。我先写了一个简单的局面评估函数对棋盘上每个空点打分落在己方活四附近得分极高冲三、活三次之眠二活二较低再叠加一个中心倾向分鼓励 AI 抢占中央区域。这个评估函数配合固定深度的贪心搜索已经能打败大多数随手下的玩家。要做得更聪明就得上 minimax Alpha-Beta 剪枝。我在参考源码里提供了一份可调深度的实现深度设置为 4 时流畅度还不错评估函数越精确搜索深度越有效。一个提升剪枝效率的小技巧是走法排序先评估每个候选点的初始分数按分数从高到低排序后再进入递归搜索这样能显著提高剪枝率。注意控制搜索深度别贪19×15 的棋盘上全量搜索 6 层会明显卡顿我在实现里会把候选点裁剪到最近落子周围的若干格之内。4.2 中国象棋 AI走法排序让剪枝更高效中国象棋的 AI 复杂度明显高于五子棋。每个局面平均有几十种合法走法搜索树非常庞大如果不做剪枝优化3 层深度都跑不动。我的实现分三层走法生成、局面评估和 Alpha-Beta 搜索。走法生成依赖第二章的规则模块每个合法走法都会带着吃子、将军这类特征标记局面评估则从子力价值和位置价值两部分打分。子力价值我参考了传统的经验值车约 900、马约 400、炮约 400、兵卒随位置变化、士象约 200。位置价值用一张 10×9 的估值表实现比如兵过河后价值会明显上升马的位置在中心比在边角更有威胁。最关键的一步是走法排序在搜索前把吃子、将军等高价值走法排在前面Alpha-Beta 剪枝的效率可以提升好几倍。我实测同样的深度排序后的搜索时间只有排序前的五分之一左右。如果想更贴近实战还可以加上若干回合的无吃子强制变招等规则但这个版本作为参考源码已经够用。4.3 围棋 AI 的轻量实现方案围棋因为状态空间太大传统搜索算法在中大棋盘上几乎不可用。参考资料里我建议做 9 路围棋配合简化的蒙特卡洛模拟思路在某个候选点落子后快速让黑白双方随机落子直到终局统计该候选点对应的最终胜率。这个思路在面对入门玩家时已经有一定的棋力。实际实现的时候要注意模拟次数和局时的取舍。我用 9×9 棋盘、每手模拟约 300 次随机对局单步延时可以控制在 2 秒以内体验尚可。为了让随机模拟更贴近真实棋理我加了一个小改进模拟时优先落子在当前局面被打吃的点附近而不是全局完全随机步骤虽小棋力提升却很明显。19 路棋盘建议不要用这种纯随机的方案运算量太大只想学习的话可以用 9 路想商用级别则建议接入成熟的开源棋力引擎。5. 常见问题与优化实践5.1 坐标转换、边界与中文适配的坑先说坐标转换里最容易翻车的点中国象棋的棋盘是格点五子棋的棋盘也是交叉点但围棋的棋子在视图上对应的是格点交叉而非格子中心如果直接用 RectTransform 的 anchoredPosition 去计算经常会差半个棋子半径。我统一把棋子渲染的 pivot 设为棋盘交叉点对应的锚点所有逻辑坐标转换成屏幕坐标时的基准都按 pivo 来算省去了一大堆偏移调参。另一个坑是中文适配。棋类游戏面板上大量使用楚河汉界黑方胜玩家白棋这类中文文案在老版本 Unity TrueType 字体处理上偶尔会出现中文乱码或者字形缺失。我在项目里统一改用 Font Asset 方式管理字体并确保场景中的 Text 组件明确指定了支持中文的字体资源打包时勾选好简体中文语言实测下来 Android 和 PC 平台都很稳定。还有存档文件里的中文编码JSON 序列化统一用 UTF-8避免 Windows 记事本打开乱码。5.2 棋局存档、复盘与单元测试棋局存档我设计成了一种通用数据模型GameRecord包含棋种标识、创建时间戳、黑白/红蓝身份信息、完整的走子序列。走子序列用Liststring存储中国象棋每一步记录成类似e2-e4的起始-终点坐标字符串五子棋和围棋记录成row,col统一用MoveToString和StringToMove做转换。[System.Serializable] public class GameRecord { public string gameType; // chess, go, gomoku public long timestamp; public Liststring moveList; // 走子序列字符串化 public bool isPlayerFirst; }序列化直接用 JsonUtility 或 Newtonsoft.Json 都可以我推荐 Newtonsoft.Json对字典这类结构支持更好。存档路径我放在Application.persistentDataPath下用游戏类型加时间戳命名文件这样每个棋种都自动有了独立的存档目录。复盘功能在这个数据结构上就很简单了从头开始逐步回放 moveList每走一步刷一次棋盘。这个功能对调试规则引擎和 AI 特别有用我在写象棋规则时就是用复盘功能一步步对比真实棋谱发现了至少三个走法生成的边界 bug。5.3 性能优化与调优清单棋类游戏通常不重渲染性能瓶颈反而集中在规则引擎的高频调用。我的优化经验主要有三个第一走法生成时避免频繁 new 对象定义好 List 和数组后尽量复用减少 GC 压力第二围棋的气统计和提子采用局部更新而不是每次全棋盘遍历落子周围的 4 个相邻块是主要扫描区域全盘遍历放到 AI 评估时再做第三所有 AI 计算都放进协程或者异步线程中执行避免主线程卡顿协程里还可以做到每模拟若干局让出一次主线程保证界面流畅。另外强烈建议给规则引擎写单元测试不需要装额外测试框架Unity Test Framework 就够用。每个棋种都准备几组典型的棋局状态比如中国象棋的蹩马腿、围棋的打吃提子、五子棋的活四走法断言规则模块的输出是否符合预期。这样后续改 AI 或者修 bug 时心里会非常有底。6. 写在最后多棋种项目串联的那些心得这套源码最大的价值不在于某个单一棋种的实现有多惊艳而在于它提供了一个可以横向对比、纵向复用的框架。我在整理过程中最大的体会是棋类游戏之间的共性比表面上多得多——状态管理、回合流转、交互反馈、命令回滚这些模块一旦抽象到位新加一个棋种往往只需要补规则和评估函数框架几乎零改动。如果你打算自己动手写一套我的建议是先从五子棋开始它逻辑最简单半天就能出一个可玩版本打着舒服了再扩展中国象棋和围棋。每加一种棋都回头看看通用框架是否需要微调这个扩展—重构—再扩展的过程才是这类项目最有价值的修炼。最后再分享一个小技巧我习惯在每个棋种的规则引擎文件顶部写一份简单的棋规说明注释把走法、胜负条件、特殊规则都列清楚。这不仅是给自己留档也是给以后接手这个项目的同伴一份最直观的文档。代码会越改越复杂但规则文档一旦写明白了项目的可维护性会一直保持在高位。本文还有配套的精品资源点击获取
RELATED

相关推荐

Python中的Pythonic方式

Python中的Pythonic方式

一.起源《Python 之禅》由 Python 核心开发人员之一Tim Peters于 1999 年撰写,列出了 19 条陈述 Python设计哲学的格言。5 年后,它已成为开发人员的标准,以至于PEP 20(Python Enhancement Proposal 增强提案)将其纳入官方 Python 包&#xff…

📅 2026/9/8 21:18:47
C语言数组实现栈:从结构设计到动态扩容全解析

C语言数组实现栈:从结构设计到动态扩容全解析

我带人的时候特别喜欢问一个问题:用C语言、数组,实现一个栈,你打算怎么写?这个问题表面简单,实际上能看出很多基本功——结构体怎么设计、边界条件想不想得全、指针和值传递搞没搞明白、动态内存用得好不好。说实话&am…

📅 2026/9/8 21:18:47
WinForm界面美化三招:自绘控件、主题库与DPI适配实战

WinForm界面美化三招:自绘控件、主题库与DPI适配实战

WinForm的美化,可能是很多桌面端老兵的“心头病”——功能一切正常,可一旦截屏给别人看,年代感立刻拉满,像穿了身不太合身的旧西装。尤其当你把一个逻辑扎实的WinForm项目递给客户评审,哪怕后台设计再巧妙,…

📅 2026/9/8 21:18:46
MORE NEWS

更多资讯

📰

FreeCAD 参数化 3D 建模:免费上手,从草图到装配与仿真

FreeCAD 参数化 3D 建模:免费上手,从草图到装配与仿真 【免费下载链接】FreeCAD Official source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler. 项目地址: https://gitcode.com/GitHub_Trending/fr/FreeCAD Fre…

📰

Metabase 的 Clojure 代码风格:命名、Docstring、模块拆分与实用工具速查

Metabase 的 Clojure 代码风格:命名、Docstring、模块拆分与实用工具速查 【免费下载链接】metabase The easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart: 项目地址: https://gitcode…

📰

RPCS3 界面汉化手把手教学:3 个文件、1 处设置,全程不超过 3 分钟

RPCS3 界面汉化手把手教学:3 个文件、1 处设置,全程不超过 3 分钟 【免费下载链接】rpcs3 PlayStation 3 emulator and debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 刚装好 RPCS3,菜单、设置、日志清一色英文&a…

📰

C语言读写FreeFem++网格文件:从数据格式解析到有限元联调

简介:面向科学计算与数值模拟开发者,压缩包内提供了用C语言读取和写入FreeFem有限元软件网格文件(.msh格式)的完整实现,适合具有C语言基础、希望实现跨语言数据交互或自定义网格处理流程的工程师与研究者在实际项目中参…

📰

无人飞行器编队运动仿真与MATLAB实现:从控制律到避碰实践

简介:针对无人飞行器编队运动仿真任务,这套MATLAB代码包提供了从单机运动建模到编队协同控制的完整可运行脚本,面向无人机算法初学者、航迹规划研究者及机器人仿真爱好者,适合在MATLAB中直接运行和二次开发。包内共16个文件&#…

📰

数字人开发第七天:接入TTS实现语音交互与口型同步

如果这个周做到第六天,你的数字人应该已经有了完整的形象、动作和表情系统,但它大概率还是个"哑巴"——你说一句,它眨眨眼,能点头,就是张不开嘴。我自己的项目就是这样,直到 Day 7 把 TTS 接进去…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬