# 前后端分离象棋对战项目开发记录
1. **结构清晰**:使用更直观的标题、分段和列表,增强可读性。
2. **视觉美观**:添加Markdown格式化(如代码块、加粗、斜体),并建议配色和排版风格。
3. **内容精炼**:精简冗余表述,突出重点,保留技术细节。
4. **专业感**:增加图表或伪代码(可选),并提供UI设计的建议。
5. **风格统一**:采用现代技术文档风格,简约且专业。
# 前后端分离象棋对战项目开发记录
## 项目目标
实现一个基于 **Socket.IO** 的在线象棋对战系统,支持:
- **前后端物理分离**:前端负责渲染与交互,后端处理核心逻辑。
- **多人实时对战**:远程玩家可加入房间,实时同步棋局状态。
- **棋谱同步**:通过Socket通道动态更新棋子位置与房间信息。
---
## 目录结构
项目采用标准分层架构,分为 **前端(client)** 和 **后端(server)** 两个子模块。核心数据以JSON格式存储,动态状态由后端调度,前端通过Socket.IO获取。
```plaintext
chinese_chess/
├── client/ # 前端代码
│ ├── public/ # 静态资源(图标、字体等)
│ ├── src/
│ │ ├── assets/ # 图片资源
│ │ │ └── chess_pieces/ # 棋子图标(红方、黑方)
│ │ ├── basic_union/ # 棋盘基础组件
│ │ │ ├── ChessPiece.jsx # 单个棋子组件
│ │ │ └── ChessCell.jsx # 单个格子组件
│ │ ├── game_infor/ # 游戏信息组件
│ │ │ ├── GameBoard.jsx # 棋盘与房间状态组件
│ │ │ └── RoomStatusBar.jsx # 房间信息(已合并至GameBoard)
│ │ ├── components/ # 页面级复合组件
│ │ │ ├── GameLobby.jsx # 新建/加入游戏界面
│ │ │ └── loading_game_status.jsx # 棋盘与状态整合组件
│ │ ├── logic_id/ # ID定义与映射
│ │ │ ├── roomId.js # 房间ID管理
│ │ │ ├── pieceId.js # 棋子ID定义
│ │ │ └── cellId.js # 格子坐标ID
│ │ ├── services/ # 前端服务层
│ │ │ └── socket.js # Socket.IO客户端封装
│ │ ├── pages/ # 页面组件
│ │ │ ├── HomePage.jsx # 首页(介绍、登录)
│ │ │ └── GamePage.jsx # 对局页面(棋盘与交互)
│ │ ├── App.jsx # 路由管理
│ │ ├── index.js # 项目入口
│ │ └── main.jsx # 页面渲染入口
│ ├── package.json # 前端依赖
│ └── tailwind.config.js # Tailwind CSS配置
└── server/ # 后端代码
├── socket/ # Socket.IO逻辑
│ ├── index.js # Socket.IO主入口
│ ├── roomManager.js # 房间创建与玩家管理
│ └── moveHandler.js # 棋子移动与状态广播
├── utils/ # 工具函数
│ └── idGenerator.js # 唯一ID生成
├── index.js # Express与Socket.IO服务
├── package.json # 后端依赖
└── .env # 环境变量(端口等)
```
---
## 核心开发流程
### 1. 定义静态数据结构
- **前端**:
- `logic_id/roomId.js`:定义房间ID和配置,确保前后端数据一致。
- `pieceId.js`、`cellId.js`:静态定义棋子和格子ID,包含类型映射表,注释清晰。
- **注意**:这些文件仅提供静态结构,动态数据通过Socket获取。
- **作用**:为UI渲染和接口联调提供Mock数据与结构校验。
### 2. 实现Socket通信
- **后端** (`server/socket/`):
- 实现房间创建、玩家加入/离开、棋子移动、状态广播。
- 返回JSON格式数据,统一接口规范。
- **前端** (`services/socket.js`):
- 封装Socket.IO客户端,处理连接、事件监听和数据分发。
- 所有动态数据依赖Socket响应,静态JSON仅用于Mock。
- **目标**:确保前后端数据流畅,状态同步无误。
### 3. 开发基础组件与界面
- **基础组件** (`basic_union/`):
- `ChessPiece.jsx`:渲染棋子,动态获取位置。
- `ChessCell.jsx`:渲染格子,支持点击交互。
- **信息组件** (`game_infor/`):
- `GameBoard.jsx`:整合棋盘与房间状态。
- `RoomStatusBar.jsx`:展示玩家与对局信息(已合并)。
- **页面组件** (`pages/`):
- `HomePage.jsx`:首页,包含登录与游戏入口。
- `GamePage.jsx`:对局页面,渲染棋盘与交互逻辑。
- **路由** (`App.jsx`):管理页面跳转与数据刷新。
### 4. 综合联调与闭环
- **接口联调**:逐一测试Socket事件(新建房间、加入、移动棋子),统一JSON结构。
- **高级组件** (`GameLobby.jsx`, `loading_game_status.jsx`):实现页面联动与状态更新。
- **全链路测试**:
- 清理Mock数据,全部切换为Socket响应。
- 验证实时对战与状态同步。
- **优化**:添加错误处理与断线重连机制。
---
## 开发心得与建议
1. **数据结构先行**:
- 静态定义所有JSON结构,前后端对齐接口,减少联调成本。
- 示例JSON结构(棋子移动):
```json
{
"roomId": "room_123",
"pieceId": "red_rook_1",
"fromCell": "c3",
"toCell": "c5",
"timestamp": 1698765432
}
```
2. **状态唯一源头**:
- 所有动态数据从Socket获取,静态JSON仅用于UI调试。
- 避免前端直接修改状态,保持逻辑清晰。
3. **测试驱动开发**:
- 每阶段编写单元测试(如Socket事件、组件渲染)。
- 自测脚本可大幅减少回归测试的工作量。
4. **UI设计建议**:
- **配色**:采用传统象棋风格(木纹棋盘、红黑棋子),搭配现代扁平化UI。
- **动画**:棋子移动添加平滑过渡,提升体验。
- **响应式**:使用Tailwind CSS适配PC与移动端。
- **可选图表**:展示开发进度(如Gantt图)或棋局统计。
---