Migrate project from typing_practiceweb

This commit is contained in:
2026-05-14 16:04:14 +08:00
parent dbc5425706
commit 0e87d5546d
225 changed files with 92811 additions and 0 deletions

170
MINESWEEPER_README.md Normal file
View File

@@ -0,0 +1,170 @@
# 扫雷游戏功能说明
## 功能概述
已成功添加经典Windows扫雷游戏到项目中,支持三种难度级别,并提供排行榜功能。
## 新增文件
### 后端文件
1. **`server/models/MinesweeperRecord.ts`** - 扫雷游戏记录数据模型
2. **`server/routes/minesweeper.ts`** - 扫雷游戏API路由
### 前端文件
1. **`src/components/MinesweeperGame.tsx`** - 扫雷游戏主界面组件
2. **`src/components/MinesweeperLeaderboard.tsx`** - 扫雷排行榜组件
### 修改的文件
1. **`server/server.ts`** - 添加扫雷路由注册
2. **`src/App.tsx`** - 添加扫雷游戏路由
3. **`src/components/Navbar.tsx`** - 添加扫雷游戏菜单
## 功能特性
### 1. 三种难度级别
- **初级 (9×9, 10雷)**: 适合新手玩家
- **中级 (16×16, 40雷)**: 适合有经验的玩家
- **高级 (16×30, 99雷)**: 适合专家级玩家
### 2. 游戏功能
- ✅ 经典扫雷游戏规则
- ✅ 左键点击揭开格子,右键点击插旗
- ✅ 首次点击保护(首次点击位置及周围不会有雷)
- ✅ 自动展开无雷区域
- ✅ 计时功能
- ✅ 剩余旗帜数量显示
- ✅ 游戏胜利/失败判定
- ✅ 个人最佳成绩显示
### 3. 排行榜功能
- ✅ 按难度分类排行
- ✅ 显示最佳时间、总游戏次数、获胜次数、胜率
- ✅ 前三名特殊标记(🥇🥈🥉)
- ✅ 分页显示
- ✅ 只统计获胜记录
- ✅ 实时更新
### 4. 数据统计
- ✅ 自动保存游戏记录(需登录)
- ✅ 个人最佳成绩追踪
- ✅ 游戏统计数据
## 访问路径
### 游戏页面
- **路径**: `/minesweeper`
- **说明**: 扫雷游戏主界面,可选择难度开始游戏
### 排行榜页面
- **路径**: `/minesweeper/leaderboard`
- **说明**: 查看各难度级别的排行榜
## 导航菜单
在顶部导航栏中新增"扫雷游戏"菜单,包含两个子菜单:
- 开始游戏
- 排行榜
## API端点
### 后端API
#### 1. 提交游戏记录
- **URL**: `POST /api/minesweeper/record`
- **需要登录**: 是
- **参数**:
```json
{
"difficulty": "beginner|intermediate|expert",
"timeSeconds": 123,
"won": true
}
```
#### 2. 获取排行榜
- **URL**: `GET /api/minesweeper/leaderboard/:difficulty?page=1&limit=10`
- **需要登录**: 否
- **示例**: `/api/minesweeper/leaderboard/beginner?page=1&limit=10`
#### 3. 获取个人最佳成绩
- **URL**: `GET /api/minesweeper/personal-best/:difficulty`
- **需要登录**: 是
- **示例**: `/api/minesweeper/personal-best/beginner`
#### 4. 获取游戏统计
- **URL**: `GET /api/minesweeper/stats`
- **需要登录**: 是
## 数据库集合
### MinesweeperRecord
存储所有游戏记录,字段包括:
- `userId`: 用户ID
- `username`: 用户名
- `fullname`: 姓名
- `difficulty`: 难度级别
- `timeSeconds`: 完成时间(秒)
- `won`: 是否获胜
- `createdAt`: 创建时间
- `updatedAt`: 更新时间
## 使用说明
### 游戏规则
1. 点击格子揭开,数字表示周围8个格子中地雷的数量
2. 右键点击插旗标记可能的地雷位置
3. 揭开所有非地雷格子即可获胜
4. 点到地雷则游戏失败
### 登录与记录
- 游客可以玩游戏,但不会保存记录
- 登录用户的游戏记录会自动保存
- 只有获胜的记录才会计入排行榜
- 排行榜按最佳完成时间排序
### 个人最佳
- 登录用户可以在游戏界面看到个人最佳成绩
- 打破个人记录时会有特殊提示
## 技术实现
### 前端技术
- React + TypeScript
- Material-UI组件库
- 状态管理: useState, useEffect, useCallback
- 游戏逻辑: 纯客户端实现
### 后端技术
- Express路由
- MongoDB数据存储
- Mongoose聚合查询
- JWT认证(可选,支持游客模式)
### 游戏算法
- 随机地雷生成(避开首次点击区域)
- 深度优先搜索展开无雷区域
- 周围地雷数量计算
## 性能优化
1. **索引优化**: 在`userId`和`difficulty`字段上创建索引
2. **聚合查询**: 使用MongoDB聚合管道高效计算排行榜
3. **分页加载**: 排行榜支持分页,默认每页10条记录
4. **客户端渲染**: 游戏逻辑完全在客户端运行,不占用服务器资源
## 未来扩展建议
1. 添加游戏暂停/继续功能
2. 支持键盘快捷键操作
3. 添加音效和动画效果
4. 支持自定义皮肤主题
5. 添加每日挑战模式
6. 支持好友对战功能
7. 添加成就系统
## 注意事项
1. 游戏记录只在登录状态下保存
2. 排行榜只统计获胜的记录
3. 首次点击位置及周围不会有地雷(防止首次点击即失败)
4. 右键菜单被劫持用于插旗,如需访问浏览器右键菜单,请在游戏区域外点击