html小游戏--贪吃蛇

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容

  • 1. tab列表折叠效果 html: 能源系统事业部 岗位名称: 工作地点 岗位名...
    lilyping阅读 1,865评论 0 1
  • 事件对象 鼠标事件 event.clientX在可视区中,鼠标点击的x坐标 event.clientY在可视区中,...
    LaBaby_阅读 587评论 0 1
  • 真的是写了好久其中算法绕死人~不过静下心来好好地一步一步研究,然后写出来还是非常有成就感滴O(∩_∩)O~~接下来...
    简单的名字吧阅读 473评论 0 0
  • 一、DOM 什么是DOM?Document Object Model(文档对象模型)。DOM是针对HTML和XML...
    空谷悠阅读 973评论 0 2
  • 我们首先要明白,我们给页面添加效果用到的js到底是什么?js其实包含三部分:dom 文档对象模型 bom 浏览...
    一直以来都很好阅读 807评论 0 0