五子棋项目开发之旅:从需求沟通到开源发布
作为一个编程爱好者,我近期完成了一个有趣的项目 —— 帮助一位同学开发一个能够接入 Gomoku 棋盘的五子棋工具。该同学希望在已有的五子棋代码基础上,引入更强大的 AI 引擎,以提升其性能表现。现在我决定将项目中能够调用弈心引擎下本地五子棋和连接 Gomoku 自动下五子棋的部分开源,并通过这篇博客详细介绍整个开发过程。
项目的开源地址为:https://github.com/shandianchengzi/YiXin-Wuziqi-API,欢迎各位感兴趣的朋友访问和下载项目代码。
创作声明:以下内容通过导出微信聊天记录和一定的调整,由Kimi直接生成,方便快捷准确。
文章目录
一、项目背景与需求沟通
Gomoku 棋盘背景介绍
Gomoku 棋盘是五子棋游戏的核心阵地,其历史源远流长,最早可追溯至古代中国。它当时在民间广泛流行,并在南北朝时期传入高丽(今朝鲜),后又传至日本。在日本,五子棋最初主要在宫廷贵族间流行,直至元禄末期才逐渐在民间盛行。1899 年,日本通过公开征名,将 “连珠” 这一名称正式确定下来,取意于《汉书・律历志上》中 “日月如合璧,五星如连珠”,而 “Gomoku” 这一名称则是取自日语中 “五”(go)和 “目”(moku,意为点或位置)的组合。
20 世纪初,五子棋及连珠从日本传入欧洲,被译为 “Five In A Row”(缩写为 FIR),同时根据日语的罗马拼音,又被称为 “Gomoku” 或 “Gobang”。“Gomoku” 在欧洲得到了进一步的推广和发展,一些国家引入了 “交换” 等规则,逐渐形成了系列新规则,中欧部分国家还成立了 Gomoku 组织,并与六子棋共同组建了国际联盟(GCIF)。21 世纪初,世界连珠(renju)锦标赛举办时,也同时举办世界 Gomoku 锦标赛(GT)及六子棋国际公开赛(CT)。
Gomoku 棋盘通常为 15×15 或 19×19 的方格,玩家在横纵交错的线上落子,目标是率先形成横、竖或斜方向的连续五个己方棋子以获胜。其棋具与围棋相同,纵横各十七道。在古代,五子棋的玩法最初在宫廷和贵族大家庭中流行,后来逐渐流传到民间。如今,Gomoku 棋盘作为五子棋游戏的重要载体,已成为一项世界性的智力运动,受到众多国家和地区玩家的喜爱。
需求沟通
同学希望开发一个能接入 Gomoku 棋盘的五子棋工具,他已有相关代码,但胜率不高。他想引入更强大的 AI 引擎提升性能。我分析其代码后发现,其提供的基础五子棋算法效果不理想,且其参考的 Gomoku - AI 仓库(https://github.com/Kali-Hac/Gomoku-AI)年久失修,最后一次更新是在七年前,使用的是较为基础的博弈树 Min - Max + alpha - Beta 剪枝方法,虽有基础的棋局评估和选择模型,但未应用先进强化学习算法,性能欠佳,无法满足需求。所以我决定引入更强大的弈心 AI。
二、开发过程
(一)环境搭建与代码初步分析
要求环境:Windows,Python 3.6以上。
我搭建开发环境,分析代码,发现其虽实现基本规则但算法不足。Gomoku - AI 仓库的算法复杂度有限,需深度融合。我尝试后发现其胜率不够,仅 60% 左右,于是决定引入更强大的弈心 AI。
(二)引入弈心 AI:技术转型的关键决策
深入研究后,我发现 Gomoku - AI 仓库在现代复杂规则下的表现并不理想,胜率有限。相比之下,弈心 AI 凭借其卓越的棋力和在国际赛事中的出色表现脱颖而出。弈心不仅多次荣获 Gomocup 冠军,还在 2017 年成为首个在公开比赛中战胜人类顶尖棋手的人工智能程序。其独特的偏向战略的棋风和强大的全局优势积累能力,使其在五子棋 AI 领域处于领先地位。查阅资料发现,弈心在 Elo 等级分上领先第二名 400 分,优势明显。我意识到,若要实现高性能的五子棋 AI,必须进行技术转型,放弃 Gomoku - AI 仓库,转而采用弈心 AI。
(三)接入弈心引擎
我开始接入弈心引擎,面临诸多挑战:
- 通信协议适配 :原代码(指官方提供的古老的界面代码或者其他人自行开发的一些调用弈心的代码)与弈心引擎的通信协议不一致,需适配。我研究弈心自定义通信协议,修改原代码,确保两者能有效通信。
- 数据格式转换 :数据格式有差异,需转换。我编写函数,将原代码数据格式转换为弈心可识别的格式。
(四)问题排查与修复
在接入引擎后,我进行了代码的测试,发现并修复了一些问题:
- 棋盘坐标系问题 :融合代码后,出现棋盘坐标系的错误,导致落子位置混乱。我重新核对了棋盘的坐标定义,修正了相关代码,确保了落子位置的准确性。
- 兼容性问题 :由于弈心引擎和原代码的编写环境存在差异,在部分 Python 版本和库版本下会出现兼容性问题。我对代码进行了兼容性优化,确保其能够在不同环境下稳定运行。
(五)项目优化与完善
为了提供更好的用户体验,我对项目进行了进一步的优化:
- 用户界面改进 :我优化了游戏的界面布局和交互方式,使其更加简洁直观,易于操作。
- 性能优化 :通过代码的优化和算法的调整,提高了游戏的运行速度和响应能力,减少了卡顿现象。
三、开源代码功能介绍
本次开源的代码实现了调用弈心引擎进行五子棋对战的核心功能,具体如下:
(一)远程调用弈心引擎
代码通过 subprocess 模块启动弈心的可执行文件(Yixin2018.exe),实现了与弈心引擎的通信。能够向弈心引擎发送指令,如设置棋盘大小、更新棋局状态等,并获取弈心引擎返回的落子位置。
Yixin2018.exe下载链接:http://gomocup.org/static/download-ai/YIXIN18.zip
(二)支持网页版接口和本地运行
代码具有灵活的运行方式,既可以作为本地程序运行,支持通过命令行与弈心引擎进行五子棋对战;也可以与网页版接口结合,实现通过网页进行远程对战。这使得用户可以根据自己的需求选择不同的使用场景,方便地与弈心引擎进行对战。
(三)命令行交互与棋局状态展示
在本地运行时,代码提供了命令行交互界面,用户可以通过输入落子位置(如 “7,7”)与弈心引擎进行对战。同时,代码还实现了棋局状态的展示功能,能够在命令行中实时显示棋盘的状态,方便用户了解当前的对战情况。
(四)棋局状态检查与胜负判断
代码包含了对棋局状态的检查和胜负判断功能。在每一步落子后,都会检查当前棋局是否达到胜利条件,并输出相应的胜负结果。这有助于用户及时了解游戏的进展和结果。
四、遇到的问题及解决方法
(一)代码融合难题
在将弈心引擎接入原代码时,由于两者代码结构和数据格式的差异,导致代码无法正常融合。为了解决这个问题,我采用了以下方法:
- 代码结构适配 :深入分析两个代码的结构,找出可以融合的关键点,对原代码进行了适当的重构,使其能够与弈心引擎的代码结构相匹配。
- 数据格式转换 :编写了专门的数据转换函数,将原代码中的数据格式转换为弈心引擎能够识别和处理的格式,确保数据在两者之间的顺利传递和使用。
(二)棋盘坐标系错误
在融合代码后,出现棋盘坐标系的错误,导致落子位置混乱。为了解决这个问题,我采取了以下措施:
- 重新核对坐标定义 :仔细核对了原代码和弈心引擎中棋盘坐标的定义方式,找出差异所在。
- 修正代码逻辑 :根据重新核对的坐标定义,修正了代码中与棋盘坐标相关的逻辑,确保落子位置的准确性。
(三)兼容性问题
项目在不同环境下出现兼容性问题,影响了其稳定性和可用性。为了解决这个问题,我进行了以下工作:
- 环境测试 :在多个不同的 Python 版本和库版本环境下对项目进行测试,找出兼容性问题的根源。
- 代码优化 :对项目代码进行了兼容性优化,包括调整代码的写法、使用兼容性更好的库函数等,使其能够在不同环境下稳定运行。
五、项目成果与开源发布
经过一段时间的开发和优化,我成功地完成了这个五子棋项目,并且达到了预期的目标。现在,我决定将项目中能够调用弈心引擎的部分开源发布,希望能够与更多的编程爱好者分享这个有趣的项目,促进技术交流和共同进步。
项目的开源地址为:https://github.com/shandianchengzi/YiXin-Wuziqi-API,欢迎各位感兴趣的朋友访问和下载项目代码。
终端运行示意:
六、参考链接
在项目开发过程中,我参考了许多有价值的资源,包括:
- 上述提到的 Gomoku - AI 仓库:虽然其性能欠佳,但为项目的初期接入 Gomoku棋盘提供了一些接口设计上的参考 https://github.com/Kali-Hac/Gomoku-AI。
- 弈心官网:https://www.aiexp.info/pages/yixin-cn.html,通过分析过去五子棋程序的弱点并提出与之对应的解决策略,五子棋程序弈心被设计出来。弈心成为多届 Gomocup 冠军,并在 2017 年成为首个在公开比赛中战胜人类顶尖棋手的人工智能程序。
- 一些相关的技术代码及接口代码:弈心的界面程序 ,在解决问题和优化代码的过程中给予了我许多启示和帮助。
通过这个五子棋项目的开发,我不仅提升了自己的编程能力和问题解决能力,还收获了与他人的合作经验。希望这篇博客能够让大家对这个项目有一个全面的了解,也期待与各位在开源社区中共同学习和成长。
如果你对这个项目感兴趣,或者有任何问题和建议,欢迎随时通过 Github Issue 与我交流!
本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/147818197。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。