前端小游戏 扫雷

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>扫雷</title>
    <style>
        div {
            margin: 100px auto 0;
        }

        p {
            text-align: center;
            font-size: 20px;
            font-weight: 600;

        }

        a {
            cursor: pointer;
            padding: 10px;
            border: 3px red solid;
            color: black;
            text-decoration: none;
        }

        ul {
            margin: 0px auto 100px;
            /* width: 540px; */
        }

        li {
            float: left;
            list-style: none;
            width: 50px;
            height: 50px;
            border: 1px solid black;
            margin: 2px;
            box-sizing: border-box;
            text-align: center;
            line-height: 50px;
            font-size: 20px;
        }

        li:hover {
            cursor: pointer;
            background: #00f;
        }
    </style>
</head>
<body oncontextmenu="self.event.returnValue=false">
    <div>
        <p><a id="a">重新开始</a></p>
    </div>
    <ul></ul>
    <script>
        let a = document.getElementById('a')
        a.onclick = () => {
            location.reload()
        }
    </script>
    <!-- 禁止右键菜单栏 -->
    <script>
        const row = 10; //行数
        const col = 10; //列数
        const maxCount = 10; //最大地雷数量
        let isFirstOpen = true; //第一次打开方格生成雷
        let ul = document.getElementsByTagName('ul')[0]
        let grid = init_grid(); //初始化
        const winCount = row * col - maxCount //需要胜利的打开格子全部数量
        let wincount = 0; //当前打开格子的数量

        ul.style.width = `${row * 54}px`

        function init_grid() {
            let gridHtml = ''
            for (let i = 0; i < row; i++) {
                for (let j = 0; j < col; j++) {
                    gridHtml += `<li onmousedown="Click(${i},${j},event)"></li>`
                }
            }

            ul.innerHTML = gridHtml
        }

        let li = document.getElementsByTagName('li')
        for (let i = 0; i < row * col; i++) {
            li[i].count = 0;
        }

        function Click(i, j, e) {
            console.log(i, j, e.button)

            //判断方格有没有打开过
            if (li[i * 10 + j].isOpen) {
                // console.log(1);
                return
            }

            //第一次打开方格
            if (isFirstOpen) {
                isFirstOpen = false

                //生成雷
                let l = 0
                while (l < maxCount) {

                    let ri = Math.floor(Math.random() * row);
                    let rj = Math.floor(Math.random() * col);

                    if (!li[ri * 10 + rj].isMine) {
                        // console.log(li[ri * 10 + rj]);
                        li[ri * 10 + rj].isMine = true;
                        // li[ri * 10 + rj].innerHTML = "雷"
                        l++
                        // let count = 0;
                        //计算非雷方格九宫格周围的雷数
                        for (let i = ri - 1; i < ri + 2; i++) {
                            for (let j = rj - 1; j < rj + 2; j++) {
                                console.log(!li[ri * 10 + rj].isMine);
                                if ((i > -1 && j > -1 && i < row && j < col) || !li[ri * 10 + rj].isMine) {
                                    //计雷数+1
                                    li[i * 10 + j].count++;
                                }
                            }
                        }
                    }
                }

            }
            //鼠标左键打开方格
            if (e.button === 0) {
                // 打开方格 

                if (li[i * 10 + j].innerHTML === '▲') return
                if (li[i * 10 + j].isMine) {
                    alert('游戏结束')
                    for (let n = 0; n < row * col; n++)
                        if (li[n].isMine) {
                            li[n].innerHTML = "雷"

                        }
                    return
                }

                openGrid(i, j)

                function openGrid(i, j) {

                    wincount++
                    if (wincount === winCount) {
                        alert("胜利")
                    }

                    let b = li[i * 10 + j]
                    b.style.background = "#ddd"
                    b.isOpen = true
                    // console.log(b.isOpen);
                    // console.log(b.isMine);
                    if (b.count === 0) {
                        for (let n = i - 1; n < i + 2; n++) {
                            for (let m = j - 1; m < j + 2; m++) {
                                if (n > -1 && m > -1 && n < row && m < col && !li[n * 10 + m].isMine && !li[n * 10 + m].isOpen) {
                                    // console.log('aaa');
                                    openGrid(n, m)
                                }
                            }
                        }
                    } else {
                        b.innerHTML = b.count
                    }
                }


                // console.log(1);
            }
            //鼠标右键打开方格
            if (e.button === 2) {
                let b = li[i * 10 + j];
                if (b.innerHTML !== '▲') {
                    b.innerHTML = '▲';
                } else {
                    b.innerHTML = '';
                }
            }

        }

    </script>
</body>
</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值