javascript实现简单的贪吃蛇游戏


Posted in Javascript onMarch 31, 2015

javascript实现简单的贪吃蛇游戏,功能很简单,代码也很实用,就不多废话了,小伙伴们参考注释吧。

<html>
<head>
  <meta http-equiv='content-type' content='text/html;charset=utf-8'>
<title>贪吃蛇</title>
<script type="text/javascript">
  var map;  //地图
  var snake; //蛇
  var food;  //食物
  var timer; //定时器
  var initSpeed=200; //初始定时器时间间隔(毫秒),间接代表蛇移动速度
  var nowSpeed=initSpeed; //游戏进行时蛇移动速度
  var grade=0;  //积分
  var flag=1;   //(可间接看做)关卡
  //地图类
  function Map(){
    this.width=800;
    this.height=400;
    this.position='absolute';
    this.color='#EEEEEE';
    this._map=null;
    //生成地图
    this.show=function(){
      this._map=document.createElement('div');
      this._map.style.width=this.width+'px';
      this._map.style.height=this.height+'px';
      this._map.style.position=this.position;
      this._map.style.backgroundColor=this.color;
      document.getElementsByTagName('body')[0].appendChild(this._map);
    }
  }
  //食物类
  function Food(){
    this.width=20;
    this.height=20;
    this.position='absolute';
    this.color='#00FF00';
    this.x=0;
    this.y=0;
    this._food;
    //生成食物
    this.show=function(){
      this._food=document.createElement('div');
      this._food.style.width=this.width+'px';
      this._food.style.height=this.height+'px';
      this._food.style.position=this.position;
      this._food.style.backgroundColor=this.color;
      this.x=Math.floor(Math.random()*map.width/this.width);
      this.y=Math.floor(Math.random()*map.height/this.width);
      this._food.style.left=this.x*this.width;
      this._food.style.top=this.y*this.height;
 
      map._map.appendChild(this._food);
    }
  }
  //蛇类
  function Snake(){
    this.width=20;
    this.height=20;
    this.position='absolute';
    this.direct=null;//移动方向
    //初始蛇身
    this.body=new Array(
        [3,2,'red',null],//蛇头
        [2,2,'blue',null],
        [1,2,'blue',null]
      );
    //生成蛇身
    this.show=function(){
      for(var i=0;i<this.body.length;i++){
        if(this.body[i][3]==null){
          this.body[i][3]=document.createElement('div');
          this.body[i][3].style.width=this.width;
          this.body[i][3].style.height=this.height;
          this.body[i][3].style.position=this.position;
          this.body[i][3].style.backgroundColor=this.body[i][2];
          map._map.appendChild(this.body[i][3]);
        }
        this.body[i][3].style.left=this.body[i][0]*this.width+'px';
        this.body[i][3].style.top=this.body[i][1]*this.height+'px';
      }
    }
    //控制蛇移动
    this.move=function(){
       
      var length=this.body.length-1;
      for(var i=length;i>0;i--){
        this.body[i][0]=this.body[i-1][0];
        this.body[i][1]=this.body[i-1][1];
      }
 
      switch(this.direct){
        case 'right':
          this.body[0][0]=this.body[0][0]+1;
          break;
        case 'left':
          this.body[0][0]=this.body[0][0]-1;
          break;
        case 'up':
          this.body[0][1]=this.body[0][1]-1;
          break;
        case 'down':
          this.body[0][1]=this.body[0][1]+1;
          break;
      }
       
      this.condition();
      this.show();
    }
    //定时器,开始游戏时,调用
    this.speed=function(){
      timer=setInterval('snake.move()',initSpeed);
    }
    //条件处理
    this.condition=function(){
      //吃食物
      if(this.body[0][0]==food.x&&this.body[0][1]==food.y){
        grade++;
        this.body[[this.body.length]]=[0,0,'blue',null];
        map._map.removeChild(food._food)
        food.show();
      }
      //判断是否撞墙
      if(this.body[0][0]<0||this.body[0][0]>=map.width/this.width||this.body[0][1]<0||this.body[0][1]>=map.height/this.height){
        alert('game over');
        clearInterval(timer);
        return ;
      }
      //判断是否撞到自身
      for(var i=1;i<this.body.length;i++){
        if(this.body[0][0]==this.body[i][0]&&this.body[0][1]==this.body[i][1]){
          alert('game over');
          clearInterval(timer);
          return ;
        }
      }
      //速度提升处理,积分每曾2分,速度提升一倍
      if(grade/2==flag){
        clearInterval(timer);
        flag++;
        nowSpeed=initSpeed/flag;
        timer=setInterval('snake.move()',nowSpeed);
      }
      document.title='贪吃蛇 积分'+grade+' 速度等级'+initSpeed/nowSpeed;
 
    }
  }
 
  document.onkeydown=function(event){
    //按下任意键,开始游戏
    if(snake.direct===null){
      snake.direct='right';
      snake.speed();
    }
    //控制方向,W S D A分别代表 上下右左
    switch(window.event?window.event.keyCode:event.keyCode){//浏览器兼容处理
      case 87 :
        snake.direct=snake.body[0][0]==snake.body[1][0]?snake.direct:'up';//避免反向移动,触发死亡bug
        break;
      case 83 :
        snake.direct=snake.body[0][0]==snake.body[1][0]?snake.direct:'down';
        break;
      case 68 :
        snake.direct=snake.body[0][1]==snake.body[1][1]?snake.direct:'right';
        break;
      case 65 :
        snake.direct=snake.body[0][1]==snake.body[1][1]?snake.direct:'left';
        break;
    }
  }
  //自动加载游戏
  window.onload=function(){
    map=new Map();
    map.show();
    food=new Food();
    food.show();
    snake=new Snake();
    snake.show();
     
  }
</script>
</head>
<body>
</body>
</html>

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
jquery中的常用事件bind、hover、toggle等示例介绍
Jul 21 Javascript
JS实现自适应高度表单文本框的方法
Feb 25 Javascript
jQuery实现带分组数据的Table表头排序实例分析
Nov 24 Javascript
多种jQuery绑定事件的实现方式
Jun 13 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
Dec 28 Javascript
Angular.js中控制器之间的传值详解
Apr 24 Javascript
bootstrap table单元格新增行并编辑
May 19 Javascript
vue loadmore组件上拉加载更多功能示例代码
Jul 19 Javascript
微信小程序实现简单input正则表达式验证功能示例
Nov 30 Javascript
vue2.0 下拉框默认标题设置方法
Aug 22 Javascript
微信小程序开发之自定义tabBar的实现
Sep 06 Javascript
Vue使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
javascript制作2048游戏
Mar 30 #Javascript
JavaScript模拟实现继承的方法
Mar 30 #Javascript
jQuery制作可自定义大小的拼图游戏
Mar 30 #Javascript
JS实现向表格中动态添加行的方法
Mar 30 #Javascript
JS实现向表格行添加新单元格的方法
Mar 30 #Javascript
JS实现控制表格行文本对齐的方法
Mar 30 #Javascript
JS实现控制表格行内容垂直对齐的方法
Mar 30 #Javascript
You might like
php表单提交问题的解决方法
2011/04/12 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
总结对比php中的多种序列化
2016/08/28 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
python中的随机函数random的用法示例
2018/01/27 Python
python实现简易数码时钟
2021/02/19 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
python超时重新请求解决方案
2019/10/21 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
Python自带的IDE在哪里
2020/07/01 Python
高性能装备提升营地:Kammok
2019/02/27 全球购物
自荐信需注意事项
2014/01/25 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
催款函范本大全
2015/06/24 职场文书
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android