jQ制作贪吃蛇(笨b写法)

第一个靠自己写的一个小游戏案例,比较粗糙

但功能都挺齐全的

效果图:

话不多说,直接上代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>贪吃蛇案例</title>
    <style>
        /*画面居中显示*/
        * {
            margin: 0;
            padding: 0;
            list-style: none;
            box-sizing: border-box;
        }

        .box {
            position: relative;
            width: 900px;
            height: 900px;
            margin: 20px auto;
            border: 1px solid #000;
        }

        .ipt {
            display: flex;
            justify-content: space-between;
            width: 200px;
            height: 40px;
            margin: 10px auto;
        }

        .ipt * {
            height: 40px;
            padding: 10px;
            border: none;
            cursor: pointer;
        }
    </style>
    <!--导入jQ库-->
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <!--编写主体代码-->
    <script>
        $(function () {
    // 地图的宽高
    var mapW = 900;
    var mapH = 900;
    // 小格子的宽高 相当于蛇头蛇身豆子的宽高
    var gridW = 45;
    var gridH = 45;


    // 有图片的自己可以搞图片上去,因本人没有图片,所以就直接用些圆和小格子代替了
    // 定义地图样式
    var mapObj = {
        width: mapW,
        height: mapH,
        display: 'flex',
        flexWrap: "wrap"
    };

    // 定义地图上小格子样式
    var gridObj = [{
        width: gridW, // 格子的宽高
        height: gridH,
        border: '1px solid #000' // 不喜欢看到小格子线这个样式可以去掉
    }, {
        num: (mapW / gridW) * (mapH / gridH) // 小格子的数量
    }];
    // 移动距离
    var step = gridW;

    // 定义相同样式
    var ys = {
        position: 'absolute',
        width: gridObj[0].width,
        height: gridObj[0].height,
        borderRadius: '50%'
    };

    // 定义蛇头初始化样式
    var snakeHys = {
        backgroundColor: 'red',
        zIndex: '999'
    };
    // 定义蛇身初始化样式
    var snakeBys = {
        backgroundColor: 'yellow'
    };
    // 豆子样式
    var beansYs = {
        backgroundColor: 'green'
    };
    // 定义位置
    var place = [
        {
            left: 2 * ys.width,
            top: 0
        }, {
            left: ys.width,
            top: 0
        }, {
            left: 0,
            top: 0
        }
    ];
    // 定义全局定时器
    var timer = null;
    // 节流
    var flag;
    // 定义蛇头禁止回头 默认向右走 87 68 83 65分别为上下右左
    var forbid = 68;
    // 定义游戏开始或结束
    var game = false;

    // 初始化地图
    map();
    // 初始化蛇
    snake();
    // 初始化豆子(食物)
    beans();


    // 监听开始按钮
    $('.start').on('click', function () {
        if (game) return alert('游戏已经开始');
        // 游戏开始变成true
        game = true;
        // 初始化移动
        // 等待一秒后开始
        setTimeout(function () {
            // 默认向右走
            move(68);
            // 游戏开始后监听键盘按键W/S/A/D
            // 监听键盘按键
            $(document).on('keyup', function (e) {
                if (flag == e.keyCode) {
                    return;
                }
                current = 0;
                flag = e.keyCode;
                move(e.keyCode);
            });
        }, 1000);

    });

    // 监听重置按钮
    $('.reset').on('click', function () {
        // 重置后结束游戏
        gameOve();
        // 重置后初始化地图
        map();
        // 重置后初始化位置
        place = [
            {
                left: 2 * ys.width,
                top: 0
            }, {
                left: ys.width,
                top: 0
            }, {
                left: 0,
                top: 0
            }
        ];
        // 重置后初始化蛇
        snake();
        // 重置后初始化豆子(食物)
        beans();
    });

    // 定义控制暂停/继续控件  0表示暂停 1表示继续
    // 前提条件:必须是游戏开始中才会执行
    var current = 0;


    // 监听暂停/继续按钮
    $('.toggle').on('click', function () {
        if (!game) return alert('请先开始游戏');
        if (current == 0) {
            clearInterval(timer);
            current = 1;
        } else if (current == 1) {
            move(forbid);
            current = 0;
        }
    });


    // 判断游戏结束
    function gameOve() {
        $(document).off();
        // 游戏开始变成false
        game = false;
        flag = '';
        clearInterval(timer);
        return alert('最终蛇的长度为' + place.length);
    }

    // 移动
    function move(key) {
        if (key != 87 && key != 83 && key != 65 && key != 68) return;
        clearInterval(timer);
        timer = setInterval(function () {
            // 判断鼠标按下哪个键
            // W
            if (key == 87) {
                // 如果运动方向和之前方向相反,则继续往之前方向运动
                if (forbid == 83) {
                    snakeBData();
                    place[0].top += step;
                } else {
                    snakeBData();
                    place[0].top -= step;
                    forbid = 87;
                }

            } else if (key == 83) { // s
                if (forbid == 87) {
                    snakeBData();
                    place[0].top -= step;
                } else {
                    snakeBData();
                    place[0].top += step;
                    forbid = 83;
                }
            } else if (key == 65) { // a
                if (forbid == 68) {
                    snakeBData();
                    place[0].left += step;
                } else {
                    snakeBData();
                    place[0].left -= step;
                    forbid = 65;
                }
            } else if (key == 68) { // d
                if (forbid == 65) {
                    snakeBData();
                    place[0].left -= step;
                } else {
                    snakeBData();
                    place[0].left += step;
                    forbid = 68;
                }
            }
            // 判断蛇是否到达边界
            if (place[0].left > mapW - gridW) {
                place[0].left = mapW - gridW;
                return clearInterval(timer);
            } else if (place[0].left < 0) {
                place[0].left = 0;
                return clearInterval(timer);
            } else if (place[0].top > mapW - gridW) {
                place[0].top = mapW - gridW;
                return clearInterval(timer);
            } else if (place[0].top < 0) {
                place[0].top = 0;
                return clearInterval(timer);
            }
            // 判断蛇有没有吃到豆子
            if (place[0].left == $('.beans').position().left && place[0].top == $('.beans').position().top) {
                $('.beans').remove();
                var data = {};
                $('.snake').append($('.snakeB').eq(place.length - 2).clone(true));
                place.push(data);
                beans();
            }
            $('.snakeH').css(place[0]);
            $.each($('.snakeB'), function (i, item) {
                $(item).css(place[i + 1])
            });
            // 判断游戏结束
            for (let i = 1; i < place.length; i++) {
                // 判断蛇头有没有吃到自己的身体
                if (place[0].left == place[i].left && place[0].top == place[i].top) {
                    gameOve();
                    alert('你吃到了自己');
                }
            }
        }, 120);
    }

    // 改变蛇身数值
    function snakeBData() {
        for (let i = place.length - 1; i >= 1; i--) {
            place[i].left = place[i - 1].left;
            place[i].top = place[i - 1].top;
        }
    }

    // 随机数
    function random() {
        return Math.floor(Math.random() * (mapW / gridW));
    }

    // 豆子
    function beans() {
        var x = random();
        var y = random();
        // 创建豆子
        var beans = '<div class="beans"></div>';
        $('.box').append(beans);
        $('.beans').css(beansYs).css(ys).css({
            left: x * gridW,
            top: y * gridW
        })

    }


    // 地图
    function map() {
        // 添加地图
        var mapO = '<ul class="map"></ul><div class="snake"></div>';
        $('.box').html(mapO);
        $('.map').css(mapObj);
        // 添加地图上的小格子
        var grid = '';
        for (let i = 0; i < gridObj[1].num; i++) {
            grid += '<li class="grid"></li>';
        }
        $('.map').html(grid);
        $('.grid').css(gridObj[0]);
    }


    // 蛇
    function snake() {
        // 先清空蛇里面的东西
        $('.snake').empty();
        // 创建蛇头和蛇身
        var snakeH = '<div class="snakeH"></div>';
        $('.snake').append(snakeH);
        $('.snakeH').css(place[0]).css(snakeHys).css(ys);
        for (let i = 0; i < place.length - 1; i++) {
            var snakeB = '<div class="snakeB"></div>';
            $('.snake').append(snakeB);
        }
        $('.snakeB').css(snakeBys).css(ys);
        $.each($('.snakeB'), function (i, item) {
            $(item).css(place[i + 1])
        })
    }

});

    </script>
</head>
<body>
<!--按钮-->
<div class="ipt">
    <button class="start">开始</button>
    <button class="reset">重置</button>
    <button class="toggle">暂停/继续</button>
</div>
<div class="box">
    <!--蛇-->
    <div class="snake">
    </div>
</div>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值