想用前端技术练手,却不知道从何入手?不妨试试用 VSCode 从零开始做一个简单的扫雷小游戏。它逻辑清晰、功能完整,能让你快速掌握 HTML、CSS 和 JavaScript 的基础知识,并且能够体会到前端开发的乐趣。本文将带你一步步实现扫雷,并分享一些实战中的避坑经验。
扫雷游戏的核心原理
扫雷游戏的核心在于地图生成、用户交互和逻辑判断。首先,我们需要一个二维数组来表示游戏地图,每个元素代表一个格子,存储地雷或者数字(周围地雷的数量)。地雷的分布通常是随机的,可以使用 JavaScript 的 Math.random() 函数来实现。用户点击格子后,我们需要判断该格子是否是地雷,如果是,则游戏结束;如果不是,则显示该格子的数字,并递归展开周围的空白格子。这个递归展开的过程可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来实现。
项目搭建与准备
创建项目目录:

在 VSCode 中创建一个新的文件夹,作为扫雷游戏的根目录。比如命名为
minesweeper。创建 HTML 文件:

在根目录下创建
index.html文件,用于定义游戏界面。<!DOCTYPE html> <html> <head> <title>扫雷游戏</title> <link rel="stylesheet" href="style.css"> </head> <body> <div id="game-board"></div> <script src="script.js"></script> </body> </html>创建 CSS 文件:

创建
style.css文件,用于定义游戏界面的样式。#game-board { display: grid; grid-template-columns: repeat(10, 30px); /* 假设 10x10 的地图 */ grid-template-rows: repeat(10, 30px); } .cell { width: 30px; height: 30px; border: 1px solid #ccc; text-align: center; line-height: 30px; font-size: 20px; cursor: pointer; }创建 JavaScript 文件:

创建
script.js文件,用于编写游戏逻辑。const boardSize = 10; // 地图大小 const mineCount = 10; // 地雷数量 let board = []; let gameBoard = document.getElementById('game-board'); // 初始化地图 function initializeBoard() { for (let i = 0; i < boardSize; i++) { board[i] = []; for (let j = 0; j < boardSize; j++) { board[i][j] = { isMine: false, isRevealed: false, adjacentMines: 0 }; } } } // 放置地雷 function placeMines() { let minesPlaced = 0; while (minesPlaced < mineCount) { const row = Math.floor(Math.random() * boardSize); const col = Math.floor(Math.random() * boardSize); if (!board[row][col].isMine) { board[row][col].isMine = true; minesPlaced++; } } } // 计算相邻地雷数量 function calculateAdjacentMines() { for (let i = 0; i < boardSize; i++) { for (let j = 0; j < boardSize; j++) { if (!board[i][j].isMine) { let count = 0; for (let x = -1; x <= 1; x++) { for (let y = -1; y <= 1; y++) { const newRow = i + x; const newCol = j + y; if (newRow >= 0 && newRow < boardSize && newCol >= 0 && newCol < boardSize && board[newRow][newCol].isMine) { count++; } } } board[i][j].adjacentMines = count; } } } } // 创建游戏界面 function createGameBoard() { for (let i = 0; i < boardSize; i++) { for (let j = 0; j < boardSize; j++) { const cell = document.createElement('div'); cell.classList.add('cell'); cell.dataset.row = i; cell.dataset.col = j; cell.addEventListener('click', handleCellClick); gameBoard.appendChild(cell); } } } // 处理格子点击事件 function handleCellClick(event) { const row = parseInt(event.target.dataset.row); const col = parseInt(event.target.dataset.col); revealCell(row, col); } // 揭示格子 function revealCell(row, col) { if (row < 0 || row >= boardSize || col < 0 || col >= boardSize || board[row][col].isRevealed) { return; } board[row][col].isRevealed = true; const cell = document.querySelector(`.cell[data-row='${row}'][data-col='${col}']`); if (board[row][col].isMine) { cell.textContent = '💣'; // 显示地雷 alert('游戏结束!'); } else { cell.textContent = board[row][col].adjacentMines > 0 ? board[row][col].adjacentMines : ''; if (board[row][col].adjacentMines === 0) { // 递归揭示周围的格子 for (let x = -1; x <= 1; x++) { for (let y = -1; y <= 1; y++) { revealCell(row + x, col + y); } } } } } // 初始化游戏 initializeBoard(); placeMines(); calculateAdjacentMines(); createGameBoard();
避坑经验总结
- 地雷分布算法优化: 初始的随机放置地雷可能导致地雷过于集中,影响游戏体验。可以采用更均匀的地雷分布算法,比如先将所有格子标记为可能的地雷,然后随机选择一定数量的格子作为地雷。
- 边界条件处理: 在计算相邻地雷数量和递归展开空白格子时,要特别注意边界条件的处理,避免数组越界。
- 性能优化: 如果地图尺寸很大,递归展开空白格子可能会导致性能问题。可以考虑使用迭代的方式或者使用 Web Workers 来提高性能。
- 用户体验: 可以增加标记地雷、计时器、难度选择等功能,提升用户体验。例如,加入右键点击标记功能,避免误触地雷。
扩展与进阶
学会了用 VSCode 做简单的扫雷小游戏,你可以尝试以下进阶内容:
- 使用框架: 将原生 JavaScript 代码改写为 React、Vue 或 Angular 等框架,学习组件化开发思想。
- 后端集成: 使用 Node.js 或 Python 等后端技术,实现用户登录、分数排行榜等功能。这会涉及到数据库操作,例如 MySQL 或 MongoDB。
- 部署上线: 将游戏部署到服务器上,让更多人可以玩。可以使用 Nginx 作为反向代理,实现负载均衡,提高网站的并发连接数。
在实战中,遇到问题不要怕,多查资料,多尝试,相信你一定能做出一个优秀的扫雷游戏。
冠军资讯
代码一只喵