Web版 扫雷 JS实现

这几天中毒了,无比迷恋扫雷游戏(摔!明明是机房机器渣到只能玩扫雷),于是在上网络互联与路由课的时候,写了个Web版的扫雷游戏,起码能玩了,还在完善中,嘿嘿,晚上又增加了一些有趣的东东,还有个彩蛋。DEMO:http://imgbattle.cn/mine/

其中雷区扩展的时候,用的BFS算法。

考虑到所有节点都必须被储存,因此BFS的空间复杂度为 O(|V| + |E|),其中 |V| 是节点的数目,而 |E| 是图中边的数目。(另一种说法称BFS的空间复杂度为 O(BM),其中 B 是最大分支系数,而 M 是树的最长路径长度)由于对空间的大量需求,因此BFS并不适合解非常大的问题。还有就是浏览器页面有限,滚动条影响体验太大,所以把雷区大小作了限制。

边的长度相等,无权图,所以BFS算法是最佳解。

源码:
想要JS的同学,可以下方留言邮箱,顺丰包邮。

HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Mine</title>
    <link rel="stylesheet" type="text/css" href="mine.css">
    <!-- <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> -->
    <script src="jquery.min.js"></script>
    <!-- <script src="mine.js"></script> -->
    <script src="mine.min.js"></script>
</head>
<body>
<div id="page">
    <div id="game">
        <label>x:<input type="num" name="x"></label><br>
        <label>y:<input type="num" name="y"></label><br>
        <label>n:<input type="num" name="n"></label><br>
        <label id
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,实现扫雷游戏需要先了解一下游戏规则和基本原理。 游戏规则: 扫雷游戏是一种单人益智游戏。游戏区域被分为许多单元格,有些单元格下面有地雷。游戏的目标是揭示出所有没有地雷的单元格,同时不揭开任何地雷。当揭开一个地雷时游戏就结束了。如果成功地揭示出所有没有地雷的单元格,游戏就胜利了。 基本原理: 游戏区域被分为许多单元格,每个单元格有三种状态:覆盖状态、揭示状态和标记状态。覆盖状态表示该单元格还没有被揭示,揭示状态表示该单元格已经被揭示,标记状态表示该单元格被标记为地雷。在游戏开始时,随机生成若干个地雷,将它们分布在游戏区域中。当玩家点击一个单元格时,如果该单元格下面有地雷,游戏失败,否则将该单元格变为揭示状态,如果该单元格周围没有地雷,就会自动揭示周围的单元格,直到揭示到有地雷的单元格或者揭示到边缘为止。玩家可以用鼠标右键将一个单元格标记为地雷,标记状态的单元格不会被揭示。 以下是一个简单的实现扫雷游戏的示例代码,使用Node.js和控制台输出实现: ```javascript const readline = require('readline'); // 游戏参数,可以根据需要进行修改 const ROWS = 10; // 行数 const COLS = 10; // 列数 const MINES = 10; // 地雷数 // 游戏状态 const STATE_COVERED = 0; // 覆盖状态 const STATE_MARKED = 1; // 标记状态 const STATE_REVEALED = 2; // 揭示状态 // 单元格对象 class Cell { constructor() { this.mine = false; // 是否为地雷 this.state = STATE_COVERED; // 单元格状态 this.adjacentMines = 0; // 周围地雷数 } } // 游戏对象 class Minesweeper { constructor() { this.board = []; // 游戏区域 this.gameOver = false; // 游戏是否结束 this.uncoveredCount = 0; // 已经揭示的单元格数量 this.initBoard(); // 初始化游戏区域 } // 初始化游戏区域 initBoard() { // 生成空白的游戏区域 for (let i = 0; i < ROWS; i++) { this.board.push([]); for (let j = 0; j < COLS; j++) { this.board[i].push(new Cell()); } } // 随机生成地雷 let count = 0; while (count < MINES) { let row = Math.floor(Math.random() * ROWS); let col = Math.floor(Math.random() * COLS); if (!this.board[row][col].mine) { this.board[row][col].mine = true; count++; } } // 计算每个单元格周围的地雷数 for (let i = 0; i < ROWS; i++) { for (let j = 0; j < COLS; j++) { if (!this.board[i][j].mine) { let count = 0; for (let r = i - 1; r <= i + 1; r++) { for (let c = j - 1; c <= j + 1; c++) { if (r >= 0 && r < ROWS && c >= 0 && c < COLS && this.board[r][c].mine) { count++; } } } this.board[i][j].adjacentMines = count; } } } } // 揭示单元格 reveal(row, col) { let cell = this.board[row][col]; if (cell.state !== STATE_COVERED || this.gameOver) { return; } cell.state = STATE_REVEALED; this.uncoveredCount++; // 如果揭示到了地雷,游戏结束 if (cell.mine) { this.gameOver = true; this.showBoard(); console.log('Game over!'); return; } // 如果所有没有地雷的单元格都被揭示了,游戏胜利 if (this.uncoveredCount === ROWS * COLS - MINES) { this.gameOver = true; this.showBoard(); console.log('Congratulations, you win!'); return; } // 如果揭示到的单元格周围没有地雷,继续揭示周围的单元格 if (cell.adjacentMines === 0) { this.revealNeighbors(row, col); } this.showBoard(); } // 揭示周围的单元格 revealNeighbors(row, col) { for (let r = row - 1; r <= row + 1; r++) { for (let c = col - 1; c <= col + 1; c++) { if (r >= 0 && r < ROWS && c >= 0 && c < COLS && !(r === row && c === col)) { this.reveal(r, c); } } } } // 标记单元格 mark(row, col) { let cell = this.board[row][col]; if (cell.state === STATE_COVERED) { cell.state = STATE_MARKED; } else if (cell.state === STATE_MARKED) { cell.state = STATE_COVERED; } this.showBoard(); } // 显示游戏区域 showBoard() { console.clear(); console.log(' ' + Array.from({ length: COLS }, (_, i) => i + 1).join(' ')); for (let i = 0; i < ROWS; i++) { let row = []; for (let j = 0; j < COLS; j++) { let cell = this.board[i][j]; if (cell.state === STATE_COVERED) { row.push('.'); } else if (cell.state === STATE_MARKED) { row.push('F'); } else { row.push(cell.mine ? '*' : cell.adjacentMines === 0 ? ' ' : cell.adjacentMines); } } console.log((i + 1) + ' ' + row.join(' ')); } console.log(); } } // 读取用户输入 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // 创建游戏对象 const game = new Minesweeper(); // 开始游戏 console.log('Welcome to Minesweeper!'); game.showBoard(); rl.on('line', (input) => { let parts = input.split(' '); if (parts.length !== 3 || !/^[rm]$/i.test(parts[0]) || isNaN(parts[1]) || isNaN(parts[2])) { console.log('Invalid input, please try again.'); return; } let row = parseInt(parts[1]) - 1; let col = parseInt(parts[2]) - 1; if (row < 0 || row >= ROWS || col < 0 || col >= COLS) { console.log('Invalid row or column, please try again.'); return; } if (parts[0].toLowerCase() === 'r') { game.reveal(row, col); } else { game.mark(row, col); } }); ``` 运行以上代码,可以在控制台上玩扫雷游戏。例如,输入 `r 1 1` 可以揭示第一行第一列的单元格,输入 `m 2 3` 可以将第二行第三列的单元格标记为地雷。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值