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的tab切换 js原理
Apr 01 Javascript
js模仿hover的具体实现代码
Dec 30 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
Jan 27 Javascript
页面图片浮动左右滑动效果的简单实现案例
Feb 10 Javascript
js实现基于正则表达式的轻量提示插件
Aug 29 Javascript
关于微信上网页图片点击全屏放大效果
Dec 19 Javascript
EasyUI为Numberbox添加blur事件的方法
Mar 05 Javascript
5分钟打造简易高效的webpack常用配置
Jul 04 Javascript
vue如何限制只能输入正负数及小数
Jul 04 Javascript
vue 通过绑定事件获取当前行的id操作
Jul 27 Javascript
vue 限制input只能输入正数的操作
Aug 05 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
Aug 10 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的论坛(4)
2006/10/09 PHP
php 全文搜索和替换的实现代码
2008/07/29 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
2007/01/09 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
js点击选择文本的方法
2015/02/09 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
Python列表list数组array用法实例解析
2014/10/28 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
Django 用户认证组件使用详解
2019/07/23 Python
Python简单实现区域生长方式
2020/01/16 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
Python截图并保存的具体实例
2021/01/14 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
小学生暑假家长评语
2014/04/17 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
详解flex:1什么意思
2022/07/23 HTML / CSS