基于 Vue 3 + Express + Socket.IO 的局域网联机五子棋游戏,支持人机对战和双人在线对战。
- 🔗 局域网联机 — 创建房间,通过 6 位房间码邀请好友加入对战
- 🤖 人机对战 — 三种 AI 难度(简单 / 中等 / 困难),基于 Minimax + α-β 剪枝算法
- 💬 实时聊天 — 对战中发送文字消息互动
- ↩️ 悔棋机制 — 联机模式需对方同意,自动撤销两步使回合回到请求方
- 🔄 重新开始 — 支持再来一局,自动交换先后手
- 📡 状态同步 — 页面刷新后自动同步服务端状态,防止事件丢失
- 🔌 断线处理 — 玩家断开连接后自动清理房间并通知对手
| 层级 | 技术 |
|---|---|
| 前端框架 | Vue 3 (Composition API + <script setup>) |
| 状态管理 | Pinia |
| 路由 | Vue Router 4 |
| 构建工具 | Vite 5 |
| 实时通信 | Socket.IO 4 |
| 后端框架 | Express 4 |
| AI 算法 | Minimax + α-β 剪枝,棋型评估 |
| 并发工具 | concurrently |
Gomoku/
├── client/ # 前端项目
│ └── src/
│ ├── views/ # 页面组件
│ │ ├── HomeView.vue # 首页(创建/加入房间)
│ │ ├── RoomView.vue # 等待房间
│ │ ├── GameView.vue # 游戏主页面
│ │ └── JoinView.vue # 加入房间(路由直达)
│ ├── components/ # 游戏组件
│ │ ├── Board.vue # 15×15 棋盘
│ │ ├── Stone.vue # 棋子组件
│ │ ├── GameInfo.vue # 玩家信息面板
│ │ ├── ChatPanel.vue # 聊天面板
│ │ ├── ResultModal.vue # 胜负弹窗
│ │ └── UndoDialog.vue # 悔棋弹窗
│ ├── stores/ # Pinia 状态管理
│ │ ├── game.js # 游戏状态
│ │ ├── room.js # 房间状态
│ │ └── chat.js # 聊天消息
│ ├── ai/ # AI 算法
│ │ ├── search.js # Minimax + α-β 剪枝
│ │ └── evaluate.js # 棋型评估函数
│ ├── game/ # 游戏核心
│ │ ├── board.js # 棋盘操作
│ │ ├── winCheck.js # 胜负判定
│ │ └── constants.js # 常量定义
│ ├── socket.js # Socket.IO 客户端封装
│ ├── router.js # 路由配置
│ ├── App.vue
│ └── main.js
├── server/ # 后端项目
│ ├── index.js # 服务入口(房间管理、事件处理)
│ ├── game-logic.js # 纯函数游戏逻辑(供测试复用)
│ └── tests/
│ └── game.test.js # 游戏逻辑测试
├── package.json # 根配置(启动脚本)
└── CLAUDE.md # Claude Code 项目指引
- Node.js >= 18
# 1. 安装所有依赖
npm run install:all
# 2. 同时启动前后端开发服务器
npm run dev
# 或者分别启动
npm run dev:server # 后端 → http://localhost:3000
npm run dev:client # 前端 → http://localhost:5173启动后在浏览器中打开 http://localhost:5173,即可开始游戏。
💡 前端开发服务器监听
0.0.0.0,局域网内其他设备可通过本机 IP 地址访问。
node server/tests/game.test.js- 在首页点击「创建房间」
- 选择一个模式(人机对战 或 双人对战)
- 人机对战可选择 AI 难度(简单 / 中等 / 困难)
- 将 6 位房间码发送给好友
- 在首页输入 6 位房间码,点击「加入房间」
- 或直接访问加入链接:
http://localhost:5173/join/<房间码> - 双方进入房间后游戏自动开始
- 黑方先行,双方轮流落子
- 先在横、竖、斜任一方向连成 五子 者获胜
- 棋盘满子且无人获胜则为 平局
| 操作 | 说明 |
|---|---|
| 点击棋盘空格 | 落子 |
| 悔棋按钮 | 向对手发送悔棋请求 |
| 聊天输入框 | 发送文字消息 |
| 重新开始 | 请求再来一局 |
| 难度 | 算法 | 搜索深度 |
|---|---|---|
| 简单 | 贪心选点 | 1 |
| 中等 | Minimax + α-β 剪枝 | 2 |
| 困难 | Minimax + α-β 剪枝 | 4 |
AI 采用棋型评估函数,从四个方向(水平、垂直、两条对角线)分析连子数和开放端数,对活四、冲四、活三、眠三、活二等棋型进行加权评分。同时通过候选点剪枝(仅考虑已有棋子周围 2 格的空位)大幅减少搜索空间。
房间码为 6 位大写字母与数字组合,排除了易混淆字符:
- ❌
0(数字零) — 与 O 混淆 - ❌
O(大写字母 O) — 与 0 混淆 - ❌
1(数字一) — 与 I/L 混淆 - ❌
I(大写字母 I) — 与 1/L 混淆 - ❌
L(大写字母 L) — 与 1/I 混淆
MIT