264 lines
6.7 KiB
Markdown
264 lines
6.7 KiB
Markdown
# 扫雷游戏优化更新
|
||
|
||
## 🎮 新增功能
|
||
|
||
### 1. 双键按下视觉反馈效果
|
||
|
||
**功能描述**:
|
||
在已揭开的数字格子上同时按下左右键时,周围未揭开且未插旗的格子会显示按下效果,完全模拟经典Windows扫雷的交互体验。
|
||
|
||
**实现细节**:
|
||
- ✅ 按下效果:格子变为浅灰色,边框呈凹陷状态
|
||
- ✅ 轻微缩放:格子缩小至95%,增强按下感
|
||
- ✅ 平滑过渡:0.05秒的CSS过渡动画
|
||
- ✅ 实时更新:鼠标移动到不同格子时,按下效果随之变化
|
||
|
||
**视觉效果**:
|
||
```
|
||
正常状态: 深灰色背景 (#bbb)
|
||
按下状态: 浅灰色背景 (#ddd) + 凹陷边框 + 轻微缩小
|
||
```
|
||
|
||
### 2. 空格键快捷操作
|
||
|
||
**功能描述**:
|
||
按下空格键相当于在鼠标当前位置同时按下左右键,执行弦操作(chord reveal)。
|
||
|
||
**使用场景**:
|
||
- 左手鼠标移动和插旗
|
||
- 右手按空格键快速揭开格子
|
||
- 双手配合,大幅提升游戏效率
|
||
|
||
**实现特性**:
|
||
- ✅ 实时追踪鼠标悬停位置
|
||
- ✅ 只在游戏进行中且非首次点击时生效
|
||
- ✅ 防止页面滚动(preventDefault)
|
||
- ✅ 与鼠标双键操作逻辑完全一致
|
||
|
||
## 🔧 技术实现
|
||
|
||
### 状态管理
|
||
|
||
```typescript
|
||
// 新增状态
|
||
const [pressedCells, setPressedCells] = useState<Set<string>>(new Set());
|
||
const [hoverCell, setHoverCell] = useState<{ row: number; col: number } | null>(null);
|
||
```
|
||
|
||
### 核心函数
|
||
|
||
#### 1. 更新按下效果
|
||
```typescript
|
||
const updatePressedCells = (row: number, col: number) => {
|
||
// 只有已揭开且有数字的格子才显示按下效果
|
||
if (!cell.isRevealed || cell.neighborMines === 0) return;
|
||
|
||
// 收集周围未揭开且未插旗的格子
|
||
const pressed = new Set<string>();
|
||
for (let dr = -1; dr <= 1; dr++) {
|
||
for (let dc = -1; dc <= 1; dc++) {
|
||
// 添加符合条件的格子到pressed集合
|
||
}
|
||
}
|
||
setPressedCells(pressed);
|
||
};
|
||
```
|
||
|
||
#### 2. 格子样式增强
|
||
```typescript
|
||
const getCellStyle = (cell: Cell, row: number, col: number) => {
|
||
const isPressed = pressedCells.has(`${row},${col}`);
|
||
|
||
if (isPressed) {
|
||
return {
|
||
...baseStyle,
|
||
backgroundColor: '#ddd',
|
||
borderStyle: 'inset',
|
||
transform: 'scale(0.95)',
|
||
transition: 'all 0.05s ease'
|
||
};
|
||
}
|
||
};
|
||
```
|
||
|
||
#### 3. 空格键事件监听
|
||
```typescript
|
||
useEffect(() => {
|
||
const handleKeyDown = (e: KeyboardEvent) => {
|
||
if (e.code === 'Space' && gameStatus === 'playing' && hoverCell) {
|
||
e.preventDefault();
|
||
chordReveal(hoverCell.row, hoverCell.col);
|
||
}
|
||
};
|
||
|
||
window.addEventListener('keydown', handleKeyDown);
|
||
return () => window.removeEventListener('keydown', handleKeyDown);
|
||
}, [gameStatus, hoverCell, chordReveal]);
|
||
```
|
||
|
||
### 事件处理优化
|
||
|
||
#### 鼠标事件增强
|
||
```typescript
|
||
<Box
|
||
onMouseDown={(e) => handleMouseDown(rowIndex, colIndex, e)}
|
||
onMouseUp={(e) => handleMouseUp(rowIndex, colIndex, e)}
|
||
onMouseEnter={() => {
|
||
setHoverCell({ row: rowIndex, col: colIndex });
|
||
// 双键按下时更新按下效果
|
||
if (isMouseDown.left && isMouseDown.right) {
|
||
updatePressedCells(rowIndex, colIndex);
|
||
}
|
||
}}
|
||
onMouseLeave={() => {
|
||
// 清除按下效果
|
||
setPressedCells(new Set());
|
||
}}
|
||
onContextMenu={(e) => {
|
||
e.preventDefault();
|
||
toggleFlag(rowIndex, colIndex, e);
|
||
}}
|
||
/>
|
||
```
|
||
|
||
## 📊 用户体验提升
|
||
|
||
### 操作效率对比
|
||
|
||
| 操作方式 | 传统方式 | 优化后 | 提升 |
|
||
|---------|---------|--------|-----|
|
||
| 揭开周围格子 | 逐个左键点击 | 双键/空格一键完成 | ⚡ 10倍+ |
|
||
| 双手配合 | 仅鼠标操作 | 左手鼠标 + 右手空格 | 🚀 更流畅 |
|
||
| 视觉反馈 | 无预览 | 实时按下效果 | 👁️ 更直观 |
|
||
|
||
### 游戏体验改进
|
||
|
||
1. **更接近经典扫雷**
|
||
- 完全模拟Windows扫雷的按下效果
|
||
- 相同的交互逻辑和视觉反馈
|
||
|
||
2. **减少手指疲劳**
|
||
- 空格键代替双键点击
|
||
- 大键位,更容易按压
|
||
|
||
3. **支持多种操作风格**
|
||
- 纯鼠标操作:传统双键
|
||
- 键鼠混合:空格键辅助
|
||
- 自由选择最舒适的方式
|
||
|
||
## 🎯 使用指南
|
||
|
||
### 基本操作
|
||
|
||
1. **鼠标双键操作**
|
||
```
|
||
在数字格子上 → 同时按下左右键 → 看到周围格子按下效果 → 释放 → 自动揭开
|
||
```
|
||
|
||
2. **空格键快捷操作**
|
||
```
|
||
鼠标移到数字格子 → 按空格键 → 自动揭开周围格子
|
||
```
|
||
|
||
3. **组合使用建议**
|
||
```
|
||
左手: 控制鼠标移动和插旗(右键)
|
||
右手: 按空格键快速揭开
|
||
```
|
||
|
||
### 高级技巧
|
||
|
||
1. **快速扫描**
|
||
- 鼠标快速移动到各个数字格
|
||
- 空格键连续按压
|
||
- 大幅提升游戏速度
|
||
|
||
2. **精确控制**
|
||
- 在不确定时使用双键
|
||
- 看到按下效果后决定是否继续
|
||
- 避免误操作
|
||
|
||
3. **节奏控制**
|
||
- 插旗用右键(左手)
|
||
- 揭开用空格(右手)
|
||
- 形成稳定的操作节奏
|
||
|
||
## 🐛 边界情况处理
|
||
|
||
### 1. 鼠标离开游戏区域
|
||
- ✅ 自动清除按下效果
|
||
- ✅ 重置鼠标状态
|
||
- ✅ 防止状态残留
|
||
|
||
### 2. 游戏状态变化
|
||
- ✅ 游戏结束时禁用空格键
|
||
- ✅ 首次点击时禁用弦操作
|
||
- ✅ 状态检查确保安全
|
||
|
||
### 3. 特殊格子处理
|
||
- ✅ 已揭开格子:不显示按下效果
|
||
- ✅ 已插旗格子:不显示按下效果
|
||
- ✅ 数字为0的格子:不触发弦操作
|
||
|
||
## 📝 更新的游戏说明
|
||
|
||
新增说明内容:
|
||
```
|
||
• 按下空格键相当于在鼠标位置同时按下双键,方便左右手配合操作
|
||
```
|
||
|
||
完整说明:
|
||
- 左键点击揭开格子,右键点击插旗
|
||
- 在已揭开的数字格上同时按下左右键,如果旗帜数量等于数字,自动揭开周围格子
|
||
- **按下空格键相当于在鼠标位置同时按下双键,方便左右手配合操作** ⭐ 新增
|
||
- 数字表示周围8个格子中地雷的数量
|
||
- 揭开所有非地雷格子即可获胜
|
||
- 登录后可保存游戏记录并查看排行榜
|
||
|
||
## 🔄 兼容性
|
||
|
||
- ✅ 所有现代浏览器
|
||
- ✅ 不影响原有功能
|
||
- ✅ 可选使用,传统操作仍然有效
|
||
- ✅ 响应式设计,各种屏幕尺寸
|
||
|
||
## 🚀 性能优化
|
||
|
||
1. **事件处理优化**
|
||
- 使用 `useCallback` 避免重复创建函数
|
||
- Set 数据结构快速查找
|
||
- 最小化状态更新
|
||
|
||
2. **渲染优化**
|
||
- 只更新必要的格子样式
|
||
- CSS过渡动画硬件加速
|
||
- 防抖和节流(如需要)
|
||
|
||
3. **内存管理**
|
||
- 及时清理事件监听器
|
||
- 组件卸载时释放资源
|
||
|
||
## 📈 未来可能的优化
|
||
|
||
1. **触摸设备支持**
|
||
- 长按触发弦操作
|
||
- 双指点击支持
|
||
|
||
2. **可配置快捷键**
|
||
- 允许用户自定义快捷键
|
||
- 支持多个快捷键方案
|
||
|
||
3. **音效反馈**
|
||
- 按下时的音效
|
||
- 揭开格子的音效
|
||
|
||
4. **视觉效果增强**
|
||
- 更丰富的动画效果
|
||
- 主题皮肤支持
|
||
|
||
---
|
||
|
||
**更新日期**: 2025-10-30
|
||
**版本**: v1.2
|
||
**新增功能**: 双键按下效果 + 空格键快捷操作
|