HTML+CSS+JS扫雷游戏

JS扫雷小游戏(DOM (html+css+js)) JS扫雷小游戏 阅读详情

HTML+CSS+JS扫雷游戏

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>扫雷游戏</title>
    <link rel="stylesheet" href="index.css">
    <script src="index.js" defer ></script>
</head>

<body>
    <div class="container">
        <h1>扫雷游戏</h1>
        <p>注意:左键探测,右键插旗,再次右键可取消插旗</p>
        <div class="level">
            <button class="active">初级</button>
            <button>中级</button>
            <button>高级</button>
        </div>
        <div class="info">
            <p>总雷数:<span class="mineNum"></span></p>
            <p>插旗数:<span class="flagNum"></span></p>
        </div>
        <div class="mineArea"></div>
    </div>
</body>

</html>

index.js

// 游戏配置文件
var config = {
    easy: {
        row: 10,
        col: 10,
        mineNum: 10
    },
    normal: {
        row: 15,
        col: 15,
        mineNum: 30
    },
    hard: {
        row: 20,
        col: 20,
        mineNum: 60
    }
}
// 当前游戏水平
var curLevel = config.easy

// 工具函数
function $(selector) {
    return document.querySelector(selector)
}
function $$(selector) {
    return document.querySelectorAll(selector)
}

var mineArray = null
var mineArea = $('.mineArea')
var tableData = []
var flagArray = []
var buttons = $$('.level>button')
var flagNum =  $('.flagNum')
var mineNumber = $('.mineNum')


function initMine() {
    var arr = new Array(curLevel.row * curLevel.col)
    for (var i = 0; i < arr.length; i++) {
        arr[i] = i
    }
    arr.sort(() => 0.5 - Math.random())
    return arr.slice(0, curLevel.mineNum);
}
function clearScene(){
    mineArea.innerHTML = ''
    flagArray = []
    flagNum.innerHTML = 0
    mineNumber.innerHTML = curLevel.mineNum
}
function init() {
    clearScene();
    mineArray = initMine();
    //    console.log(mineArray);
    var table = document.createElement('table')
    var index = 0
    for (var i = 0; i < curLevel.row; i++) {
        var tr = document.createElement('tr')
        tableData[i] = []
        for (var j = 0; j < curLevel.col; j++) {
            var td = document.createElement('td')
            var div = document.createElement('div')
            tableData[i][j] = {
                row: i,
                col: j,
                type: 'number',//各自属性,数字或者雷
                value: 0,//周围雷的数量
                index,
                checked: false //检验
            }
            div.dataset.id = index
            div.classList.add('canFlag')
            if (mineArray.includes(tableData[i][j].index)) {
                tableData[i][j].type = 'mine';
                div.classList.add('mine')
            }
            td.appendChild(div)
            tr.appendChild(td)
            index++
        }
        table.appendChild(tr)
    }
    mineArea.appendChild(table)
    // console.log(tableData);
     // 鼠标点击事件
     mineArea.onmousedown = function (e) {
        // console.log(e.button);
        if (e.button === 0) {
            searchArea(e.target)
        }
        if (e.button === 2) {
            flag(e.target)
        }
    }
}

function showAnswer() {
    var isAllRight = true
    var mineArr = $$('td>div.mine')
    for (var i = 0; i < mineArr.length; i++) {
        mineArr[i].style.opacity = 1
    }

    for (var i = 0; i < flagArray.length; i++) {
        if (flagArray[i].classList.contains('mine')) {
            flagArray[i].classList.add('right')
        } else {
            flagArray[i].classList.add('error')
            isAllRight = false
        }
    }
    if (!isAllRight || flagArray.length !== curLevel.mineNum) {
        gameOver(false)
    }
    mineArea.onmousedown = null
}
function getTableItem(cell) {
    var index = cell.dataset.id
    var flatTableData = tableData.flat()
    return flatTableData.filter(item => item.index == index)[0]
}

function getBound(obj) {
    var rowTop = obj.row - 1 < 0 ? 0 : obj.row - 1
    var rowBottom = obj.row + 1 === curLevel.row ? curLevel.row - 1 : obj.row + 1
    var colLeft = obj.col - 1 < 0 ? 0 : obj.col - 1
    var colRight = obj.col + 1 === curLevel.col ? curLevel.col - 1 : obj.col + 1
    return {
        rowTop,
        rowBottom,
        colLeft,
        colRight
    }
}

function findMineNum(obj) {
    var count = 0
    var { rowTop, rowBottom, colLeft, colRight } = getBound(obj)
    for (var i = rowTop; i <= rowBottom; i++) {
        for (var j = colLeft; j <= colRight; j++) {
            if (tableData[i][j].type == 'mine') {
                count++
            }
        }
    }
    return count
}
function getDOM(obj) {
    var divArray = $$('td>div')
    return divArray[obj.index]
}
function getAround(cell) {
    if (!cell.classList.contains('flag')) {
        cell.parentNode.style.border = 'none'
        cell.classList.remove('canFlag')

        var tableItem = getTableItem(cell)
        if (!tableItem) {
            return;
        }
        tableItem.checked = true
        // 查看周围是否有雷
        var mineNum = findMineNum(tableItem)
        if (!mineNum) {
            var { rowTop, rowBottom, colLeft, colRight } = getBound(tableItem)
            for (var i = rowTop; i <= rowBottom; i++) {
                for (var j = colLeft; j <= colRight; j++) {
                    if (!tableData[i][j].checked) {
                        getAround(getDOM(tableData[i][j]))
                    }
                }
            }
        } else {
            var cl = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight']
            cell.classList.add(cl[mineNum])
            cell.innerHTML = mineNum
        }
    }


}
// cell用户点击的DOM元素
function searchArea(cell) {
    if (cell.classList.contains('mine')) {
        cell.classList.add('error');
        showAnswer()
        return
    }

    getAround(cell)
}

function isWin() {
    for (var i = 0; i < flagArray.length; i++) {
        if (!flagArray[i].classList.contains('mine')) {
            return false
        }
        return true
    }
}
function gameOver(isWin) {
    var mess = ''
    if (isWin) {
        mess = '恭喜您,获得胜利'
    } else {
        mess = '很遗憾,游戏失败'
    }
    setTimeout(function () {
        window.alert(mess)
    }, 0)

}
function flag(cell) {
    if (cell.classList.contains('canFlag')) {
        if (!flagArray.includes(cell)) {
            flagArray.push(cell)
            cell.classList.add('flag')
            if (flagArray.length === curLevel.mineNum) {
                if (isWin()) {
                    gameOver(true)
                }
                showAnswer()
            }
        } else {
            var index = flagArray.indexOf(cell)
            flagArray.splice(index, 1)
            cell.classList.remove('flag')
        }
        flagNum.innerHTML = flagArray.length
    }
}
function bindEvent() {
   
    // 阻止右键
    mineArea.oncontextmenu = function (e) {
        e.preventDefault();
    }

    // 游戏水平
    $('.level').onclick = function (e) {
        for (var i = 0; i < buttons.length; i++) {
            buttons[i].classList.remove('active')
        }
        e.target.classList.add('active')
        switch(e.target.innerHTML){
            case "初级":{
                curLevel = config.easy
                break;
            };
            case "中级":{
                curLevel = config.normal
                break;
            };
            case "高级":{
                curLevel = config.hard
                break;
            };
        }
        init()
    }
}
function main() {
    init();
    bindEvent();
}

main();

index.css

*{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: 'KAITI';
}
body{
    /* position: relative; */
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    background:linear-gradient(to bottom right, rgb(128, 128, 237), pink) ;
}
.container{
    margin: 10px;
}
h1{
    text-align: center;
    margin: 10px;
    color: rgb(8, 74, 198);
}
p{
    text-align: center;
    margin: 10px;
}
.container .level{
    text-align: center;
    padding: 10px;
} 
.container .level button{
    width: 100px;
    height: 30px;
    margin-left: 10px;
    margin-right: 10px;
    background: linear-gradient( rgb(12, 107, 224),rgb(7, 201, 140));
    font-size: 20px;
    color: rgb(249, 249, 248);
    transition: transform 0.3s;
}
.container .level button:hover{
    cursor: pointer;
    transform: scale(1.25);
}
.container .level button.active{
    background: linear-gradient(rgb(229, 45, 45) ,rgb(79, 35, 166));
}
.container .info{
    font-size: 20px;
    display: flex;
    justify-content: center;
    align-items: center;
}
.container .info p{
    margin-right: 20px;
    margin-left: 20px;
}
.container .info p span{
    color: #e30a19;
}
.container .area{
    display: grid;
    align-items: center;
    justify-content: center;
}
.container .mineArea{
    display: flex;
    justify-content: center;
}
.container .mineArea table{
    background:rgb(246, 228, 231);
    border-spacing: 1px;
}
.container .mineArea table td{
    width: 24px;
    height: 24px;
    border: 2px solid;
    background-color: rgb(179, 211, 244);
    border-color: #f8f0f0 rgb(2, 34, 94)  rgb(2, 21, 56) #f8f0f0;
    text-align: center;
    line-height: 24px;
    font-weight: bold;
    cursor: pointer;
}
.container .mineArea table td>div{
    width: 100%;
    height: 100%;
    border-color: #fff;
    background: rgb(179, 211, 244);
}

.container .mineArea table td>div.mine{
    background: rgb(179, 211, 244) url('./image/mine.png') center/cover no-repeat;
    opacity: 0;
    /* opacity: 0.2; */
}
.container .mineArea table td>div.flag{
    background: rgb(179, 211, 244) url('./image/flag.png') center/cover no-repeat;
    /* opacity: 0; */
    opacity: 1;
}
.container .mineArea table td>div.error{
    background-color: rgb(239, 151, 151) ;
}
.container .mineArea table td>div.right{
    background-color: rgb(159, 234, 168) ;
    opacity: 1;
}

.container .mineArea table td>div.zero{
    border-color: #fff;
    background: rgb(179, 211, 244);
}
.container .mineArea table td>div.one{
    border-color: #fff;
    background: rgb(179, 211, 244);
    color: blue;
}
.container .mineArea table td>div.two{
    border-color: #fff;
    background: rgb(179, 211, 244);
    color: rgb(222, 56, 153);
}
.container .mineArea table td>div.three{
    border-color: #fff;
    background: rgb(179, 211, 244);
    color: rgb(27, 206, 161);
}
.container .mineArea table td>div.four{
    border-color: #fff;
    background: rgb(179, 211, 244);
    color: rgb(76, 214, 38);
}
.container .mineArea table td>div.five{
    border-color: #fff;
    background: rgb(179, 211, 244);
    color: rgb(164, 197, 33);
}
.container .mineArea table td>div.six{
    border-color: #fff;
    background: rgb(179, 211, 244);
    color: rgb(192, 69, 69);
}
.container .mineArea table td>div.seven{
    border-color: #fff;
    background: rgb(179, 211, 244);
    color: rgb(7, 97, 44);
}
.container .mineArea table td>div.eight{
    border-color: #fff;
    background: rgb(179, 211, 244);
    color: rgb(155, 8, 84);
}

运行结果

扫雷游戏.gif在这里插入图片描述

原生JS 扫雷游戏 自动插旗子 自定义雷区大小 雷数可调 《扫雷》是Microsoft于1992年附带在 Windows 3.1 操作系统中的单机游戏,它通过点击方格并以出现数字来判断附近雷的数量,将全部地雷做上标记即可胜利。最后在2015年7月发布的Windows 10中移除了这个游戏。随机变换雷区颜色,以及其它CSS样式,动画效果全是CSS。点击网页上的元素触发游戏事件打开雷区。如果对于一个方格,其周围未打开的方格恰好全都有雷,那么这些雷将全部自动被标记为小红旗,而玩家只需要一直点击雷区直至雷区全被打开并胜利呈现YOU WIN~ 没错,全程左键操作。 在地 阅读详情

相关推荐

纯JS实现简易扫雷小游戏网页项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了...

weixin_45007812的博客 4258

html实现扫雷小游戏(附源码)

html实现扫雷小游戏(附源码),html扫雷小游戏,仿制windows xp系统自带的扫雷应用的网页版,使用html+js+css实现。实现了应用版扫雷的基本功能。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 1万+

html实现扫雷游戏

通过html+css+jquery实现经典扫雷游戏,可以直接在浏览器上运行

扫雷网页游戏部分代码

扫雷网页游戏部分代码

零小唬的博客 1400

扫雷(HTML+JS+CSS)

LZ写的一个扫雷的小游戏,附上代码。代码文件与引用的图片都放在了同级的文件夹下,读者如需要可以自行调整位置。

html+JavaScript扫雷原创(详细说明)

html+JavaScript扫雷原创,代码可以修改性比较高,大家可以按照自己的修改,使用比较通俗的写法写的,很容易理解!

HTML实现 扫雷游戏

你今天扫雷了吗?

weixin_42401291的博客 2621

HTML版扫雷

简单易懂的HTML版扫雷,配合CSS+JavaScript+jQuery!适合新手HTML开发员,简单H5前端编程,你值得拥有!

网页扫雷html css js,小游戏:扫雷 前端 H5 + CSS + JS

简介很久以前刚接触前端的时候做的扫雷小游戏。虽然花了不少时间,但是整个做下来,还是很有收获的。现在来看代码还是比较一般的,但也是一番心血。特地分享出来,希望对需要的人有所帮助。适合初学者练习。运行效果运行效果上方的表格左边格子表示剩余雷数,中间选择难度,右边计时。按下空格可以开始新游戏。游戏中游戏胜利游戏失败主体思路随机生成雷的分布,用二维数组储存。同时遍历数组,生成数字,表示周围的雷的数目,同样...

weixin_31861055的博客 1257

扫雷HTML5游戏源码

扫雷HTML5游戏源码,运行需要服务器环境,已经反复测试,放心使用。

RK3588视频转码实战:如何用FFmpeg+MPP实现16路1080P硬解压(附完整命令)

本文详细介绍了如何在RK3588处理器上使用FFmpeg和MPP框架实现16路1080P视频的硬件加速转码。通过解析RK3588的视频处理架构、环境搭建步骤和实战配置,提供了完整的命令示例和性能调优建议,帮助开发者高效处理多路视频转码任务。

weixin_29233333的博客 556

经典扫雷游戏开发全解析:HTML+CSS+JavaScript实现

本教程将完整呈现如何用原生前端三剑客(HTML+CSS+JavaScript)实现经典扫雷游戏。该实现包含以下核心功能: 2. 视觉设计(CSS) 亮点特性: 3. 游戏逻辑(JavaScript) 核心算法流程图:左键点击右键点击是否初始化游戏生成雷区计算相邻雷数渲染棋盘玩家操作揭示格子标记旗帜是否触雷?游戏失败检查胜利条件 三、功能亮点详解 1. 雷区生成算法 2. 递归展开算法 四、游戏操作指南 左键点击:揭示格子 右键点击:标记/取消标记地雷 新游戏按钮:重置游戏 胜利条件:正确标记所有地雷并

TengMMVP的博客 2156

【ArcGIS】ArcMap中北京1954坐标系转WGS84的实战技巧与参数选择

本文详细解析了在ArcMap中将北京1954坐标系数据转换为WGS84坐标系的完整流程与核心技巧。针对常见的坐标偏移问题,文章首先强调了数据“归位”的重要性,并提供了处理假东、假北值的具体操作步骤。随后,重点阐述了地理变换参数(如Beijing_1954_To_WGS_1984_2)的选择逻辑及其对转换精度的决定性影响,并结合案例说明了参数选择、中央经线确认及结果验证等关键环节,旨在帮助用户高效、准确地完成坐标转换。

f6g7h8i9j的博客 330

扫雷游戏 JavaScript+HTML+CSS

这是一款由 JavaScript + HTML + CSS 制作的经典扫雷游戏。它由三部分构成:画布逻辑、用户交互、以及用户界面。其中还加入一个有趣的动画效果,点击空白格子后,会以骨牌倒下的样式连锁翻开,赶紧来体验一下吧。

itabbot的博客 582

electron windows设置镜像地址环境变量报错npm error `ELECTRON_MIRROR` is not a valid npm option

如果你是在使用某个特定的脚本或配置文件,请检查该文件中是否有不正确的配置项,并进行相应的修正。确保你遵循electron的官方安装指南,并且没有包含不必要的或错误的配置选项。如果问题依然存在,可以查看npm的官方文档或者相关社区获取更多帮助。

qq_36158551的博客 3324

Linux服务器 离线安装oracle

Linux服务器 离线安装oracle

xie_bro的博客 4256

js+html+css实现扫雷游戏(附加 难度选择 计时 计雷数 开始 重新开始)

首先,让我们来看看效果图

欢迎来到 Baret-H 的博客 5044

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

从零实现扫雷游戏:HTML+CSS+JS全流程解析

本文详细解析了如何使用前端三件套HTML、CSS和JavaScript从零开始实现一个功能完整的扫雷游戏。内容涵盖游戏数据结构设计、网格布局、用户交互逻辑(如点击展开与右键标记)以及核心算法实现,并提供了完整的代码示例和优化技巧,帮助开发者深入理解前端构建交互式应用的全流程。

weixin_29001327的博客 506

第55篇:数据隐私保护技术盘点——差分隐私、同态加密与它们的坑(踩坑总结)

数据隐私保护是AI工程化中必须严肃对待的课题。差分隐私和同态加密是两把利器,但也都是“重武器”,使用不当反而会伤及自身。差分隐私像“模糊处理”,通过加噪来保证统计安全性,要小心管理隐私预算和效用权衡。同态加密像“保险箱里打算盘”,保证了计算的精确性,但必须承受巨大的性能和工程复杂度代价。我的建议是:从小规模实验开始,先用DP-SGD在MNIST/CIFAR-10等标准数据集上感受噪声与精度的关系;再用TenSEAL等易用的库尝试一个加密逻辑回归,体会密文膨胀和速度延迟。

ai_blue_pm的博客 281

Apache Flink连载(一):Apache Flink是什么?

Apache Flink 是一个框架和分布式处理引擎,用于在。

qq_32020645的博客 1216

扫雷游戏-原生js

HTML代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <link rel="stylesheet" href="css/index.css" /> </head> <...

wuxiao18的博客 378

PyTorch实战(14)——图注意力网络(Graph Attention Network,GAT)

本节介绍了图注意力网络 (Graph Attention Network, GAT) 在节点分类任务中的应用。相比图卷积网络 (GCN) 的平均聚合机制,GAT 通过引入注意力机制,能够为不同邻居节点分配差异化权重,从而更精准地捕捉图结构信息。实验表明,GAT 在 CiteSeer 数据集上的分类准确率达到 71.1%,较 GCN 提升 2.5 个百分点。可视化结果显示,GAT 学习到的节点表征具有更好的类别区分度。这验证了注意力机制在图数据建模中的有效性,为处理复杂图结构任务提供了更优解决方案。

盼小辉丶的博客 3550

扫雷源代码(HTML)

扫雷代码,拿走不谢!

a15919754608的博客 2878

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

使用HTML、CSS和JavaScript实现的经典扫雷游戏

一款基于原生Web技术实现的经典扫雷游戏,完整复刻Windows版核心玩法。采用双二维数组结构分别存储地雷分布(mineBoard)和显示状态(showBoard),通过智能算法确保首次点击绝对安全。特色实现包括:递归展开空白区域算法、多级难度自适应布局(12x12至19x19)、响应式设计适配移动端。技术亮点包含CSS Grid构建游戏网格、彩色数字提示系统、完善的状态检测机制(胜利/失败判定),以及健壮的错误处理体系。项目使用纯前端技术栈(HTML/CSS/JS),无需依赖任何框架。

m0_73114063的博客 2292

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: HTML+CSS+JS简易计算器
小柚柚0.o
博客等级 码龄4年 170粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值