js实现贪吃蛇

此贪吃蛇小项目是只用js开发的,在学习它的过程中,刷新了我对前后端的认知,我单纯的以为前端做的只是页面,没想到也能实现这么多功能,主要完成功能有:创建画布-创建蛇头和食物-蛇头移动-按下上下左右键进行改变方向-蛇头与食物重合食物重新刷新位置-吃到食物身体自动增加-身体跟随前一个进行移动-死亡条件等等。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>贪吃蛇</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        #map{
            width: 500px;
            height: 500px;
            background-color: #6495ED;
            position:relative
        }
        table{
            position: absolute;
            top: 64px;
            left: 0;
        }
        td{
            width: 48px;
            height: 48px;
        }
    </style>
</head>
<body>
    <h1 id="score">Score:0</h1>
    <button id="bt1">快</button>
    <button id="bt2">中</button>
    <button id="bt3">慢</button>
    <div id="map">

    </div>
    <script>
        var s=0
        var sc=document.getElementById("score")
        document.write("<table border='1' cellspacing='0'")
            for(var n=0;n<10;n++){
                document.write("<tr>")
                    for(var j=0;j<10;j++)
                        document.write("<td></td>")
                    document.write("</tr>")
            }
        document.write("</table>")

        // 创建div随机位置,函数实现
        function createDiv(color){
            var div=document.createElement("div")
            div.style.width="50px"
            div.style.height="50px"
            div.style.backgroundColor=color
            // 设置位置随机出现
            div.style.position="absolute"
            div.style.left=parseInt(Math.random()*10)*50+"px"
            div.style.top=parseInt(Math.random()*10)*50+"px"
            var map=document.getElementById("map")
            map.appendChild(div)
            return div

            // // 创建蛇头
            // var headNode=document.createElement("div")
            // headNode.style.width="50px"
            // headNode.style.height="50px"
            // headNode.style.backgroundColor="red"
            // // 设置位置随机出现
            // headNode.style.position="absolute"
            // headNode.style.left=parseInt(Math.random()*10)*50+"px"
            // headNode.style.top=parseInt(Math.random()*10)*50+"px"
            // var map=document.getElementById("map")
            // map.appendChild(headNode)
            // // 蛇尾
            // var footNode=document.createElement("div")
            // footNode.style.width="50px"
            // footNode.style.height="50px"
            // footNode.style.backgroundColor="yellow"
            // footNode.style.position="absolute"
            // footNode.style.left=parseInt(Math.random()*10)*50+"px"
            // footNode.style.top=parseInt(Math.random()*10)*50+"px"
            // var map=document.getElementById("map")
            // map.appendChild(footNode)
        }

        var headNode=createDiv("red")
        var footNode=createDiv("blue")
        // 规定一个蛇头方向
        headNode.dirtion="左"
        var bodyNode=[]
        var t
        var bt1=document.getElementById("bt1")
        bt1.onclick=function(){
            window.t=setInterval(function(){
                if(bodyNode.length>0){
                    // 循环跟随
                    for(var n=bodyNode.length-1;n>=0;n--){
                        switch(bodyNode[n].dirtion){
                            case "左":
                                var l=parseInt(bodyNode[n].style.left)
                                bodyNode[n].style.left=l-50+"px"
                            break
                            case "右":
                                var l=parseInt(bodyNode[n].style.left)
                                bodyNode[n].style.left=l+50+"px"
                            break
                            case "上":
                                var l=parseInt(bodyNode[n].style.top)
                                bodyNode[n].style.top=l-50+"px"
                            break
                            case "下":
                                var l=parseInt(bodyNode[n].style.top)
                                bodyNode[n].style.top=l+50+"px"
                            break
                        }
                        if(n==0){
                            bodyNode[n].dirtion=headNode.dirtion
                        }else{
                            bodyNode[n].dirtion=bodyNode[n-1].dirtion
                        }
                        
                    }
                }
                switch(headNode.dirtion){
                    case "左":
                        var l=parseInt(headNode.style.left)
                        headNode.style.left=l-50+"px"
                    break
                    case "右":
                        var l=parseInt(headNode.style.left)
                        headNode.style.left=l+50+"px"
                    break
                    case "上":
                        var l=parseInt(headNode.style.top)
                        headNode.style.top=l-50+"px"
                    break
                    case "下":
                        var l=parseInt(headNode.style.top)
                        headNode.style.top=l+50+"px"
                    break
                    }
                // 判断蛇头是否出界
                if(parseInt(headNode.style.left)<0||parseInt(headNode.style.left)>450||parseInt(headNode.style.top)<0||parseInt(headNode.style.top)>450)
                {
                    clearInterval(window.t)
                    alert('撞到边界,死亡')
                }
                // 当蛇头移动后,进行与身体碰撞检测
                for(var n=0;n<bodyNode.length;n++){
                    if(headNode.style.left==bodyNode[n].style.left&&headNode.style.top==bodyNode[n].style.top){
                        clearInterval(window.t)
                        alert("咬到尾巴了")
                        return
                    }
                }
                // 进行碰撞检测  蛇头和食物重合,食物位置刷新
                // 重合到一起表示
                if(headNode.style.left==footNode.style.left&&headNode.style.top==footNode.style.top){
                    s=s+10
                    sc.innerHTML='Score:'+s
                    var newNode=createDiv("yellow")
                    var lastNode
                    if(bodyNode.length==0){
                        lastNode=headNode
                    }else{
                        lastNode=bodyNode[bodyNode.length-1]
                    }
                    switch(lastNode.dirtion){
                        case "左":
                            newNode.style.top=lastNode.style.top
                            var l=parseInt(lastNode.style.left)
                            newNode.style.left=l+50+"px"
                        break
                        case "右":
                            newNode.style.top=lastNode.style.top
                            var l=parseInt(lastNode.style.left)
                            newNode.style.left=l-50+"px"
                        break
                        case "上":
                            newNode.style.left=lastNode.style.left
                            var l=parseInt(lastNode.style.top)
                            newNode.style.top=l+50+"px"
                        break
                        case "下":
                            newNode.style.left=lastNode.style.left
                            var l=parseInt(lastNode.style.top)
                            newNode.style.top=l-50+"px"
                        break
                    }
                    // 新身体产生,移动方向
                    newNode.dirtion=lastNode.dirtion
                    // 放入数组
                    bodyNode.push(newNode)

                    // 尾重新随机出现
                    var px=parseInt(Math.random()*10)*50+"px"
                    var py=parseInt(Math.random()*10)*50+"px"
                    while(true){
                        for(var n=0;n<bodyNode.length;n++){
                            if(bodyNode[n].style.left==px&&bodyNode[n].style.top==py||headNode.style.left==px&&headNode.style.top==py){
                                px=parseInt(Math.random()*10)*50+"px"
                                py=parseInt(Math.random()*10)*50+"px"
                                break
                            }
                        }
                        if(n==bodyNode.length){
                            break
                        }
                    }
                    footNode.style.left=px
                    footNode.style.top=py
                }
                
            },300)
        }
        var bt2=document.getElementById("bt2")
        bt2.onclick=function(){
            window.t=setInterval(function(){
                if(bodyNode.length>0){
                    // 循环跟随
                    for(var n=bodyNode.length-1;n>=0;n--){
                        switch(bodyNode[n].dirtion){
                            case "左":
                                var l=parseInt(bodyNode[n].style.left)
                                bodyNode[n].style.left=l-50+"px"
                            break
                            case "右":
                                var l=parseInt(bodyNode[n].style.left)
                                bodyNode[n].style.left=l+50+"px"
                            break
                            case "上":
                                var l=parseInt(bodyNode[n].style.top)
                                bodyNode[n].style.top=l-50+"px"
                            break
                            case "下":
                                var l=parseInt(bodyNode[n].style.top)
                                bodyNode[n].style.top=l+50+"px"
                            break
                        }
                        if(n==0){
                            bodyNode[n].dirtion=headNode.dirtion
                        }else{
                            bodyNode[n].dirtion=bodyNode[n-1].dirtion
                        }
                        
                    }
                }
                switch(headNode.dirtion){
                    case "左":
                        var l=parseInt(headNode.style.left)
                        headNode.style.left=l-50+"px"
                    break
                    case "右":
                        var l=parseInt(headNode.style.left)
                        headNode.style.left=l+50+"px"
                    break
                    case "上":
                        var l=parseInt(headNode.style.top)
                        headNode.style.top=l-50+"px"
                    break
                    case "下":
                        var l=parseInt(headNode.style.top)
                        headNode.style.top=l+50+"px"
                    break
                    }
                // 判断蛇头是否出界
                if(parseInt(headNode.style.left)<0||parseInt(headNode.style.left)>450||parseInt(headNode.style.top)<0||parseInt(headNode.style.top)>450)
                {
                    clearInterval(window.t)
                    alert('撞到边界,死亡')
                }
                // 当蛇头移动后,进行与身体碰撞检测
                for(var n=0;n<bodyNode.length;n++){
                    if(headNode.style.left==bodyNode[n].style.left&&headNode.style.top==bodyNode[n].style.top){
                        clearInterval(window.t)
                        alert("咬到尾巴了")
                        return
                    }
                }
                // 进行碰撞检测  蛇头和食物重合,食物位置刷新
                // 重合到一起表示
                if(headNode.style.left==footNode.style.left&&headNode.style.top==footNode.style.top){
                    var newNode=createDiv("yellow")
                    var lastNode
                    if(bodyNode.length==0){
                        lastNode=headNode
                    }else{
                        lastNode=bodyNode[bodyNode.length-1]
                    }
                    switch(lastNode.dirtion){
                        case "左":
                            newNode.style.top=lastNode.style.top
                            var l=parseInt(lastNode.style.left)
                            newNode.style.left=l+50+"px"
                        break
                        case "右":
                            newNode.style.top=lastNode.style.top
                            var l=parseInt(lastNode.style.left)
                            newNode.style.left=l-50+"px"
                        break
                        case "上":
                            newNode.style.left=lastNode.style.left
                            var l=parseInt(lastNode.style.top)
                            newNode.style.top=l+50+"px"
                        break
                        case "下":
                            newNode.style.left=lastNode.style.left
                            var l=parseInt(lastNode.style.top)
                            newNode.style.top=l-50+"px"
                        break
                    }
                    // 新身体产生,移动方向
                    newNode.dirtion=lastNode.dirtion
                    // 放入数组
                    bodyNode.push(newNode)

                    // 尾重新随机出现
                    var px=parseInt(Math.random()*10)*50+"px"
                    var py=parseInt(Math.random()*10)*50+"px"
                    while(true){
                        for(var n=0;n<bodyNode.length;n++){
                            if(bodyNode[n].style.left==px&&bodyNode[n].style.top==py||headNode.style.left==px&&headNode.style.top==py){
                                px=parseInt(Math.random()*10)*50+"px"
                                py=parseInt(Math.random()*10)*50+"px"
                                break
                            }
                        }
                        if(n==bodyNode.length){
                            break
                        }
                    }
                    footNode.style.left=px
                    footNode.style.top=py
                    // 加分
                    score+=10
                    document.getElementById("score").innerHTML=score
                }
                
            },500)
            
        }
        var bt3=document.getElementById("bt3")
        bt3.onclick=function(){
            window.t=setInterval(function(){
                if(bodyNode.length>0){
                    // 循环跟随
                    for(var n=bodyNode.length-1;n>=0;n--){
                        switch(bodyNode[n].dirtion){
                            case "左":
                                var l=parseInt(bodyNode[n].style.left)
                                bodyNode[n].style.left=l-50+"px"
                            break
                            case "右":
                                var l=parseInt(bodyNode[n].style.left)
                                bodyNode[n].style.left=l+50+"px"
                            break
                            case "上":
                                var l=parseInt(bodyNode[n].style.top)
                                bodyNode[n].style.top=l-50+"px"
                            break
                            case "下":
                                var l=parseInt(bodyNode[n].style.top)
                                bodyNode[n].style.top=l+50+"px"
                            break
                        }
                        if(n==0){
                            bodyNode[n].dirtion=headNode.dirtion
                        }else{
                            bodyNode[n].dirtion=bodyNode[n-1].dirtion
                        }
                        
                    }
                }
                switch(headNode.dirtion){
                    case "左":
                        var l=parseInt(headNode.style.left)
                        headNode.style.left=l-50+"px"
                    break
                    case "右":
                        var l=parseInt(headNode.style.left)
                        headNode.style.left=l+50+"px"
                    break
                    case "上":
                        var l=parseInt(headNode.style.top)
                        headNode.style.top=l-50+"px"
                    break
                    case "下":
                        var l=parseInt(headNode.style.top)
                        headNode.style.top=l+50+"px"
                    break
                    }
                // 判断蛇头是否出界
                if(parseInt(headNode.style.left)<0||parseInt(headNode.style.left)>450||parseInt(headNode.style.top)<0||parseInt(headNode.style.top)>450)
                {
                    clearInterval(window.t)
                    alert('撞到边界,死亡')
                }
                // 当蛇头移动后,进行与身体碰撞检测
                for(var n=0;n<bodyNode.length;n++){
                    if(headNode.style.left==bodyNode[n].style.left&&headNode.style.top==bodyNode[n].style.top){
                        clearInterval(window.t)
                        alert("咬到尾巴了")
                        return
                    }
                }
                // 进行碰撞检测  蛇头和食物重合,食物位置刷新
                // 重合到一起表示
                if(headNode.style.left==footNode.style.left&&headNode.style.top==footNode.style.top){
                    var newNode=createDiv("yellow")
                    var lastNode
                    if(bodyNode.length==0){
                        lastNode=headNode
                    }else{
                        lastNode=bodyNode[bodyNode.length-1]
                    }
                    switch(lastNode.dirtion){
                        case "左":
                            newNode.style.top=lastNode.style.top
                            var l=parseInt(lastNode.style.left)
                            newNode.style.left=l+50+"px"
                        break
                        case "右":
                            newNode.style.top=lastNode.style.top
                            var l=parseInt(lastNode.style.left)
                            newNode.style.left=l-50+"px"
                        break
                        case "上":
                            newNode.style.left=lastNode.style.left
                            var l=parseInt(lastNode.style.top)
                            newNode.style.top=l+50+"px"
                        break
                        case "下":
                            newNode.style.left=lastNode.style.left
                            var l=parseInt(lastNode.style.top)
                            newNode.style.top=l-50+"px"
                        break
                    }
                    // 新身体产生,移动方向
                    newNode.dirtion=lastNode.dirtion
                    // 放入数组
                    bodyNode.push(newNode)

                    // 尾重新随机出现
                    var px=parseInt(Math.random()*10)*50+"px"
                    var py=parseInt(Math.random()*10)*50+"px"
                    while(true){
                        for(var n=0;n<bodyNode.length;n++){
                            if(bodyNode[n].style.left==px&&bodyNode[n].style.top==py||headNode.style.left==px&&headNode.style.top==py){
                                px=parseInt(Math.random()*10)*50+"px"
                                py=parseInt(Math.random()*10)*50+"px"
                                break
                            }
                        }
                        if(n==bodyNode.length){
                            break
                        }
                    }
                    footNode.style.left=px
                    footNode.style.top=py
                    // 加分
                    score+=10
                    document.getElementById("score").innerHTML=score
                }
                
            },800)
            
        }
        // 定时器使用
        // setInterval(function(){
        //     console.log(1)
        // },1000)

        // 按下键盘onkeydown上下左右时,改变蛇头方向
        // 事件处理函数中:事件对象event
        // event.keyCode键盘对应的键值
        document.onkeydown=function(event){
            // 根据按键改变方向
            switch(event.keyCode){
                case 37:
                if(!(headNode.dirtion=='右'&&bodyNode.length>0))
                    headNode.dirtion="左"
                break
                case 38:
                if(!(headNode.dirtion=='下'&&bodyNode.length>0))
                    headNode.dirtion="上"
                break
                case 39:
                if(!(headNode.dirtion=='左'&&bodyNode.length>0))
                    headNode.dirtion="右"
                break
                case 40:
                if(!(headNode.dirtion=='上'&&bodyNode.length>0))
                    headNode.dirtion="下"
                break
                
            }
        }
    </script>
    <!-- 定时器的shiyong
    <button id="bt1">开始定时器</button>
    <button id="bt2">停止定时器</button>
    <script>
        var bt1=document.getElementById("bt1")
        var t
        bt1.onclick=function(){
            t=setInterval(function(){
                console.log("hello world")
            },500)
        }
        var bt2=document.getElementById("bt2")
        bt2.onclick=function(){
            clearInterval(t)
        }
    </script> -->
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值