2048游戏
一个优雅精致的2048游戏实现,支持桌面和移动设备,具有流畅的动画效果和直观的操作体验。
功能特性
核心功能
- 经典2048游戏玩法:通过滑动合并相同数字,目标是创建2048方块
- 分数系统:实时显示当前分数和历史最高分
- 增强撤销系统:
- 支持多步撤销(初始3次)
- 每合成256的倍数获得额外撤销次数
- 最多累计10次撤销
- 撤销按钮显示剩余次数
- 游戏状态:自动检测游戏胜利或失败状态
操作支持
- 键盘控制(桌面端):使用方向键进行操作
- 触摸手势(移动端):支持上下左右滑动手势
- 鼠标拖拽:桌面端也可使用鼠标拖拽操作
- 拖动预览(新功能):
- 手指或鼠标拖动时,可移动的砖块会实时跟随移动
- 带有缓动效果的流畅跟随动画
- 拖动过程中有轻微的缩放和旋转效果
- 未移动的砖块会变暗,突出显示正在移动的砖块
- 松开手指/鼠标后,砖块会快速滑动到目标位置
界面设计
- 响应式布局:自适应不同屏幕尺寸
- 液态玻璃效果(iOS 26风格):
- 半透明毛玻璃质感,高饱和度视觉效果
- SVG滤镜创造真实的液体扭曲效果
- feTurbulence生成柏林噪声纹理
- feDisplacementMap实现背景扭曲变形
- 动态参数控制,创造持续流动的液体效果
- 合并时触发液态爆发动画
- 优雅动画:
- 新方块出现动画(缩放淡入效果)
- 方块合并动画(弹跳效果 + 液态爆发)
- 流畅的移动动画:方块从原位置平滑滑动到目标位置
- 动画时序精确控制,确保视觉连贯性
- 配色方案:采用经典2048配色,不同数字有独特的颜色标识
技术实现
文件结构
2048/
├── index.html # 游戏主页面
├── style.css # 样式文件
├── script.js # 游戏逻辑
├── README.md # 项目说明
└── liquid-glass/ # 液态玻璃效果示例代码
├── src/ # 源代码
│ ├── index.html
│ └── style.css
└── dist/ # 构建输出
技术栈
- HTML5:语义化标签,移动端视口优化,SVG滤镜
- CSS3:
- CSS Grid布局系统
- CSS变量动态控制
- backdrop-filter毛玻璃效果
- mask-image液态边缘
- 高级动画与过渡效果
- 原生JavaScript:ES6类语法,事件监听,DOM操作
- SVG滤镜:feTurbulence噪声生成,feDisplacementMap位移映射
液态玻璃效果技术解析
项目中的液态玻璃效果是通过SVG滤镜实现的,主要技术点包括:
-
SVG位移映射(Displacement Mapping)
<feDisplacementMap in="blur" in2="map" scale="1" xChannelSelector="R" yChannelSelector="G">- 使用位移映射图像的红色和绿色通道来控制像素的水平和垂直偏移
- scale参数控制扭曲强度,可通过动画动态调整
-
高斯模糊预处理
<feGaussianBlur in="SourceGraphic" stdDeviation="0.02" result="blur"/>- 对源图像应用轻微模糊,使扭曲效果更加平滑自然
-
动态交互效果
- 鼠标悬停时通过SVG动画增加scale值(1→1.4)
- 创造类似液体流动的视觉效果
- 使用
fill="freeze"保持动画结束状态
-
CSS毛玻璃配合
backdrop-filter: url(#frosted); -webkit-backdrop-filter: url(#frosted);- 结合CSS的backdrop-filter和SVG滤镜
- 实现背景扭曲而不影响前景元素
-
性能优化策略
- 使用base64编码的位移映射图像,减少HTTP请求
- backdrop-filter只影响背景,提高渲染效率
- 合理的stdDeviation值避免过度计算
核心算法
-
移动算法:
- 记录每个方块的原始位置和目标位置
- 识别需要合并的方块对
- 计算移动路径并生成动画序列
-
动画系统:
- 使用CSS transition实现平滑移动(150ms)
- 方块移动和合并动画分离处理
- 保持DOM元素引用,避免重复创建和销毁
- 精确的时序控制确保动画流畅
-
游戏状态检测:
- 胜利条件:出现2048方块
- 失败条件:无空格且无可合并方块
-
手势识别:
- 计算滑动距离和方向
- 设置最小滑动阈值(50px)
使用方法
本地运行
- 下载项目文件
- 在浏览器中打开
index.html - 开始游戏!
游戏操作
- 桌面端:使用键盘方向键或鼠标拖拽
- 移动端:在游戏区域内滑动手指
- 新游戏:点击"新游戏"按钮
- 撤销:点击"撤销"按钮返回上一步
特色功能
增强撤销系统配置
游戏中的撤销系统可以通过修改以下变量进行自定义:
this.initialUndoCount = 3; // 初始撤销次数
this.maxUndoCount = 10; // 最大累计撤销次数
this.undoRewardValue = 256; // 获得撤销奖励的方块值
数据持久化
- 使用 localStorage 保存最高分
- 刷新页面后最高分不会丢失
性能优化
- 使用 CSS transform 实现动画,避免重排
- 事件委托减少事件监听器数量
- 防止触摸设备的默认滚动行为
- 动画状态管理,防止操作冲突
- 重复状态检查,优化历史栈存储
- 液态玻璃效果优化:
- 使用will-change提示浏览器优化
- SVG滤镜硬件加速
- 智能降级策略,不支持的浏览器自动关闭
- 减少动画模式支持(prefers-reduced-motion)
用户体验
- 清晰的视觉反馈
- 流畅的交互动画
- 直观的操作提示
- 支持撤销操作,降低操作失误成本
浏览器兼容性
完整液态玻璃效果支持
- Safari 15+(最佳效果)
- Chrome 76+ / Edge 79+
- Firefox 103+(需启用backdrop-filter)
降级支持
- 旧版浏览器自动降级为经典纯色方块
- 支持CSS.supports检测,确保游戏正常运行
- prefers-reduced-motion用户可禁用动画效果
更新历史
v1.0 - 初始版本
- 核心玩法: 实现经典2048游戏逻辑,包括分数系统、游戏状态检测。
- 多平台操作: 支持桌面端键盘、鼠标拖拽及移动端触摸手势。
- 响应式设计: 界面自适应不同屏幕尺寸。
v1.1 - 动画与视觉增强
- 流畅动画: 优化方块的移动、合并与出现动画,提升视觉连贯性。
- 液态玻璃效果:
- 基于SVG滤镜(
feTurbulence和feDisplacementMap)实现真实的液态扭曲效果。 - 动态参数控制,创造持续流动的液体质感。
- 合并方块时触发"液态爆发"动画。
- 优化模糊与扭曲参数,实现类似iOS的视觉风格。
- 基于SVG滤镜(
- 界面风格统一:
- 按钮和分数框均采用液态玻璃效果,实现统一的视觉语言。
- 移除元素外部阴影,采用内部光泽和透明度塑造层次感。
v1.2 - 功能增强与体验优化
- 增强撤销系统:
- 支持多步撤销(初始3次,最多10次)。
- 合成256的倍数时,奖励额外撤销次数。
- 按钮实时显示剩余次数。
- 撤销操作附带平滑的逆向动画。
- 确定性撤销: 引入基于种子的伪随机数生成器,确保撤销后操作结果可重现。
- 全屏操作:
- 将触摸和鼠标事件监听扩展至全屏范围。
- 降低滑动触发阈值,提升移动端操作便捷性。
v1.3 - 布局与兼容性修复
- 布局修复:
- 使用CSS Grid重构棋盘格,解决方块对齐问题。
- 修复因
display: flex导致的按钮垂直排列问题。 - 统一界面元素尺寸,使布局更整洁。
- 移动端优化:
- 优化响应式布局,确保在iPhone等小屏幕设备上标题、分数框等元素能正确单行显示。
- 修复页面滚动问题,实现固定视口。
- 适配iPhone安全区域(刘海屏),实现真正的沉浸式全屏体验。
- Bug修复:
- 修复方块合并时后续方块位置计算错误的逻辑。
- 解决撤销功能中出现的跳步、无效操作等问题。
- 修复液态玻璃效果作用范围错误,防止UI元素被扭曲。
v1.4 - 拖动预览交互增强
- 拖动预览效果:
- 实现手指/鼠标拖动时砖块的实时跟随效果
- 添加智能缓动系统,让跟随动作更加自然流畅
- 拖动时可移动的砖块会有轻微的缩放和旋转动画
- 未参与移动的砖块会自动变暗,提供清晰的视觉反馈
- 交互优化:
- 分离transform和position动画,避免冲突
- 使用硬件加速优化拖动性能
- 添加拖动状态管理,防止操作冲突
- 支持触摸取消事件,提升稳定性
- 视觉增强:
- 拖动的砖块添加阴影效果,增强层次感
- 优化光泽效果,让拖动的砖块更加突出
- 使用requestAnimationFrame确保60fps的流畅动画
v1.4.1 - 移动端快速滑动优化
- 快速滑动检测:
- 添加滑动速度检测,200ms内完成的滑动视为快速滑动
- 快速滑动时跳过拖动预览,直接执行移动
- 优化触摸事件节流,减少性能开销
- 性能优化:
- 移除requestAnimationFrame在拖动预览中的使用
- 添加拖动预览开关,可在低端设备上禁用
- 优化CSS动画,添加will-change属性
- 移动设备上简化视觉效果,提升响应速度
- 体验改进:
- 快速滑动时不再卡手,操作更加流畅
- 保留慢速拖动的细腻预览效果
- 平衡了视觉效果和性能表现
v1.5 - 技术研究与文档完善
- 液态玻璃效果研究:
- 添加liquid-glass示例代码,展示纯SVG滤镜实现的液态玻璃效果
- 深入分析SVG位移映射(feDisplacementMap)技术原理
- 研究高斯模糊与位移映射结合的视觉效果
- 探索鼠标交互动画的实现方式
- 技术文档完善:
- 在README中添加液态玻璃效果的详细技术解析
- 补充SVG滤镜的代码示例和参数说明
- 记录性能优化策略和浏览器兼容性考虑
- 更新项目文件结构说明