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使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
使用requestAnimationFrame实现js动画性能好
Aug 06 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 Javascript
JS三级可折叠菜单实现方法
Feb 29 Javascript
jQuery实现调整表格单列顺序完整实例
Jun 20 Javascript
什么是JavaScript注入攻击?
Sep 14 Javascript
微信小程序 progress组件详解及实例代码
Oct 25 Javascript
BootStrap与Select2使用小结
Feb 17 Javascript
jQuery插件zTree实现删除树节点的方法示例
Mar 08 Javascript
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
js获取本日、本周、本月的时间代码
Feb 01 Javascript
vue 二维码长按保存和复制内容操作
Sep 22 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
PHP 超链接 抓取实现代码
2009/06/29 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
JS 继承实例分析
2008/11/04 Javascript
javascript div 弹出可拖动窗口
2009/02/26 Javascript
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
Python中用Decorator来简化元编程的教程
2015/04/13 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python实现超市商品销售管理系统
2019/11/22 Python
美国网上书店:Barnes & Noble
2018/08/15 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
党员培训思想汇报
2014/01/07 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
民间个人借款协议书
2014/09/30 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
2015暑假假期总结
2015/07/13 职场文书