在本文中,我们将深入探讨如何使用 JavaScript 实现经典的俄罗斯方块游戏。俄罗斯方块是一款广为人知的益智游戏,通过操纵各种形状的方块,使其在游戏区域内排列整齐,以消除完整的行来获得分数。
效果图如下:
一、游戏界面与布局
我们首先使用 HTML 和 CSS 来创建游戏的界面。页面主要包括一个游戏区域(<canvas>
元素)和一个包含 “开始游戏” 按钮以及得分显示的区域。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>俄罗斯方块</title>
<style>
body {
background-color: #e0e0e0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
overflow: hidden;
}
#game-container {
background-color: #fff;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.3);
display: flex;
flex-direction: column;
align-items: center;
}
#game-board {
border: 3px solid #333;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
width: 350px;
height: 700px;
}
#startButtonAndScore {
display: flex;
justify-content: center;
align-items: center;
gap: 20px;
margin-top: 15px;
}
#startButton {
padding: 12px 20px;
font-size: 16px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
transition: background-color 0.3s ease;
}
#startButton:hover {
background-color: #45a049;
}
#scoreContainer {
font-size: 18px;
font-weight: bold;
color: #555;
}
</style>
</head>
<body>
<div id="game-container">
<canvas id="game-board" width="350" height="700"></canvas>
<div id="startButtonAndScore">
<button id="startButton">开始游戏</button>
<div id="scoreContainer">得分:0</div>
</div>
</div>
<script>
// 以下是 JavaScript 代码部分
</script>
</body>
</html>
二、游戏逻辑实现
1. 定义方块形状和颜色
我们首先定义了各种可能出现的方块形状和对应的颜色。
const shapes = [
[
[1, 1],
[1, 1]
],
[
[0, 1, 0],
[1, 1, 1]
],
[
[1, 0],
[1, 0],
[1, 1]
],
[
[0, 1],
[0, 1],
[1, 1]
],
[
[1, 1, 1],
[0, 1, 0]
],
[
[1, 1, 0],
[0, 1, 1]
],
[
[0, 1, 1],
[1, 1, 0]
]
];
// 不同形状对应的颜色数组
const colors = ['red', 'blue', 'green', 'yellow', 'orange', 'purple', 'cyan'];
2. 游戏状态变量
设置了一系列游戏状态变量,用于跟踪游戏板的状态、当前正在下落的方块、位置、得分以及游戏是否结束等信息。
let board = []; // 游戏板状态,二维数组表示游戏区域的方块分布
let currentShape = null; // 当前正在下落的形状
let currentShapeColor = null; // 当前形状的颜色
let currentX = 0; // 当前形状在游戏板上的横坐标
let currentY = 0; // 当前形状在游戏板上的纵坐标
let intervalId = null; // 游戏循环的定时器 ID
let score = 0; // 玩家得分
let gameOver = false; // 游戏是否结束的标志
3. 创建游戏板
使用一个函数来初始化游戏板,将每个格子初始化为 0,表示为空。
function createBoard() {
// 遍历每一行
for (let i = 0; i < 20; i++) {
board[i] = [];
// 遍历每一列,将每个格子初始化为 0
for (let j = 0; j < 10; j++) {
board[i][j] = 0;
}
}
}
4. 绘制游戏板
这个函数负责在<canvas>
上绘制游戏板和当前正在下落的