一个功能完整的五子棋Web应用,支持人机对战、AI对战、本地AI算法等多种游戏模式。
- PVP(玩家对战) - 本地双人对战
- PVAI(人机对战) - 与AI对手对战
- AIVAI(AI对战) - 观看两个AI互相对战
-
Minimax Bot (本地)
- 基于Minimax算法 + Alpha-Beta剪枝
- 固定搜索深度2层,响应速度快(< 1秒)
- 智能识别立即获胜和阻止机会
- 使用模式识别的评估函数(活四、冲四、活三等)
- 适合快速对局和入门玩家
-
MCTS Bot (本地)
- 基于蒙特卡洛树搜索(Monte Carlo Tree Search)
- 使用UCT(Upper Confidence Bound for Trees)选择策略
- 固定思考时间5秒,自适应搜索深度
- 通过随机模拟评估局面
- 适合寻求挑战的玩家
- Qwen Thinking - 支持推理过程展示
- Qwen Instruct - 快速指令模式
- DeepSeek - 深度思考模式
- Kimi - 另一个云端AI选择
- 棋盘交互 - 15x15标准五子棋棋盘,点击落子
- 悔棋功能 - 支持撤销上一步操作
- 游戏历史 - 自动保存对局记录,支持回放
- 胜负判定 - 自动检测五连珠并展示获胜者
- 设置管理 - AI模型选择、API Token配置
- 数据持久化 - 使用IndexedDB本地存储游戏记录和配置
- React 18 - UI框架
- TypeScript - 类型安全
- Vite - 构建工具
- Emotion - CSS-in-JS样式方案
- Framer Motion - 动画效果
- Zustand - 轻量级全局状态管理
- React Hooks - 组件级状态管理
- Dexie.js - IndexedDB封装库,用于游戏历史存储
- localStorage - 用户设置和配置存储
- Minimax算法 - 经典博弈树搜索(
src/core/ai/providers/SearchBotProvider.ts) - Alpha-Beta剪枝 - 优化搜索效率
- MCTS算法 - 蒙特卡洛树搜索(
src/core/ai/providers/MCTSBotProvider.ts) - UCT选择策略 - 平衡探索与利用
- 模式评估 - 五连、活四、冲四、活三等棋型识别
- Axios - HTTP客户端,用于云端AI调用
- Vitest - 单元测试框架
- Playwright - E2E测试(配置)
gomoku-ai/
├── src/
│ ├── core/ # 核心业务逻辑
│ │ ├── ai/ # AI相关
│ │ │ ├── providers/ # AI提供者实现
│ │ │ │ ├── SearchBotProvider.ts # Minimax算法
│ │ │ │ ├── MCTSBotProvider.ts # MCTS算法
│ │ │ │ ├── MockAIProvider.ts # Mock AI
│ │ │ │ └── venus/ # 云端AI适配器
│ │ │ ├── AIManager.ts # AI管理器
│ │ │ ├── AIProvider.ts # AI提供者接口
│ │ │ └── types.ts # AI类型定义
│ │ ├── game/ # 游戏逻辑
│ │ │ ├── Player.ts # 玩家类
│ │ │ ├── WinDetector.ts # 胜负判定
│ │ │ └── types.ts # 游戏类型定义
│ │ └── storage/ # 数据持久化
│ │ ├── ConfigStore.ts # 配置存储
│ │ ├── GameDatabase.ts # 游戏数据库
│ │ └── types.ts # 存储类型定义
│ ├── ui/ # UI组件
│ │ ├── components/
│ │ │ ├── Board/ # 棋盘组件
│ │ │ ├── GameControls/ # 游戏控制
│ │ │ ├── History/ # 历史记录
│ │ │ ├── Settings/ # 设置面板
│ │ │ └── Common/ # 通用组件
│ │ ├── pages/
│ │ │ └── GamePage.tsx # 游戏主页面
│ │ ├── stores/
│ │ │ └── gameStore.ts # 游戏状态管理
│ │ └── styles/
│ │ └── theme.ts # 主题配置
│ ├── utils/ # 工具函数
│ ├── App.tsx # 应用根组件
│ └── main.tsx # 应用入口
├── tests/ # 测试文件
│ └── unit/
│ └── SearchBotProvider.test.ts
├── openspec/ # OpenSpec规范文档
│ ├── specs/ # 规范定义
│ └── changes/ # 变更记录
├── index.html # HTML入口
├── package.json # 项目配置
├── tsconfig.json # TypeScript配置
└── vite.config.ts # Vite配置
- Node.js >= 18
- npm >= 9
npm installnpm run dev访问 http://localhost:5173 查看应用。
npm run build构建产物位于 dist/ 目录。
npm run preview# ESLint检查
npm run lint
# TypeScript类型检查
npm run type-check
# 代码格式化
npm run format# 运行单元测试
npm test
# 运行测试UI界面
npm run test:ui
# 运行E2E测试
npm run test:e2e- 选择游戏模式(PVP/PVAI/AIVAI)
- 如果选择AI模式,在设置中选择AI对手
- 点击"开始游戏"按钮
- 在棋盘上点击落子
本地AI(Minimax Bot和MCTS Bot)无需任何配置,直接选择即可使用:
- 点击"设置"按钮
- 在"AI模型选择"中选择"Minimax Bot (本地)"或"MCTS Bot (本地)"
- 开始游戏
云端AI需要配置API Token:
- 点击"设置"按钮
- 在"Venus API配置"中输入你的API Token
- 在"AI模型选择"中选择云端AI(Qwen、DeepSeek等)
- 开始游戏
- 点击"历史记录"按钮
- 选择要查看的对局
- 使用回放控制查看棋谱
算法原理:
- 使用Minimax算法递归搜索博弈树
- Alpha-Beta剪枝减少搜索节点(效率提升50%+)
- 固定搜索深度2层(每方向前看1步)
- 移动排序优化剪枝效率
优化特性:
- 立即获胜检测 - 搜索前先检查是否有一步获胜的棋
- 立即阻止检测 - 检查对手是否有一步获胜的威胁
- 模式评估 - 识别活四(10000分)、冲四(5000分)、活三(1000分)等棋型
- 防守权重 - 对手威胁权重 × 1.1,鼓励防守
性能指标:
- 响应时间:< 1秒
- 搜索节点数:通常 < 1000节点
- 适合场景:快速对局、学习五子棋基本战术
算法原理:
- 蒙特卡洛树搜索(Monte Carlo Tree Search)
- UCT选择策略(Upper Confidence Bound for Trees)
- 时间限制:5秒思考时间
- 随机模拟(Random Playout)评估局面
算法流程:
- 选择(Selection) - 使用UCT公式选择最优子节点
- 扩展(Expansion) - 到达叶节点后扩展所有合法着法
- 模拟(Simulation) - 随机走棋直到游戏结束
- 回溯(Backpropagation) - 将结果反向传播更新节点统计
UCT公式:
UCT = win_rate + C × √(ln(parent_visits) / node_visits)
C = √2(探索常数)win_rate- 胜率(利用项)- 后项 - 探索奖励(探索项)
性能指标:
- 响应时间:~5秒
- 模拟次数:通常数千到数万次模拟
- 适合场景:追求更强棋力的玩家
云端AI使用Venus API,需要配置Token:
// 在设置面板中输入,或通过localStorage设置
localStorage.setItem('venus_api_token', 'your-token-here');支持的AI模型ID:
'mock'- Mock AI(测试用)'search-bot'- Minimax Bot'mcts-bot'- MCTS Bot'qwen-thinking'- Qwen推理模式'qwen-instruct'- Qwen指令模式'deepseek'- DeepSeek'kimi'- Kimi
本项目使用OpenSpec进行需求管理和变更追踪:
- 规范文档 -
openspec/specs/ - 变更记录 -
openspec/changes/archive/ - 已归档变更:
2025-12-17-add-search-bot- 添加Minimax搜索Bot2025-12-17-update-bots-add-mcts- 移除难度选择,添加MCTS Bot
查看规范:
openspec list --specs
openspec show ai-providers欢迎提交Issue和Pull Request!
- Fork本项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交代码 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交Pull Request
- 使用TypeScript,保持类型安全
- 遵循ESLint规则
- 使用Prettier格式化代码
- 编写单元测试覆盖核心逻辑
MIT License
Radian
新增功能:
- 完整的五子棋游戏逻辑
- PVP、PVAI、AIVAI三种游戏模式
- Minimax Bot(本地AI)
- MCTS Bot(本地AI)
- 云端AI集成(Venus API)
- 游戏历史记录和回放
- 悔棋功能
- 设置管理
优化:
- Minimax Bot添加立即获胜/阻止检测
- 固定Minimax搜索深度为2层(性能优化)
- MCTS使用5秒固定思考时间
- 纯TypeScript实现的AI算法 - Minimax和MCTS完全本地运行,无需服务器
- 优秀的性能 - Alpha-Beta剪枝和移动排序优化搜索效率
- 模块化架构 - AIProvider接口支持轻松扩展新AI算法
- 完整的类型系统 - TypeScript严格模式,类型安全
- 现代化UI - Emotion CSS-in-JS + Framer Motion动画
- 数据持久化 - IndexedDB + localStorage实现完整数据存储
- OpenSpec规范管理 - 使用OpenSpec进行需求和变更管理
Q: Minimax Bot为什么只搜索2层?
A: 测试发现更深的搜索(depth 4, 6)会导致频繁超时。depth 2在性能和棋力间取得良好平衡,响应时间 < 1秒。
Q: MCTS Bot和Minimax Bot哪个更强?
A: MCTS Bot通常更强,因为它有更多思考时间(5秒 vs < 1秒),能探索更深的变化。但Minimax Bot响应更快,适合快速对局。
Q: 如何添加新的AI算法?
A: 实现AIProvider接口,然后在AIManager中注册即可:
// 1. 实现AIProvider接口
export class MyBotProvider implements AIProvider {
readonly id: AIModelId = 'my-bot';
readonly displayName = 'My Bot';
async generateMove(request: AIRequest): Promise<AIResponse> {
// 你的算法实现
}
// ... 其他方法
}
// 2. 在AIManager中注册
this.registerProvider(new MyBotProvider());Q: 游戏历史保存在哪里?
A: 使用IndexedDB存储在浏览器本地,数据库名为gomoku-db。清除浏览器数据会删除历史记录。
Q: 支持移动端吗?
A: UI使用响应式设计,支持移动端浏览器访问,但体验在桌面端更佳。
如有问题或建议,请提交Issue或联系作者。