简易贪吃蛇

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            overflow: hidden;
        }
        .board {
             600px;
            height: 600px;
            background: silver;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
        }
        .snake div {
             30px;
            height: 30px;
            background: black;
            border-radius: 5px;
            position: absolute;
        }
        .snake .head {
            background: green;
            left: 90px;
            z-index: 2;
        }
        .snake div:nth-of-type(2) {
            left: 60px;
        }
        .snake div:nth-of-type(3) {
            left: 30px;
        }
        .snake div:nth-of-type(4) {
            left: 0px;
        }
        .food {
             30px;
            height: 30px;
            background-image: url(shit.jpg);
            background-size: 100%;
            position: absolute;
        }
    </style>
</head>
<body>
    <button>快的</button>
    <button>慢的</button>
    <!-- <div class="food"></div> -->
    <div class="board">
        <div class="snake">
            <div class="head"></div>
            <div class="body"></div>
            <div class="body"></div>
            <div class="body"></div>
        </div>
    </div>
    <script>
        var moveId;
        var head = document.querySelector('.head');
        var speed = 30;
        var move_dir = 'down';
        var key_dir = 'down';
        function move(interval) {
            clearInterval(moveId)
            moveId = setInterval(function () {
                //移动蛇身体
                var body = document.querySelectorAll('.snake div');
                for (var i = body.length - 1; i > 0; i--) {
                    body[i].style.left = body[i - 1].offsetLeft + 'px'
                    body[i].style.top = body[i - 1].offsetTop + 'px'
                }
                if (key_dir === 'left' && move_dir === 'right' ||
                    key_dir === 'up' && move_dir === 'down' ||
                    key_dir === 'right' && move_dir === 'left' ||
                    key_dir === 'down' && move_dir === 'up'
                ) {
                    //do nothing
                } else {
                    move_dir = key_dir;
                }
                //移动蛇头
                var currentX = head.offsetLeft;
                var currentY = head.offsetTop;
                //有一个分支,来决定蛇的移动方向
                if (move_dir === 'right') {
                    head.style.left = currentX + speed + 'px'
                } else if (move_dir === 'left') {
                    head.style.left = currentX - speed + 'px'
                } else if (move_dir === 'up') {
                    head.style.top = currentY - speed + 'px'
                } else {
                    //down
                    head.style.top = currentY + speed + 'px'
                }
                die();
                eat();
            }, interval)
        }
        move(500)
        createFood();
        var KEY_CODE = {
            KEY_LEFT: 37,
            KEY_UP: 38,
            KEY_RIGHT: 39,
            KEY_DOWN: 40,
            KEY_W: 87
        }
        window.onkeydown = function (evt) {
            //evt.keyCode
            console.log(evt.which)
            switch (evt.which) {
                case KEY_CODE.KEY_LEFT:
                    // if (move_dir === 'right') {
                    //     return;
                    // }
                    key_dir = 'left'
                    break;
                case KEY_CODE.KEY_RIGHT:
                    // if (move_dir === 'left') {
                    //     return;
                    // }
                    key_dir = 'right'
                    break;
                case KEY_CODE.KEY_UP:
                case KEY_CODE.KEY_W:
                    // if (move_dir === 'down') {
                    //     return;
                    // }
                    key_dir = 'up'
                    break;
                case KEY_CODE.KEY_DOWN:
                    // if (move_dir === 'up') {
                    //     return;
                    // }
                    key_dir = 'down'
                    break;
                default:
                    break;
            }
        }
        function createFood() {
            var food = document.createElement('div');
            food.className = 'food'
            var types = ['poison', 'poison', 'poison', 'normal']
            var type = types[Math.floor(Math.random() * types.length)]
            // console.log(type)
            food.setAttribute('type', type)
            //食物的位置范围为:0-570
            var x = Math.floor(Math.random() * 571);
            var y = Math.floor(Math.random() * 571);
            //保证x,y是30的整数倍
            x = Math.floor(x / 30) * 30
            y = Math.floor(y / 30) * 30
            //TODO:保证食的位置不在蛇的身体上
            food.style.left = x + 'px'
            food.style.top = y + 'px'
            document.querySelector('.board').appendChild(food)
        }
        function eat() {
            var head = document.querySelector('.head');
            var food = document.querySelector('.food');
            if (head.offsetLeft === food.offsetLeft && head.offsetTop === food.offsetTop) {
                //吃。
                // food.style.backgroundColor = 'green';
                document.querySelector('.snake').appendChild(food);
                food.className = 'body';
                if (food.getAttribute('type') === 'poison') {
                    move(100);
                    setTimeout(function () {
                        move(500)
                    }, 5 * 1000)
                }
                createFood();
            }
        }
        function die() {
            var head = document.querySelector('.snake .head');
            var body = document.querySelectorAll('.snake .body');
            for(var i=0; i<body.length; i++) {
                if(head.offsetLeft === body[i].offsetLeft && head.offsetTop === body[i].offsetTop) {
                     location.reload();
                }
            }
        }
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/plmmq/p/11707818.html