IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> HTML版扫雷 -> 正文阅读

[JavaScript知识库]HTML版扫雷

页面初始化界面:
在这里插入图片描述
踩雷结束游戏图:
在这里插入图片描述
直接上HTML代码!

<!DOCTYPE html>
<html lang='zh'>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<title>扫雷</title>
<style>
    html, body{
        margin: 0;
        padding: 0;
    }
    .main {
        display: flex;
        flex-shrink: 0;
        align-items: center;
        flex-direction: column;
        justify-content: center;
    }
    #box{
        border: 5px solid black;
        overflow: hidden;
        width: 900px;
        min-width: 900px;
        background-color: #ccc;
        /* background: url('https://ftp.bmp.ovh/imgs/2020/08/8d1866509f36d99f.jpg') no-repeat; */
        background-size: 900px 450px;
    }
    #box > div{
        cursor: pointer;
    }
    #box > .block{
        width: 20px;
        height: 20px;
        background-color: rgb(192, 192, 192);
        float: left;
        border-left:5px solid #fff;
        border-top:5px solid #fff;
        border-bottom:5px solid rgb(128, 128, 128);
        border-right:5px solid rgb(128, 128, 128);
    }
    #box > .block:hover{
        background-color: rgb(192, 192, 192);
        border:0;
        border-top: 2px solid rgb(138, 138, 138);
        border-left: 2px solid rgb(138, 138, 138);
        width: 28px;
        height: 28px;
    }
    #box > .show{
        width: 30px;
        height: 30px;
        background-color: rgba(0, 0, 0, 0.1);
        color: #fff;
        /* background-color: transparent; */
        float: left;
        font-size: 16px;
        line-height: 30px;
        text-align: center;
        font-weight: bold;
    }
    #box > .bomb{
        width: 24px;
        height: 24px;
        border: 3px solid rgba(255, 100, 100, 0.4);
        background-color: rgba(0, 0, 0, 0.1);
        float: left;
    }
    .main .header {
        flex-shrink: 0;
        height: 100px;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    .main #time{
        width: 100px;
        height: 40px;
        margin-right: 40px;
        line-height: 40px;
        background: #ccc;
        border-radius: 5px;
        font-size: 24px;
        font-weight: bold;
        text-align: center;
    }
    .main input {
        border: 0;
        padding: 0;
        margin: 0;
        box-sizing: border-box;
        height: 40px;
        width: 100px;
        border: 2px #ccc solid;
        border-radius: 5px;
        font-size: 24px;
        font-weight: 600;
        padding: 0 5px;
    }
    .main .num {
        margin-right: 40px;
    }
    .main .restart {
        width: 100px;
        height: 40px;
        background-color: #ededed;
        border-radius: 5px;
        font-size: 24px;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
    }
    .main .restart:hover {
        background-color: #ccc;
    }
</style>
</head>
<body>
    <div class="main">
        <div class="header">
            <div id="time">
                0
            </div>
            <div class="num">
                <input type="number" min="1" placeholder="1~441" max="441" value="99" id="num" onblur="if(this.value-0>441){this.value=441}else if(this.value-0<1){this.value=1}"/>
            </div>
            <div class="restart" onclick="window.location.reload()">
                重开
            </div>
        </div>
        <div id="box"></div>
    </div>

    <script>
        class sweep{
            constructor(item) {
                this.item = document.querySelector(item)
                this.bombNum = 99   // 炸弹数量(默认)
                this.allBlock = []  // 全部地块DOM列表
                this.blockList = [] // 无炸弹地块列表
                this.bombList = []  // 有炸弹地块列表
                this.showList = []  // 揭开地块的列表
                this.blockObj = []  // 地块对象
                this.flagList = new Set()   // 旗子列表
                this.begin = false  // 开始
                this.timer = null   // 计时器

                this.init()
            }

            // 启动器
            init () {
                this.conTextMenu()
                this.createFloor()
                this.clickBlock()
            }

            // 生成地形
            createFloor () {
                let frg = document.createDocumentFragment()
                for(let j = 0; j < 450; j++){
                    let div = document.createElement('div')
                    this.blockList.push(j)
                    this.blockObj.push({
                        id: j,
                        x: j%30,
                        y: parseInt(j/30)
                    })
                    div.dataset.id = j
                    div.className = 'block'
                    this.allBlock.push(div)
                    frg.appendChild(div)
                }
                this.item.appendChild(frg)
            }

            // 生成炸弹
            createBomb (arr) {
                this.bombNum = parseInt(document.querySelector('#num').value)
                arr.forEach((item) => {
                    this.blockList.splice(this.blockList.indexOf(item), 1)
                })
                for(let i = 0; i < this.bombNum; i++){
                    this.bombList.push(this.blockList.splice(parseInt(Math.random() * this.blockList.length), 1)[0])
                }
                arr.forEach((item) => {
                    this.blockList.push(item)
                })
            }

            // 点击事件
            clickBlock () {
                // 单击
                this.item.addEventListener('click', (e) => {
                    e = e || window.event
                    let target = e.target || e.srcElement
                    if(!this.begin){
                        this.begin = true
                        this.setTime()
                        let arr = this.getBlock(target.dataset.id - 0)
                        arr.push(target.dataset.id - 0)
                        this.createBomb(arr)
                    }
                    if(target.className === 'block'){
                        this.show(target)
                        if(!this.blockList.some((item) => {return this.allBlock[item].className !== 'show'})){
                            this.victory() 
                            return
                        }
                    }
                })

                // 选中事件
                this.item.addEventListener('selectstart', (e) => {
                    e = e || window.event
                    e.preventDefault()
                })

                // 双击事件
                this.item.addEventListener('dblclick', (e) => {
                    e = e || window.event
                    let target = e.target || e.srcElement
                    if(target.className === 'show'){
                        let num = target.dataset.id - 0
                        let arr = this.getBlock(num)
                        if(arr.some((item) => { return this.bombList.indexOf(item) !== -1 && this.allBlock[item].className !== 'bomb' })){
                            if(target.innerText - 0 && arr.filter((item) => { return this.allBlock[item].className === 'bomb'}).length === target.innerText - 0){
                                this.fail()
                            }
                        } else {
                            arr.forEach((item) => {
                                if(this.allBlock[item].className === 'block'){
                                    this.show(this.allBlock[item])
                                }
                            })
                            if(this.showList.length === this.blockList.length) {
                                this.victory()
                            }
                        }
                    }
                })
            }

            // 判断方块四周
            show (item) {
                let sum = 0
                let num = parseInt(item.dataset.id)
                if(this.bombList.some((i) => { return i === parseInt(item.dataset.id) })){
                    this.fail()
                } else {
                    this.showList.push(parseInt(item.dataset.id))
                    let arr = this.getBlock(num)
                    arr.forEach((one) => {
                        if(this.bombList.some((i) => {return i === one})){
                            sum ++
                        }
                    })
                    item.className = 'show'
                    if(sum){
                        item.innerText = sum
                    } else {    // 追加 show
                        arr.forEach((num) => {
                            if(this.allBlock[num].className === 'block'){
                                this.show(this.allBlock[num])
                            }
                        })
                    }
                }
            }

            // 获取到四周的方块
            getBlock(num) {
                let arr = []
                if(num === 0){
                    arr = [num + 1, num + 30, num + 31]
                } else if (num === 29){
                    arr = [num - 1, num + 30, num + 29]
                } else if (num === 420){
                    arr = [num + 1, num - 30, num - 29]
                } else if (num === 449){
                    arr = [num - 1, num - 30, num - 31]
                } else if (num < 29){
                    arr = [num + 1, num - 1, num + 30, num + 31, num + 29]
                } else if (num > 420){
                    arr = [num + 1, num - 1, num - 30, num - 29, num - 31]
                } else if (num % 30 === 0){
                    arr = [num + 1, num - 30, num - 29, num + 30, num + 31]
                } else if (num % 30 === 29){
                    arr = [num - 1, num - 30, num - 31, num + 30, num + 29]
                } else {
                    arr = [num + 1, num - 1, num + 29, num + 30, num + 31, num - 30, num - 31, num - 29]
                }
                return arr
            }

            // 计时器
            setTime(){
                let t = document.getElementById('time')
                let s = t.innerText - 0
                this.timer = setInterval(() => {
                    s ++
                    t.innerText = s
                }, 1000)
            }

            // 失败
            fail (){
                let bool = confirm('踩到雷,失败了!')
                if(bool){
                    window.location.reload()
                }
            }

            // 成功
            victory (){
                alert('成功了!成功了!带成功!')
                clearInterval(this.timer)
                alert('你的生命减少了 ' + document.querySelector('#time').innerText + ' 秒')
            }

            // 右键事件
            conTextMenu () {
                this.item.addEventListener('contextmenu', (e) => {
                    e = e || window.event
                    let target = e.target || e.srcElement
                    try {e.preventDefault()} catch (err) {e.returnValue = false}
                    if(target.className === 'block'){
                        target.className = 'bomb'
                        this.flagList.add(parseInt(target.dataset.id))
                    } else if (target.className === 'bomb'){
                        target.className = 'block'
                        this.flagList.delete(parseInt(target.dataset.id))
                    }
                    if(this.flagList.size === this.bombNum) {
                        let flagAllBomb = this.bombList.every(item => {
                            return this.flagList.has(item)
                        })
                        if(flagAllBomb) {
                            this.victory()
                        }
                    }
                })
            }
        }

        let first = new sweep('#box')

    </script>
</body>
</html>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:07:38  更:2022-06-01 15:11:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:14:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码