一、背景
在网上能查找到通过 Javascript 编写俄罗斯方块的资料,而且更牛的是只需要不到百行的代码就实现了,笔者非常佩服这些牛人。佩服之余,笔者也想尝试通过 Javascript 编写俄罗斯方块。在翻阅网上的资料和代码中,发现这些代码的可读性不高,因此不能让读者很好地去理解和学习代码。因此,笔者通过本文介绍自己如何通过面向对象的思想实现该游戏。
二、项目介绍
2.1 效果展示
2.2 实现思路
地图:大小已经通过 css 样式确定(300px x 600px)。
堆积方块:创建 200 个小方块(30px x 30px 的div),填充(通过二维数组存放)到地图中。通过 css 样式区分堆积的方块(done)和可活动的区域(none)。
下落方块:方块有7个种类,都是通过4个小方块(30px x 30px 的div)构成。其横向活动区域为[0,9],纵向活动区域为[0,19],通过 css 样式设置颜色,如下表示:
1 | [ |
坐标图表示如下:
移动方块:通过设置 position: absolute ,再动态设置 top 和 left 即可。
旋转方块:通过公式旋转,以上文的坐标案例演示:
1 | this.current = [ |
消行:通过切换样式实现,具体内容下文介绍。
动态效果:通过 setInterval 不断刷新页面(调用 map 对象的 _refreshMap 方法改变方块位置)。
2.3 涉及技术
DOM操作、面向对象、事件操作和间隔函数 setInterval
2.4 项目结构
三、实现步骤
由于逻辑较为复杂,代码编写较长,因此只演示关键代码。
3.1 css 样式介绍
none 表示地图中的活动区域样式
current 开头的表示当前活动的方块样式
done 表示堆积的方块样式
游戏开始时,地图(300px x 600px)被 200 个小方块(30px x 30px 的div)填充,其 class 为 none。
当前方块在地图中下落时,设置 class 为 current 开头的样式。
当方块不能下落要堆积时,将其在地图当前区域的 div 样式由 none 改成 done。同时,将当前下落方块坐标设置为下一个方块坐标。
当方块消行时,遍历所有行,设置当前行的样式为上一行的样式,即修改坐标,让堆积的方块下落到消行的位置。
3.2 初始化地图
map.js 文件
1 | var Map = function(square) { |
3.3 创建方块
square.js 文件
1 | // 方块由4个小方块组成 |
3.4 移动方块
square.js 文件
1 | // 移动方块 |
3.5 旋转方块
square.js 文件
1 | // 旋转 |
3.6 消行
square.js 文件
1 | // 向下移动 |
3.7 启动游戏
game.js 文件
1 | var Game = function() { |