动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 手机学院 | 邮件系统 | 网络安全 | 认证考试
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网页制作 > Javascript教程
网页制作:Dreamweaver教程,FrontPages教程,Javascript教程,HTML教程,CSS教程,心得技巧,DHTML教程,网页特效,Discuz!论坛
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Javascript教程 ]的信息

本月文章推荐
.注意JavaScript中RegExp对象的te.
.javascript表单之间的数据传递.
.JavaScript中try...catch和异常处.
.JavaScript的document和window对.
.Javascript制作浮动的工具条.
.图片下拉选择器的制作.
.javascript中如何实现浏览器上的.
.一个简单的javascript菜单.
.JavaScript极速狂飙:CSS样式表的.
.Javascript使用CSS异步跨域获取数.
.javascript String.format.
.用Javascript实现评估用户输入密.
.JavaScript学习笔记(4)表格排序.
.JavaScript学习笔记 1-入门.
.用javascript实现随机跳转页面.
.JS函数实现鼠标指向后带图片的提.
.利用JavaScript获取屏幕分辨率的.
.利用Javascript建立Web应用.
.用JavaScript实现变色背景和文字.
.用JavaScript实现浏览器地震效果.

JAVASCRIPT 贪吃蛇

发表日期:2008-9-16 |


    在很早学 QuickBasic 的时候,就有一个蛇吃食物的游戏,当时是作为 Basic 的一个示例提供的。当时只顾得玩了,竟没想到要把那些高人写的代码好好分析一下。现在做 Web 开发的培训,有一个用 Javascript 写的类似的小游戏,就花了大半天好好看了一下代码,觉得写的不错。
 
    功能:蛇吃食物有三种情况:走到的地方有食物;走到的地方没有食物;走到的地方是墙壁。吃到食物后,蛇的身体会变长;碰到墙壁后 Game Over,询问是否重新开始。

    整个游戏是在一个<div>框子(地图)里展开的,蛇有地图里的一系列<div>构成,初始状态(刚刚打开页面)蛇是一个<div>框,蛇头和蛇尾是在一起的,就是这个<div>框,以后吃了食物后<div>个数会变多,蛇就会长长。食物用一个<span>框表示,初始时和蛇一样其位置是随机产生的。蛇和食物的坐标用<div>和<span>的绝对位置表示。

    算法的关键是当蛇移动到新的位置后,判断前述的三种情况,做出相应的处理。而二维数组 Map[][] 就是判断的依据。二维数组 Map[][]通过其元素的值来表示蛇身、食物和空地。蛇身、食物和空地的值分别为'S'、'F'和'0'。

    用 Javascript 编程和其他语言的一个大的区别就是键盘的控制代码不同。js是通过 Key=event.keyCode 语句获取键盘码,再在多分支 switch 结构里分别处理。看完这些代码就会对浏览器里的键盘控制有所了解了。

    当然该段代码的最大价值还是让我们了解到网页游戏的大概写法,而算法其实是最重要的,把一个游戏的设想变为一堆包含许多的函数的结构化的代码,是值得我们借鉴和学习的。

    代码里有我的注释,结合我的以上大概分析介绍差不多能看懂了。

    题外问题:本人在调试的时候打算给原来的代码加一段方格显示功能,就写了个ShowGrid()函数,采用代码生成方格。但由于在2层循环内完成方格显示,效率十分低下,生成15*10的方格需要大约6秒。生成30*20 的方格竟然需要几分钟。基本不能采用此方法。改进建议:采用图片,既美观,速度也快。

    <HTML>
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
      <title>贪吃蛇</title>
    </head>

    <STYLE>
      .Food { background-color: green;}
      .Snake {background-color: red;}
      .grid {border:1px solid #000}
    </STYLE>

    <SCRIPT langyage="javascript">
      var Rows=10
      var Cells=15
      var Num=20  //正方形格子的边长
      var BorderWidth=5
      var SpeedUp=5000

      //创建地图
      function CreateMap()
      {
        BW = eval(Cells*Num + 2*BorderWidth)  //宽度
        BH = eval(Rows*Num + 2*BorderWidth)   //高度
        document.body.innerHTML+='<div id=MainMap style=position:absolute;left:'+(document.body.clientWidth-BW)/2+';top:'+(document.body.clientHeight-BH)/2+';width:'+BW+';height:'+BH+';border-width:'+BorderWidth+';border-style:outset;border-color:#0000ff></div>'

        Map = new Array() //创建全局数组Map[]
        for(y=0; y<Rows; y++)
        {
         Map[y]=new Array() //创建全局二维数组Map[][],初始值为'0'
         for(x=0; x<Cells; x++)
           Map[y][x] = '0'  //'0'值表示“空地”
        }

        //ShowGrid();  //显示地图内格子

        Sx = parseInt(Math.random()*Cells) //创建全局变量Sx,赋予随机数
        Sy = parseInt(Math.random()*Rows)  //创建全局变量Sy,赋予随机数
        CreateSnake()  //生成蛇 - div
        CreatFood()    //生成食物 - span
        AllDiv = MainMap.all.tags('DIV')   //创建全局数组AllDiv,只有一个元素AllDiv[0]。MainMap是div的ID
        AllSpan = MainMap.all.tags('SPAN') //创建全局数组AllSpan,只有一个元素AllSpan[0]
      }

      //显示地图内格子
      function ShowGrid()
      {
        for(r=0; r<Rows; r++)  //行
        {
          t = r*Num;
          for(c=0; c<Cells; c++)  //列
          {
            l = c*Num;
            MainMap.innerHTML += '<table style="position:absolute;left:'+ l +';top:'+ t +';width:'+Num+';height:'+Num+';" cellpadding=0 cellspacing=0><tr><td align=center valign=middle class=grid>O</td></tr><table>'
          }
        }
      }

      //创建蛇的初始位置,赋予初始值'S'
      function CreateSnake()
      {
        //<div>表示蛇身,通过调用本函数,可以累加到若干个,蛇身变长
        //注意 y 和 x 是“蛇”<div> 的自定义属性。一直保存着蛇尾(!)的当前位置
        //初始时,蛇头、蛇尾是同一个位置
        MainMap.innerHTML += '<div x='+Sx+' y='+Sy+' style=position:absolute;left:'+Sx*Num+';top:'+Sy*Num+';width:'+Num+';height:'+Num+';overflow:hidden class=Snake></div>'
        Map[Sy][Sx]='S'  //Snake首字母
      }

      //创建食物的位置,赋予初始值'F'
      //食物的初始位置不能与蛇的初始位置相同,只能在空地放置食物。
      //若随机产生的2位置相同,则递归执行,直到不相同为止
      function CreatFood()
      {
        Fx = parseInt(Math.random()*Cells)
        Fy = parseInt(Math.random()*Rows)
        if(Map[Fy][Fx]=='0')  //如果是空地
        {
         MainMap.innerHTML += '<span style=position:absolute;left:'+Fx*Num+';top:'+Fy*Num+';width:'+Num+';height:'+Num+';overflow:hidden class=Food></span>'
         Map[Fy][Fx]='F'  //Food首字母
        }
        else
         CreatFood() //递归
      }

      //主移动--判断蛇头前面的是什么
      function Move()
      {
        Sx += GoX  //自动行走,Map[Sy][Sx]为当前位置
        Sy += GoY
        if(Sy<0||Sy>=Rows) //碰墙,重新开始
          Move1()
        else
        {
         SnakeFront = Map[Sy][Sx]
         if(SnakeFront=='0') //蛇前是空地
           Move2()
         else
         {
          if(SnakeFront=='F') //蛇前面是食物
            Move3()
          else
           Move1()
        }
       }
      }

      //重新开始
      function Move1()
      {
        if(confirm("Game Over,重新开始?"))
          window.location.reload()
      }

      var Times=200

      //蛇行走到的当前位置是空地时
      function Move2()
      {
        Map[AllDiv[0].y][AllDiv[0].x]='0'  //蛇走开后,把原位置设置为'0',表示是空地
        AllDiv[0].removeNode(true)  //把蛇数组当前元素删除,在下面的 CreateSnake()语句重新生成
        CreateSnake()  //在新的位置生成蛇的<div>
        setTimeout('Move()',Times)  //再次移动
      }

      //蛇行走到的当前位置是食物时
      function Move3()
      {
        CreateSnake()  //蛇数组当前元素不删除,<div>累加一次,蛇长长一节
        AllSpan[0].removeNode(true)  //把食物数组当前元素删除,在下面的 CreatFood()语句重新生成
        CreatFood()  //再次随机生成食物
        setTimeout('Move()',Times)  //再次移动
      }

      //蛇越行越快
      function oTimes()
      {
        Times -= 5
        if(Times>5)
          setTimeout('oTimes()', SpeedUp)
      }

      document.onkeydown=KeyDown
      //方向
      function KeyDown()
      {
        Key=event.keyCode
        switch(Key){
        case 37:
          Dir(-1,0);break  //左方向键
        case 39:
          Dir(1,0);break   //右方向键
        case 38:
          Dir(0,-1);break  //上方向键
        case 40:
          Dir(0,1);break}  //下方向键
        return false
      }

      var Star=0

      function Dir(x,y)
      {
        GoX=x
        GoY=y
        if(Star==0)
        {
          oTimes()
         Star=1
         Move()
       }
      }

      //页面打开时运行
      onload = CreateMap;  //注意无"()",不是 CreateMap()
      //在<body>中调用的语法是:<BODY onload="CreateMap()">,必须加"()"
    </SCRIPT>

    <BODY>
    <div id="help">
     红色方块表示蛇,绿色方块表示食物。按方向键开始。<br>
    </div>
    </BODY>
    </HTML>

上一篇:Javascript页面宽度高度 人气:2484
下一篇:Javascript文档生成 人气:1513
浏览全部JAVASCRIPT的内容 Dreamweaver插件下载 网页广告代码 2009年新年快乐
  最新网站源码 最新软件下载
2009-1-8 SMF论坛Simple Machines Forum v
2009-1-8 SMF论坛Simple Machines Forum v
2009-1-8 深度学习(asp)拼图游戏 v0.2.3
2009-1-8 纵横B2B电子商务系统XYECS!B2B v
2009-1-8 马克斯CMS v2.0 bulid 090105 be
2009-1-8 淘宝妈妈_淘客推广系统 v1.0
2009-1-8 淄博某企业网站源码
2009-1-8 silverlight制作的手机功能演示
2009-1-8 大型WEB束鹿三国游戏 特别版
2009-1-7 汉字任意点阵字库制作软件 V2.6
2009-1-7 书法家毛笔字生成器 Ougishi V4.
2009-1-7 字体修复大师
2009-1-7 微雨字体效果浏览器 1.0
2009-1-7 字体试衣间 2.9.6.8 豪华版
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
  发表评论
姓 名: 验证码: [ 查看评论 ]
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 公积金贷款计算 | 购房银行按揭利率计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 全国各地车牌查询 | 全国车辆交通违章查询 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成