贪吃蛇

作者: 升龙无涯 | 来源:发表于2021-09-01 11:57 被阅读0次

    贪吃蛇效果:


    贪吃蛇

    键盘的w、s、a、d分别来控制蛇移动方向:上、下、左、右
    js代码:

    // 创建地图
    var map = document.createElement('div')
    // 设置样式
    setStyle(map,{
        width:"800px",
        height:"500px",
        border:"3px solid #000",
        position:"relative",
        backgroundColor:"#eee"   
    })
    // 将地图放入body中
    document.body.appendChild(map)
    // 创建食物
    var food = createFood()
    function createFood(){
        var div = document.createElement('div')
        // 设置样式
        setStyle(div,{
            width:"10px",
            height:"10px",
            backgroundColor:"#0f0",
            position:"absolute",
            // 因为蛇是一次移动10px,所以left和top是随机的,但是必须保证是10的倍数
            left:parseInt(getRandom(map.clientWidth - 10)/10)*10 + 'px',
            top:parseInt(getRandom(map.clientHeight - 10)/10)*10 + 'px',
        })
        // 将食物放在地图中
        map.appendChild(div)
        return div
    }
    // 定义蛇的身体的坐标
    var body = [
        {
            x:0,
            y:0
        },
        {
            x:10,
            y:0
        },
        {
            x:20,
            y:0
        },
    ]
    // 根据蛇的身体坐标显示蛇的身体
    show()
    function show(){
        for(var i=0;i<body.length;i++){
            var div = document.createElement('div')
            setStyle(div,{
                width:"10px",
                height:"10px",
                backgroundColor:"blue",
                position:"absolute",
                left:body[i].x + 'px',
                top:body[i].y + 'px'
            })
            // 给蛇身体div设置类名
            div.className = 'snake';
            // 蛇头的特殊样式
            if(i === body.length-1){
                div.style.borderRadius = '50%';
                div.style.backgroundColor = 'red';
            }
            // 将蛇的身体放进地图中
            map.appendChild(div)
        }
    }
    // 定义蛇的默认移动方向
    var direction = 'right';
    // 设置键盘事件更改移动方向
    document.onkeydown = function(){
        var e = window.event;
        // 通过键盘码获取到当前按下的键的字符
        var keycode = e.keyCode || e.which;
        var word = String.fromCharCode(keycode).toLowerCase()
        switch(word){
            case 'a':
                direction = 'left';
            break;
            case 'w':
                direction = 'up';
            break;
            case 'd':
                direction = 'right';
            break;
            case 's':
                direction = 'down';
            break;
        }
    }
    // 让蛇根据方向移动身体
    var timerId = setInterval(function(){
        // 将之前的身体删除 - 创建新的身体
        var snakes = document.querySelectorAll('.snake');
        if(snakes.length){
            for(var i=0;i<snakes.length;i++){
                map.removeChild(snakes[i])
            }
        }
        // 修改身体坐标 - 除了蛇头的坐标外,其他身体的坐标是前一节身体的坐标
        for(var i=0;i<body.length-1;i++){
            body[i].x = body[i+1].x;
            body[i].y = body[i+1].y;
        }   
        // 根据移动方向修改蛇头的坐标
        switch(direction){
            case 'up':
                body[body.length-1].y -= 10
            break;
            case 'down':
                body[body.length-1].y += 10
            break;
            case 'left':
                body[body.length-1].x -= 10
            break;
            case 'right':
                body[body.length-1].x += 10
            break;
        }
        // 根据新的坐标重新显示身体
        show()
        // 移动过程判断是否吃到食物
        eat()
        // 移动过程判断是否死亡
        die()
    },500)
    // 蛇死亡
    function die(){
        // 蛇头撞墙
        if(body[body.length-1].x<0 || body[body.length-1].x>map.clientWidth-10 || body[body.length-1].y<0 || body[body.length-1].y>map.clientHeight-10){
            alert('GAME OVER')
            // 清除定时器
            clearInterval(timerId)
        }
        // 蛇头撞自己身体
        for(var i=0;i<body.length-1;i++){
            if(body[i].x===body[body.length-1].x && body[i].y===body[body.length-1].y){    
                alert('GAME OVER')
                // 清除定时器
                clearInterval(timerId)
            }
        }
    }
    // 蛇吃到食物
    function eat(){
        // 如果蛇头的坐标跟食物的坐标完全重叠就表示吃到了食物
        if(body[body.length-1].x === food.offsetLeft && body[body.length-1].y === food.offsetTop){
            // 删除食物
            map.removeChild(food)
            // 蛇的身体增加一节
            body.unshift({
                x:body[0].x,
                y:body[0].y
            })
            // 重新创建食物
            food = createFood()
        }
    }
    // 获取随机数的函数
    function getRandom(a,b=0){
        var max = a;
        var min = b;
        if(a<b){
            max = b;
            min = a;
        }
        return Math.floor(Math.random() * (max - min)) + min;
    }
    // 设置样式的函数
    function setStyle(ele, styleObj){
        for(var attr in styleObj){
            ele.style[attr] = styleObj[attr];
        }
    }
    

    相关文章

      网友评论

          本文标题:贪吃蛇

          本文链接:https://www.haomeiwen.com/subject/gdyxwltx.html