js jquery 扫雷简单实现

简介

耗时大半天写完
只是非常简单的实现 一些功能没有添加

遇到的不会知识点

写后记录 没有顺序 真正比这多 因为浏览器的js jQuery手册就灭关过

  • 方法参数中传递方法
  • 判断二维数组是否存在一个数组
  • class的删除和添加 addClass() removeClass()
  • 鼠标右击事件 .contextmenu() 需要关闭默认e.preventDefault()
  • .forEach() 跳出循环.还是不会…

遇到的问题

因为是写完了总结 无顺序 而且有的想不到了

  • 点击到雷后显示所有雷,每次总少显示一个雷 原因:未知 按逻辑原本也是可以的 但是改了现在的写法可以
  • 点击到空白时候显示周围的格子,进入点击事件进入死循环 原因:加入无效列表位置放的不对
  • judge()方法中有两个f()忘写arr
  • judge()方法一开始是直接写在生成数字里面的,但是当写到空白格显示时也需要几乎相等的边缘判断,所以进行了封装,当时还不会方法参数中传方法
  • 好几次因为判断写的不生效,导致判断内的的代码无效,如 有个判断 二维数组.includes(数组) 无效 又封装了一个isExist()方法
  • jquery 的选择器中使用变量传值,依旧没学会.使用了比较麻烦的方法. 如:点击到空白时需要得到周围八个.atom的元素对象
  • 鼠标右击事件判断class时 少写了atom

代码

<!DOCTYPE html>
<html lang="zh_CN">
<head>
    <meta charset="UTF-8">
    <title>扫雷</title>
    <script src="js/jquery-3.6.0.js"></script>
</head>

<style>
    .background {
        position: relative;
        left: 50%;
        transform: translateX(-50%);
        margin-top: 10px;
        width: 225px;
        height: 225px;
        border: 6px solid #c2c2c2;
        /*background-color: #828282;*/
    }

    .row {
        height: 25px;
    }

    .atom {
        float: left;
        width: 25px;
        height: 25px;
    }

    .blank {
        background: url("data:img/gif;base64,R0lGODlhGQAZAKIAAM7OzsbGxr6+vra2trKysqampoKCggAAACH5BAAHAP8ALAAAAAAZABkAAANHaLrc3mWQSau9xAwQuv9gGBhEIJxoqq4CabLw6sY0Otf0jcP6Lpc+HjD4exFTvWNrqDwlj09iNDj1VXdXXLa2zTGb3VgYlgAAOw==");
    }

    .landmine {
        background: url("data:img/gif;base64,R0lGODlhGQAZAJEAAP///76+voKCggAAACH5BAAHAP8ALAAAAAAZABkAAAJglI+py70Bo5wUmhrHwPFyzVlCCIYeBGqqik5nkK4s7I6TjFOvCvR42bGhND3AbyPZEX2/GuwILV2iUZGEOgtesUhthuu8VcNbqE74fOZoSTQFiHm9u3G3OBSQ4yv6/aQAADs=");
    }

    .eLandmine {
        background: url("data:img/gif;base64,R0lGODlhGQAZAJEAAP///4CAgP8AAAAAACH5BAQUAP8ALAAAAAAZABkAAAJgjI+py70Co5wUmhrHwPFyzVlBCIYeBGqqik6nkK4s7I6TjFOvCvR42bGhND3AbyPZEX2/GuwILV2iUZGEOgtesUhthuu8VcNbqE74fOZoSTQFiHm9u3G3OCSQ4yv6/aQAADs=");
    }

    .barrier {
        background: url("data:img/gif;base64,R0lGODlhGQAZAJEAAP///8DAwICAgAAAACH5BAQUAP8ALAAAAAAZABkAAAJKhI+pFrH/GpwnCFGb3nxfzHQi92XjWYbnmAIrepkvGauzV7s3Deq71vrhekJgrtgIIpVFptD5g+6kN+osZflot9xPsgvufsPkSwEAOw==");
    }

    .flag {
        background: url(data:img/gif;base64,R0lGODlhGQAZAKIAAP///8DAwICAgP8AAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAAAZABkAAANsCLrcriG8OSO9KwiRo//gt3FQaIJjZw7DmZYh25ovEMtzWH+47G6qno8GhAWEOVTRBur9SMxbUrQ8BQiEpyqE1RpBXSLUGtZVI9i0Wu3ZodfwbMR9ja/bZ6s3qjeTNCOBgoMjc4SHhIaIixsJADs=);
    }

    .num1 {
        background: url("data:img/gif;base64,R0lGODlhGQAZAJEAAMDAwICAgAAA/wAAACH5BAAHAP8ALAAAAAAZABkAAAJMjI+py70Ao5wUmorxzTxuLIRC9lFiSAbZOWqqybZVCcWoC8fpeu5gj/uJfBUWMXebvYpAJdJGoQFsTc8yQh1OpJ3otesEH8XbLzlSAAA7");
    }

    .num2 {
        background: url(data:img/gif;base64,R0lGODlhGQAZALMAAMDAwKu5q6i4qKW3pZy0nJaylpCwkIquioCAgACAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAAAZABkAAAReEMlJq704X8C7/yAnhSQ5lmh3cknrvi64wvT7zXV9I50N+ipeihXzrFACoEhYMtB2pSSsIGN6CrRBIHQEEGjb0pEmGOJch+Gyl3samW13kB0vztViKx665+r7a4AfEQA7);
    }

    .num3 {
        background: url(data:img/gif;base64,R0lGODlhGQAZAJEAAMDAwICAgP8AAAAAACH5BAQUAP8ALAAAAAAZABkAAAJOjI+py70Ao5wUmorxzTxuIITiOFIfiZbSmabT16le0EWyRdeg+OZTGzL5JECBsFI86m4AGIfpzEB9RVLPVuWtqFnjVZeJgmdjzbBMRk8KADs=);
    }

    .num4 {
        background: url(data:img/gif;base64,R0lGODlhGQAZAJEAAMDAwICAgAAAmQAAgCH5BAAHAP8ALAAAAAAZABkAAAJdjI+py70Ao5wUmorxzTzuOgjAQJLUN5FiaU5oVK7sGVAxxA50Gor47KrBVJLc7hfilY6jnHMp+TynwYjgisXmfB4hx1jtgKPezLjbaULJ6bOlnK684mG6HG5H5ykFADs=);
    }

    .num5 {
        background: url(data:img/gif;base64,R0lGODlhGQAZAJEAAMDAwICAgIAAAAAAACH5BAQUAP8ALAAAAAAZABkAAAJOjI+py70Ao5wUmorxzTxuIITiSE4fiY5mEKXu2oodDKmzx9bybeWgW6L9gDZcjLgz3oo9HhPw6TxPyGRTVxUIs1ohjxL9SsLia3nsO0MKADs=);
    }

    .num6 {
        background: url(data:img/gif;base64,R0lGODlhGQAZAJEAAMDAwICAgACAgAAAACH5BAQUAP8ALAAAAAAZABkAAAJTjI+py70Ao5wUmorxzTxuKITiKFIfiZbTmaJmEI3dCoPqbNWAjOdxS3r9gDyPjhiUsEKVos/GpDgBS0Hz9twhsdTjNmqUfIU9ja5MQ1c+6nBbUgAAOw==);
    }

    .num7 {
        background: url(data:img/gif;base64,R0lGODlhGQAZAJEAAL6+voKCggAAAAAAACH5BAAHAP8ALAAAAAAZABkAAAJMjI+py70Ao5wUmorxzTxuIITiSE4fiY5mEKXu2rUiHIOz9HElznY771NRcpQfrWI8TpJK2S1DtD2hPWeoRhTGojVgV1P9NsWWMBlSAAA7);
    }

    .num8 {
        background: url(data:img/gif;base64,R0lGODlhGQAZAIAAAMDAwICAgCH5BAQUAP8ALAAAAAAZABkAAAJKjI+py70Ao5wUmorxzTxu63xeMIYi8JnHlK4UwpLgOctjaUuwnqtvb/rxQsJaZXcz/k4tGsqVfPp4OCK1yih2OM7t1avJgWNjTAEAOw==);
    }

</style>
<body>
<div class="background">
</div>
<script>
	//记录点击后的数组 左击后的再点击无效
    var invalid = new Array();
    //记录地雷位置
    var landmine = new Array();
    //记录每一个atom中的数字 key:位置数组[.row索引,.atom索引]
    var number = new Map();
    var gameOver = false;

    //生成盒子 并且遮罩
    for (var i = 0; i < 9; i++) {
        $('.background').prepend('<div class="row"></div>')
        for (var j = 0; j < 9; j++) {
            var r = 8 - i;
            $('.row:eq(0)').append('<div id="' + r + ',' + j + '" class="atom barrier"></div>')
        }
    }

    //0~8的随机数
    function random() {
        return Math.floor(Math.random() * 9);
    }

    //生成10个地雷
    while (landmine.length < 10) {
        var flag = true;
        var row = random();
        var col = random();
        var len = landmine.length;
        if (len !== 0) {
            for (var i = 0; i < landmine.length; i++) {
                var r = landmine[i][0];
                var c = landmine[i][1];
                if (r === row && c === col) {
                    flag = false;
                }
            }
        }
        if (flag) {
            landmine.push([row, col]);
        }
    }

    //判断一个数组是否存在于一个二维数组 arr1:二维数组 
    function isExist(arr1, arr2) {
        for (var i = 0; i < arr1.length; i++) {
            if (arr1[i].toString() === arr2.toString()) {
                return true;
            }
        }
    }

    //生成数字
    for (var i = 0; i < 9; i++) {
        for (var j = 0; j < 9; j++) {
            //判断如果是雷直接跳出循环;
            if (isExist(landmine, [i, j])) {
                continue;
            }
            //判断是否顶行或低行
            var num = 0;
            judge(i, j, function () {
                num++;
            })
            number.set([i, j], num);
        }
    }

    //判断是否挨边 i:.row索引 j:.atom索引 f:实行的函数 ju:判断是生成数字使用还是点击空白格显示使用
    function judge(i, j, f, ju) {
        if (ju === undefined) {
            ju = true;
        }
        var a = [
            [i - 1, j - 1], [i - 1, j], [i - 1, j + 1],
            [i, j - 1], [i, j], [i, j + 1],
            [i + 1, j - 1], [i + 1, j], [i + 1, j + 1],
        ];
        //判断是否顶行或低行
        if (i === 0) {
            //判断是否左列或右列
            if (j === 0) {
                if (ju) {
                    if (isExist(landmine, a[5])) {
                        f();
                    }
                    if (isExist(landmine, a[7])) {
                        f();
                    }
                    if (isExist(landmine, a[8])) {
                        f();
                    }
                } else {
                    var arr = [a[5], a[7], a[8]];
                    f(arr);
                }

            } else if (j === 8) {
                if (ju) {
                    if (isExist(landmine, a[3])) {
                        f();
                    }
                    if (isExist(landmine, a[6])) {
                        f();
                    }
                    if (isExist(landmine, a[7])) {
                        f();
                    }
                } else {
                    var arr = [a[3], a[6], a[7]];
                    f(arr);
                }

            } else {
                if (ju) {
                    a.forEach(function (value, index) {
                        if (value[0] !== i - 1) {
                            if (isExist(landmine, a[index])) {
                                f();
                            }
                        }
                    });
                } else {
                    var arr = [a[3], a[5], a[6], a[7], a[8]]
                    f(arr);
                }
            }
        } else if (i === 8) {
            if (j === 0) {
                if (ju) {
                    if (isExist(landmine, a[1])) {
                        f();
                    }
                    if (isExist(landmine, a[2])) {
                        f();
                    }
                    if (isExist(landmine, a[5])) {
                        f();
                    }
                } else {
                    var arr = [a[1], a[2], a[5]];
                    f(arr);
                }
            } else if (j === 8) {
                if (ju) {
                    if (isExist(landmine, a[0])) {
                        f();
                    }
                    if (isExist(landmine, a[1])) {
                        f();
                    }
                    if (isExist(landmine, a[3])) {
                        f();
                    }
                } else {
                    var arr = [a[0], a[1], a[3]];
                    f(arr);
                }
            } else {
                if (ju) {
                    a.forEach(function (value, index) {
                        if (value[0] !== i + 1) {
                            if (isExist(landmine, a[index])) {
                                f();
                            }
                        }
                    });
                } else {
                    var arr = [a[0], a[1], a[2], a[3], a[5]]
                    f(arr);
                }
            }
        } else {
            if (ju) {
                a.forEach(function (value, index) {
                    if (isExist(landmine, a[index])) {
                        f();
                    }
                });
            } else {
                f(a);
            }
        }
    }


    //左击事件
    $('.atom').click(function () {
        //判断游戏是否已经结束
        if (gameOver) {
            return;
        }
        //判断是否失效了
        var r = $(this).parent().index();
        var c = $(this).index();
        if (isExist(invalid, [r, c])) {
            return;
        }
        //判断是否是旗子
        var fl = $(this).attr('class');
        if (fl === 'atom flag') {
            return;
        }
        //添加失效
        invalid.push([r, c]);
        $(this).removeClass('barrier');
        //判断是否是雷 如果是雷 显示所有雷 并结束游戏
        if (isExist(landmine, [r, c])) {
            landmine.forEach(function (value) {
                console.log('l');
                var lr = value[0];
                var lc = value[1];
                var rows = $('.row');
                var atoms = $(rows[lr]).children();
                $(atoms[lc]).removeClass('barrier').addClass('landmine');
            })
            //修改前 这句在第一句,然后遍历landmine数组,排除于r,c相等的,但是会少显示一个雷,不知道原因.
            $(this).removeClass('landmine').addClass('eLandmine');
            gameOver = true;
        } else {
            //判断是否是数字
            var num = 0;
            number.forEach(function (value, key) {
                var k = key.toString();
                var ke = r + ',' + c;
                if (k === ke) {
                    num = value;
                }
            })
            switch (num) {
                case 0:
                    $(this).addClass('blank');
                    judge(r, c, function (arr) {
                        arr.forEach(function (value) {
                            var r = value[0];
                            var c = value[1];
                            var rows = $('.row');
                            var atoms = $(rows[r]).children();
                            if (!isExist(invalid, [r, c])) {
                                $(atoms[c]).trigger('click');
                            }
                        });
                    }, false);
                    break;
                case 1:
                    $(this).addClass('num1');
                    break;
                case 2:
                    $(this).addClass('num2');
                    break;
                case 3:
                    $(this).addClass('num3');
                    break;
                case 4:
                    $(this).addClass('num4');
                    break;
                case 5:
                    $(this).addClass('num5');
                    break;
                case 6:
                    $(this).addClass('num6');
                    break;
                case 7:
                    $(this).addClass('num7');
                    break;
                case 8:
                    $(this).addClass('num8');
                    break;
            }
        }
        //判断游戏是否结束
        console.log(invalid)
        if (invalid.length === 71) {
            gameOver=true;
            alert('恭喜');
        }
    })

    //右击事件
    $('.atom').contextmenu(function (e) {
        e.preventDefault();//关闭默认 也就是菜单
        var c = $(this).attr('class');
        if(c==='atom barrier'){
            $(this).removeClass('barrier').addClass('flag');
        }else{
            $(this).removeClass('flag').addClass('barrier');
        }
    })
</script>

</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值