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 相关文章推荐
Prototype使用指南之enumerable.js
Jan 10 Javascript
做网页的一些技巧
Feb 01 Javascript
javascript 页面划词搜索JS
Sep 28 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
Nov 03 Javascript
JavaScript常用字符串与数组扩展函数小结
Apr 24 Javascript
JS+jQuery实现注册信息的验证功能
Sep 26 jQuery
详解ES6中的代理模式——Proxy
Jan 08 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
Nov 26 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
vue实现图片上传到后台
Jun 29 Javascript
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
TS 类型收窄教程示例详解
Sep 23 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
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
php array的学习笔记
2012/05/16 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
php筛选不存在的图片资源
2015/04/28 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
2020/02/15 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
浅谈Python中的模块
2020/06/10 Python
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
优秀员工年终发言演讲稿
2014/01/01 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
总经理的岗位职责
2014/02/23 职场文书
学校献爱心活动总结
2014/07/08 职场文书
优秀护士事迹材料
2014/12/25 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript
python实现层次聚类的方法
2021/11/01 Python