HTML+JavaScript案例分享: 打造经典俄罗斯方块,详解实现全过程

时间:2024-10-26 07:03:31

在本文中,我们将深入探讨如何使用 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>上绘制游戏板和当前正在下落的