当前位置:首页 > JavaScript

js实现扫雷

2026-02-02 07:09:08JavaScript

实现扫雷游戏的基本思路

扫雷游戏的核心逻辑包括生成雷区、计算周围雷数、处理点击事件以及判断游戏胜负。以下是实现扫雷的关键步骤。

初始化游戏棋盘

创建一个二维数组表示游戏棋盘,初始化时填充为0或随机布置地雷。地雷可以用特定值(如-1)标记。

function createBoard(rows, cols, mines) {
    const board = Array(rows).fill().map(() => Array(cols).fill(0));
    let minesPlaced = 0;

    while (minesPlaced < mines) {
        const x = Math.floor(Math.random() * rows);
        const y = Math.floor(Math.random() * cols);
        if (board[x][y] !== -1) {
            board[x][y] = -1;
            minesPlaced++;
        }
    }
    return board;
}

计算周围雷数

遍历棋盘,对非雷格子计算周围8个格子中的雷数。

function calculateNumbers(board) {
    const rows = board.length;
    const cols = board[0].length;
    const directions = [
        [-1, -1], [-1, 0], [-1, 1],
        [0, -1],          [0, 1],
        [1, -1],  [1, 0], [1, 1]
    ];

    for (let x = 0; x < rows; x++) {
        for (let y = 0; y < cols; y++) {
            if (board[x][y] === -1) continue;
            let count = 0;
            for (const [dx, dy] of directions) {
                const nx = x + dx, ny = y + dy;
                if (nx >= 0 && nx < rows && ny >= 0 && ny < cols && board[nx][ny] === -1) {
                    count++;
                }
            }
            board[x][y] = count;
        }
    }
}

处理点击事件

实现点击格子时的逻辑,包括揭示格子、递归揭示空白区域以及游戏结束判断。

function reveal(board, revealed, x, y) {
    const rows = board.length;
    const cols = board[0].length;

    if (x < 0 || x >= rows || y < 0 || y >= cols || revealed[x][y]) return;

    revealed[x][y] = true;
    if (board[x][y] === -1) {
        // 踩到雷,游戏结束
        return false;
    }

    if (board[x][y] === 0) {
        // 递归揭示周围的空白格子
        const directions = [
            [-1, -1], [-1, 0], [-1, 1],
            [0, -1],          [0, 1],
            [1, -1],  [1, 0], [1, 1]
        ];
        for (const [dx, dy] of directions) {
            reveal(board, revealed, x + dx, y + dy);
        }
    }
    return true;
}

渲染游戏界面

使用HTML和CSS创建游戏界面,并通过JavaScript动态更新。

<div id="board" style="display: grid; grid-template-columns: repeat(10, 30px);"></div>
<script>
    const rows = 10, cols = 10, mines = 15;
    const board = createBoard(rows, cols, mines);
    calculateNumbers(board);
    const revealed = Array(rows).fill().map(() => Array(cols).fill(false));

    const boardElement = document.getElementById('board');
    for (let x = 0; x < rows; x++) {
        for (let y = 0; y < cols; y++) {
            const cell = document.createElement('div');
            cell.style.width = '30px';
            cell.style.height = '30px';
            cell.style.border = '1px solid #000';
            cell.style.display = 'flex';
            cell.style.justifyContent = 'center';
            cell.style.alignItems = 'center';
            cell.addEventListener('click', () => {
                if (!reveal(board, revealed, x, y)) {
                    alert('Game Over!');
                }
                renderBoard();
            });
            boardElement.appendChild(cell);
        }
    }

    function renderBoard() {
        const cells = boardElement.children;
        for (let x = 0; x < rows; x++) {
            for (let y = 0; y < cols; y++) {
                const index = x * cols + y;
                if (revealed[x][y]) {
                    cells[index].textContent = board[x][y] === -1 ? '💣' : board[x][y];
                    cells[index].style.backgroundColor = '#ddd';
                } else {
                    cells[index].textContent = '';
                    cells[index].style.backgroundColor = '#fff';
                }
            }
        }
    }
</script>

添加标记功能

允许玩家右键标记疑似地雷的格子。

cell.addEventListener('contextmenu', (e) => {
    e.preventDefault();
    if (!revealed[x][y]) {
        cells[index].textContent = cells[index].textContent === '🚩' ? '' : '🚩';
    }
});

游戏胜负判断

检查是否所有非雷格子均被揭示或所有地雷被正确标记。

js实现扫雷

function checkWin(board, revealed) {
    const rows = board.length;
    const cols = board[0].length;
    for (let x = 0; x < rows; x++) {
        for (let y = 0; y < cols; y++) {
            if (board[x][y] !== -1 && !revealed[x][y]) {
                return false;
            }
        }
    }
    return true;
}

通过以上步骤,可以实现一个基本的扫雷游戏。可以根据需求进一步优化界面和添加更多功能,如计时器、难度选择等。

标签: js
分享给朋友:

相关文章

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…

js 实现截图

js 实现截图

使用html2canvas库实现截图 html2canvas是一个流行的JavaScript库,可将HTML元素转换为Canvas,进而导出为图片。 安装库: npm install ht…

js实现截图

js实现截图

使用HTML2Canvas库实现截图 HTML2Canvas是一个流行的JavaScript库,可以将网页元素或整个页面转换为Canvas图像。安装方式: npm install html2canv…