前言
继上一篇文章介绍贪吃蛇小游戏的实现方案后,本文继续讲解俄罗斯方块游戏的开发。相比贪吃蛇,俄罗斯方块的实现更加复杂,涉及方块旋转、多行消除、速度递增等机制。
通过这个案例,可以学习到如何用原生 JavaScript 实现经典的方块下落消除游戏。
项目结构
游戏放置在 source/ai-games/tetris/ 目录下,文件结构如下:
1 | source/ai-games/tetris/ |
与贪吃蛇相同的独立目录结构,便于管理和扩展更多游戏。
游戏页面实现
Canvas 画布
1 | <canvas id="game-canvas" width="240" height="400"></canvas> |
俄罗斯方块采用 12×20 网格,每个格子 20px,宽度较窄以适应竖屏布局。
样式设计
1 | canvas { |
使用蓝色主题(#2196F3)与贪吃蛇的绿色区分开。
核心逻辑实现
方块形状定义
游戏包含 7 种经典方块形状,用矩阵和颜色表示:
1 | const SHAPES = { |
每种方块用 0/1 矩阵表示形状,1 表示方块存在的位置。
游戏状态管理
1 | let board = []; // 12×20 游戏板,存储已落方块颜色 |
board 是二维数组,存储已固定在底部的方块颜色,空位为 0。
随机生成方块
1 | function randomPiece() { |
使用 map(row => [...row]) 实现矩阵的深拷贝,避免修改原始形状定义。
碰撞检测
1 | function checkCollision(matrix, x, y) { |
遍历方块的每个单元格,检查是否越界或与已落方块重叠。