傲视苍穹H5_VIP专题HTML笔记分享

html小游戏--贪吃蛇

2016-10-31  本文已影响58人  简鱼7819

仿写一个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,写这个文章既是自己积累也是分享跟我一样的初学者,非喜勿喷,谢谢!!!

上一篇 下一篇

猜你喜欢

热点阅读