html小游戏--贪吃蛇

作者: 简鱼7819 | 来源:发表于2016-10-31 16:28 被阅读58次

    仿写一个html小游戏,贪吃蛇。

    它的body中要写的内容并不多,只是展示出来几个按钮input还有就是蛇本身最开始的初始化。

    head里面的style也是调整样式和大小位置,比较简单,这里就不细说了。

    主要说一下script中处理。

    function getClass(oParent,sClass){

              varaEle=oParent.getElementsByTagName('*')

              varresult=[];

              for(vari=0;i

                       if(aEle[i].className==sClass){

                            result.push(aEle[i])

                       }

               }

               return result

    }

    这个方法主要用来遍历整个html中的元素,跟你所想要比对的sClass进行比较,这样来拿到你想要操作的元素,返回一个数组。

    在window对象onload加载方法中,获取

    var oDiv=document.getElementById('body')

    var oBtn1=document.getElementById('btn1')

    var oBtn2=document.getElementById('btn2')

    var oBtn3=document.getElementById('btn3')

    var oBtn4=document.getElementById('btn4')

    var oBtn5=document.getElementById('btn5')

    var oBtn6=document.getElementById('btn6')

    var aSk=getClass(oDiv,'snake')

    var t=0//Top系数

    var l=0//Left系数

    var direction=4//方向  1:左    2:上    3:右    4:下

    var Timer=null

    var speed=100//定时器频率

    var pause=0//暂停/开始

    var wall=1//撞墙开关

    var Body=1//撞自己开关

    var Auto=0//自动模式开关

    写各个按钮的响应事件

    //撞墙开关

    oBtn1.onclick=function(){

    wall=1

    oBtn1.style.borderColor="#960"

    oBtn1.style.color="#960"

    oBtn2.style.borderColor="#03C"

    oBtn2.style.color="#000"

     }

    oBtn2.onclick=function(){

    Body=0

    oBtn2.style.borderColor="#960"

    oBtn2.style.color="#960"

    oBtn1.style.borderColor="#03C"

    oBtn1.style.color="#000"

     }

    //撞身体开关

    oBtn3.onclick=function(){

    Body=1

    oBtn3.style.borderColor="#960"

    oBtn3.style.color="#960"

    oBtn4.style.borderColor="#03C"

    oBtn4.style.color="#000"

    }

    oBtn4.onclick=function(){

    Body=0

    oBtn4.style.borderColor="#960"

    oBtn4.style.color="#960"

    oBtn3.style.borderColor="#03C"

    oBtn3.style.color="#000"

     }

    //自动模式

    oBtn5.onclick=function(){

    Auto=1

    Body=0

    wall=0

    Body=0

    oBtn2.style.borderColor="#960"

    oBtn2.style.color="#960"

    oBtn1.style.borderColor="#03C"

    oBtn1.style.color="#000"

    oBtn4.style.borderColor="#960"

    oBtn4.style.color="#960"

    oBtn3.style.borderColor="#03C"

    oBtn3.style.color="#000"

    oBtn5.style.borderColor="#960"

    oBtn5.style.color="#960"

    oBtn6.style.borderColor="#03C"

    oBtn6.style.color="#000"

     }

    oBtn6.onclick=function(){

    Auto=0

    pause=0

    clearInterval(Timer);

    oBtn6.style.borderColor="#960"

    oBtn6.style.color="#960"

    oBtn5.style.borderColor="#03C"

    oBtn5.style.color="#000"

     }

    在这留按钮事件中,处理的是调整本身按钮和其他按钮的css样式,还有就是及时更新各种状态值。

    functionMove(){

    //吃豆

    if(aSk[0].offsetLeft==aDiv.offsetLeft&&aSk[0].offsetTop==aDiv.offsetTop){

    oDiv.removeChild(aDiv)//吃豆后豆豆消失,并随机位置重新生成

    aDiv=document.createElement('div')

    aDiv.className='doudou'

    oDiv.appendChild(aDiv)

    aDiv.style.left=parseInt(Math.random()*29)*20+'px'

    aDiv.style.top=parseInt(Math.random()*24)*20+'px'

    //吃豆豆后生长一截↓

    varbDiv=document.createElement('div')

    bDiv.className='snake'

    oDiv.appendChild(bDiv)

        }

    aSk=getClass(oDiv,'snake')//重新确定身体组成

    for(vari=aSk.length-1;i>0;i--){//后面一截跟着前面一截走

    aSk[i].style.left=aSk[i-1].offsetLeft+'px'

    aSk[i].style.top=aSk[i-1].offsetTop+'px'

        }

    varsnakeL=document.getElementById("snakelength");

    snakeL.innerHTML='分数: '+aSk.length;

    //自动模式

        if(Auto==1){

             if(aSk[0].offsetTop>aDiv.offsetTop){

              direction=2

         }else if(aSk[0].offsetTop

              direction=4

         }else if(aSk[0].offsetTop==aDiv.offsetTop){

              if(aSk[0].offsetLeft>aDiv.offsetLeft){

                direction=1

              }else if(aSk[0].offsetLeft

                   direction=3

              }

           }

        }

    //蛇身运动

       if(direction==1){

          l--

           aSk[0].style.left=20*l+'px'

        }else if(direction==2){

            t--

          aSk[0].style.top=20*t+'px'

        }else if(direction==3){

         l++

       aSk[0].style.left=20*l+'px'

        }else if(direction==4){

          t++

        aSk[0].style.top=20*t+'px'

       }

    //撞墙死

       if(wall==1){

             if(t>=25||t<0||l>=30||l<0){

            clearInterval(Timer)

             alert('死了')

       } 

        }else{

            if(t>=25){

                  t=0

                  aSk[0].style.top=0+'px'

            }else if(t<0){

                t=24

            aSk[0].style.top=480+'px'

            }else if(l>=30){

                  l=0

                  aSk[0].style.left=0+'px'

           }else if(l<0){

            l=29

           aSk[0].style.left=580+'px'

          }

        }

          //撞身体死

            if(Body==1){

               for(vari=1;i

                  if(aSk[0].offsetLeft==aSk[i].offsetLeft&&aSk[0].offsetTop==aSk[i].offsetTop){

                clearInterval(Timer)

                 alert('死了')

          }

        }

       }

    }

    这个Move方法是这贪吃蛇的核心方法,里面主要是用getClass方法获取className值为snake的aSk数组,然后遍历aSk中的各个元素的offset属性值(offsetLeft,offsetTop)和所谓的doudou的oDiv的offset比较。来判断doudou是否被吃掉,运用createElement生成随机位置的新doudou。同时整个蛇的运行,也是在遍历调整蛇的数组aSK中每一个doudou的style中的left和top。

    window的onkeydown监听键盘的响应事件,其中方向键,加减速度以及空格键。这个方法主要是更新方向的状态值,是否暂停的状态值,还有就是开启和消除定时器来走Move方法。

    在写这个游戏的时候出现一个疑问的地方,那就是初始化doudou的位置是放在body中还是在onload加载时出现。其实两个都可以,如果是放在body中实现,那么你在onload方法Move方法里处理蛇吃掉doudou的这个情况时,就要用getElementById获取它,然后删除,并且再生成一个随机的。我这学习的是写的script的onload中,效果也一样。

    刚学html,写这个文章既是自己积累也是分享跟我一样的初学者,非喜勿喷,谢谢!!!

    相关文章

      网友评论

      本文标题:html小游戏--贪吃蛇

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