记录我在学习 Go 的同时,使用 AI 开发的一款 AI 围棋对弈游戏网站。



项目地址:AI围棋
围棋组件库
开发页面前,我想到可以先把围棋核心规则与交互组件抽成一个独立仓库单独维护,方便后续迭代修改。
项目初始化搭建
这里使用开源的 Vue 项目脚手架 create-nxy 完成项目初始化。

初始化后,运行 pnpm i -r 安装依赖,便可以开始开发了。
编写 AGENT 文件
先准备好 AGENT 文件,让它成为后续内容开发时良好的代码规范。这里使用一个 grill-me skill,以便更好地生成符合预期的内容。
[$grill-me] 在当前下生成AGENTS.md文件,用于项目的开发指南。
组件开发
编写好提示词后,需要预先设计围棋棋盘交互时产生的数据结构:使用 1、0、-1 表示棋盘内容;同时引入围棋开源仓库 SabakiHQ/go-board,其中包含打吃等围棋规则;再补充一些项目开发所需的功能,如“停一手”“手动落子”等。
[$prompt-enhancer][$grill-me] [components](packages/components/) 在该文件下开发有关围棋的组件:
- 组件包含棋子、棋盘
- 棋盘可自定义大小
- 棋盘、棋子的UI大小可根据棋盘宽高自适应
- 棋盘可使用鼠标点击空位后黑白轮流下棋,鼠标移入时对应空位有虚拟棋子用于提示用户棋子将添加的位置
- 可通过传入init参数初始化棋盘,结构如:{layout/grid/..:[[ 0, 1, 0],[ -1, -1, 1],[0, 0, 1]], next: 1},1代表黑棋,-1代表白棋,0代码空位,next代表下一手棋子(默认黑),也可以使用棋盘暴露的函数进行重置棋盘
- 棋盘每次更新后都触发事件,事件参数包含当前棋盘布局数组,下一手棋的颜色
- 鼠标点击下棋后也会触发事件,事件参数包含当前棋盘布局数组,下一手棋的颜色,下棋的位置,位置使用如A1、F4这类代表,字母带表列位置、数字代表行位置
- 可通过棋盘暴露的函数,手动下一棋,参数为棋子位置,如F1,不传或为空时表停一手,函数返回是否生效(停一手也为true)
- 围棋的计算逻辑使用开源仓库:[SabakiHQ/go-board](https://github.com/SabakiHQ/go-board)
- 仅先完成基础的下棋功能即可
代码生成后,便可以尝试查看效果。

此时围棋棋盘界面组件基本可以正常使用,能够正常落子,但 UI 上仍有缺陷,只需再让 AI 修改修正即可。
当然,还可以继续开发历史记录控制等相关功能,最后让开发好的功能组件在 playground 中编写完整示例,生成组件展示页面。

Go后端服务
后端服务使用 Go + GORM + Gin + MySQL 进行项目搭建。数据库创建这里不再赘述,直接进入项目的 AI 开发流程。
基础项目搭建
[$prompt-enhancer][$grill-me] 从资深的GO后端开发者角度思考,从零设计并开发一个后端服务项目:
- 在项目中建立清晰的后端架构,项目使用gin+gorm框架进行设计开发;
- 文件结构按照互联网公司流行的最佳结构方式进行设计,需要注意代码配置信息的安全;
- 项目暂不涉及具体业务功能,仅需提供基本的用户注册登录验证功能;
- 用户当前仅提供两种身份,有管理权限的用户与无管理权限的用户;
- 登录密码需要采用非对称加密进行验证登录,验权使用JWT进行校验;
- 需提供初始化数据库数据的sql,用于创建第一个管理员;
- 最后编写 AGENTS.md’文件,用于说明项目整体介绍、目录结构、代码规范、复用规范、开发注意事项
这里同样使用 grill-me 协助,确保项目代码生成过程不偏离方向,避免生成后还需要大规模重构;prompt-enhancer 只是用于强化提示词,可用可不用。

生成后的项目仅包含简单的注册登录功能。在验证接口可以正常使用后,便可以开发围棋游戏的相关功能了。
AI模型管理页面
我希望用户可以自行配置想要的 AI,因此需要先开发 AI 页面管理功能所需的接口。

AI对弈功能
再根据前面围棋组件库开发时使用的数据结构,开发 AI 对弈的核心接口。
[$prompt-enhancer][$grill-me] 在当前项目下接入ai围棋对弈功能接口:
- 支持用户自行选择激活的AI模型,包括默认模型;
- 支持配置一些特殊功能,如是否支持AI在申请数子结束游戏;
- 用户仅通过接口传入特定的当前棋局结构体,通过调用AI分析后得出相应的下一步棋位置或申请结束;
- 传入结构体结构如下:
/\*\* 棋盘上的棋子标记:1 表示黑子,-1 表示白子,0 表示空位。 */*\
*export type GoSign = -1 | 0 | 1;*\
*/*\* 围棋棋盘的二维布局数据。 */*\
*export type GoLayout = GoSign[][];*\
*/*\* 围棋棋盘的坐标。 */*\
*export type GoVertex = [number, number];*\
*/*\* 可落子的棋子标记,不包含空位标记 0。 \*/\*
export type PlayerSign = Exclude\<GoSign, 0>;
/\*\* 劫子信息 */*\
*export interface KoInfo {*\
*/*\* 劫子发生的棋子标记。 */*\
*sign: GoSign*\
*/*\* 劫子发生时的顶点。 \*/\*
vertex: GoVertex\
}
/\*\* 规则引擎输出的完整对局快照。 */*\
*export interface GoGameSnapshot {*\
*/*\* 棋盘尺寸。 */*\
*size: number | string*\
*/*\* 棋盘布局。 */*\
*layout: GoLayout*\
*/*\* 执棋方。 */*\
*player: PlayerSign*\
*/*\* 劫子信息。 */*\
*ko?: KoInfo*\
*/*\* 最新一手棋子的棋盘坐标。 */*\
latestVertex?: GoVertex\
}
接口文档
接口文档会成为后续网站开发时 AI 读取接口内容并进行页面开发的核心来源,因此这里也需要让它使用 OpenAI 文档生成,确保接口文档内容清晰。

Web游戏页面
服务端开发完毕并成功运行后,便可以开发游戏页面了。
项目初始化搭建
这里同样可以使用 create-nxy 直接初始化项目;在选择库类型时不选择即可,之后将代码写入项目中的 playground 下。

页面生成
直接让 AI 读取接口文档,进行页面创建。

之后运行项目并测试页面内容,项目基础内容便搭建成功了。
结语
这个项目也算是我学习 Go 开发的入门项目。以上内容也只是开发过程中项目搭建的基本流程,更多工作还包括功能迭代、代码优化、部署等,这些都需要经过数十次甚至上百次与 AI 对话、修改和开发才能完成。后续也将继续围绕对弈体验、功能迭代、代码优化、部署流程与文档完善进行打磨,并在持续学习 Go 的过程中,把更多开发记录、实践经验与踩坑总结整理分享出来。
