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 相关文章推荐
js 高效去除数组重复元素示例代码
Dec 19 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
May 16 Javascript
Jquery焦点与失去焦点示例应用
Jun 10 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
基于JavaScript Array数组方法(新手必看篇)
Aug 20 Javascript
ES6新特性之函数的扩展实例详解
Apr 01 Javascript
JS实现的3des+base64加密解密算法完整示例
May 18 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
Sep 05 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
Dec 03 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
Jun 04 Javascript
vue 封装 Adminlte3组件的实现
Mar 18 Javascript
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
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
thinkphp分页集成实例
2017/07/24 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
原生js调用json方法总结
2018/02/22 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
python解释器安装教程的方法步骤
2020/07/02 Python
如何让python的运行速度得到提升
2020/07/08 Python
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
遗嘱继承公证书
2014/04/09 职场文书
一年级学生评语大全
2014/04/21 职场文书
新书发布会策划方案
2014/06/09 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
劳资员岗位职责
2015/02/13 职场文书
2016新年慰问信范文
2015/03/25 职场文书
食品安全责任书范本
2015/05/09 职场文书
个人业务学习心得体会
2016/01/25 职场文书
《将心比心》教学反思
2016/02/23 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书