WorkBuddy × CloudBase 实战:从零构建中国象棋双人对战应用
一篇真正"跑通了"的教程,记录了我们用 WorkBuddy + CloudBase 从零搭建一个完整应用的全过程 —— 包括那些踩过的坑和总结的规则。
一、背景
我们做了什么?
用 WorkBuddy 配合 CloudBase(腾讯云开发),半小时内从零搭建了一个中国象棋双人对战 Web 应用,包含:
- 手机号验证码登录
- 房间创建/加入/分享
- 完整象棋规则引擎
- 实时对局同步 (NoSQL watch)
- 部署到独立子域名
技术栈
| 层 | 选型 |
|---|---|
| 前端 | Vite + React + TypeScript |
| 认证 | CloudBase 手机号验证码登录 |
| 数据库 | CloudBase NoSQL 文档数据库 |
| 部署 | CloudBase manageApps → 独立子域名 |
| AI 工具链 | WorkBuddy + CloudBase(28 个工具) |
二、基建:启用 CloudBase
在 WorkBuddy 对话中输入 /cloudbase 选择 CloudBase Skill,或在对话界面点击左下角 连应用 按钮启用 CloudBase 连接器(参阅配置指南)。
启用后,WorkBuddy 会自动完成以下流程:
- 通过
auth工具完成设备码登录 - 绑定目标环境
- 环境中后续所有操作通过 CloudBase 工具执行
三、应用架构
3.1 数据模型
rooms 集合(NoSQL)
├── roomId // 6 位房间码(大写字母+数字)
├── creatorId // 创建者 uid
├── player1Id // 红方 uid
├── player2Id // 黑方 uid(加入后填充)
├── status // waiting → playing → finished
├── boardState // 序列化棋盘
├── currentTurn // red | black
└── winner // red | black | null
棋盘序列化格式:
RK-AK-EK-HK-CK-AK-EK-HK-RK|--|--B--P-B--|S--S--S--S--S|...
每格 2 字符:RK=红帅, BK=黑将, RA=红仕, B--=空位。
3.2 组件结构
App
├── LoginPage → 手机号输入 → 验证码 → 登录
├── HomePage → 创建房间 / 加入房间
└── GamePage
├── PlayerInfo → 红方/黑方身份标识
├── ChessBoard → SVG 网格 + CSS 棋子
└── ShareBtn → 分享房间给好友
3.3 对局同步机制
关键:不用 WebSocket,直接利用 CloudBase NoSQL 的 watch() API 做实时同步。
Player A 走棋:
1. 本地 GameEngine.makeMove()
2. updateGameState() → 写入数据库
Player B 同步:
1. watchRoom() 收到 snapshot
2. boardState 变化 → deserializeBoard()
3. engine.loadState() → UI 更新
四、象棋引擎核心
4.1 棋盘坐标系
列 0 1 2 3 4 5 6 7 8
+------------------------------+
| 车 马 象 士 将 士 象 马 车 | row 0 (黑方底线)
| |
| 炮 炮 | row 2
| 卒 卒 卒 卒 卒 | row 3
|------------------------------| ← 楚河汉界
| 兵 兵 兵 兵 兵 | row 6
| 炮 炮 | row 7
| |
| 车 马 相 仕 帅 仕 相 马 车 | row 9 (红方底线)
+------------------------------+
0 1 2 3 4 5 6 7 8
4.2 走法规则实现
| 棋子 | 规则 | 关键约束 |
|---|---|---|
| 帅/将 | 九宫内上下左右一格 | 将帅对面(飞将) |
| 仕/士 | 九宫内斜走一格 | 不能出宫 |
| 相/象 | 田字对角,堵象眼不能走 | 不过河 |
| 马 | 日字,蹩马腿不能走 | 先直后斜 |
| 车 | 直线任意格 | 遇子停 |
| 炮 | 直线走,翻山吃 | 中间有一子才能吃 |
| 兵/卒 | 未过河只能前进,过河可横走 | 不能后退 |
核心逻辑:先算 rawMoves(不考虑是否被将军),再滤掉会导致被将军的走法。
private getValidMoves(board, pos): Position[] {
const rawMoves = this.getRawMoves(board, pos);
return rawMoves.filter(move => {
const testBoard = cloneBoard(board);
testBoard[move.row][move.col] = testBoard[pos.row][pos.col];
testBoard[pos.row][pos.col] = null;
return !this.isInCheck(testBoard, piece.side);
});
}
五、CloudBase 集成
5.1 初 始化
import cloudbase from '@cloudbase/js-sdk';
const app = cloudbase.init({
env: 'app-xxx',
region: 'ap-shanghai',
accessKey: PUBLISHABLE_KEY, // 通过 MCP 的 ensurePublishableKey 获取
});
const auth = app.auth({ persistence: 'local' });
const db = app.database();
5.2 手机号登录
在 WorkBuddy 中:帮我配置手机号验证码登录
AI 会自动完成:
- 调用
manageAppAuth(action="ensurePublishableKey")获取 publishable key - 生成登录页面代码
- 调用
manageAppAuth(action="getLoginConfig")验证登录配置
前提条件:CloudBase 控制台需配置短信签名+模板。