原生JS实现贪吃蛇小游戏


Posted in Javascript onMarch 09, 2020

本文实例为大家分享了JS实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下

思路:在页面上添加一个地图,以提供边界,在地图中随机出现食物,给蛇身设置一个初始长度,用键盘方向键控制蛇的走向,当蛇触碰到食物时(既坐标重复时),增加蛇身长度,碰到墙壁或自身时,程序停止,游戏结束。

HTML结构:

<body>
 <div id="map"></div>
</body>

CSS样式:

<style>
 #map{
  width: 600px;
  height: 300px;
  background: #ccc;
  border: 5px solid blacks;
  margin: 0 auto;
  position: relative;}
</style>

js实现功能:

<script>
 class Map{ //地图
  constructor(){
   this.mapEle = document.getElementById("map");
   this.w = this.mapEle.offsetWidth;
   this.h = this.mapEle.offsetHeight;
  }
 }
 class Food{ //食物
  constructor(){
   this.w = 20;
   this.h = 20;
   this.x = 0;
   this.y = 0;
   this.c = "orange";
   this.createEle();
  } 
  createEle(){
   this.foodEle = document.createElement("div");
   this.foodEle.style.cssText = `width:${this.w}px;height:${this.h}px;background:${this.c};position:absolute;left:${this.x * this.w}px;top:${this.y * this.h}px;border-radius: 40%;`;
   m.mapEle.appendChild(this.foodEle);
  }
  randomPos(){
   this.x = random(0,(m.w-this.w) / this.w);
   this.y = random(0,(m.h-this.h) / this.h);
   this.foodEle.style.left = this.x * this.w + "px";
   this.foodEle.style.top = this.y * this.h + "px";
  }
 }
 class Snake{ //身体
  constructor(){
   this.w = 20;
   this.h = 20;
   this.body = [{
     ele:null,x:4,y:3,c:randomColor()
   },{
    ele:null,x:3,y:3,c:randomColor()
   },{
    ele:null,x:2,y:3,c:randomColor()
   }];
   this.d = "right"; //设置默认行走方向
   this.createEle();
  }
  createEle(){
   for(var i=0;i<this.body.length;i++){
    if(!this.body[i].ele){
     this.body[i].ele = document.createElement("div");
     m.mapEle.appendChild(this.body[i].ele);
    }
    this.body[i].ele.style.cssText = `width:${this.w}px;height:${this.h}px;background:${this.body[i].c};position:absolute;left:${this.body[i].x * this.w}px;top:${this.body[i].y * this.h}px;color:#fff;border-radius: 40%;`;
   }
   this.body[0].ele.innerHTML = "00"
   setTimeout(()=>{this.move()},300);
  }
  move(){
   for(var i=this.body.length-1;i>0;i--){
    this.body[i].x = this.body[i-1].x;
    this.body[i].y = this.body[i-1].y;
   }
   switch(this.d){
    case "left":this.body[0].x -= 1;break;
    case "right":this.body[0].x += 1;break;
    case "top":this.body[0].y -= 1;break;
    case "bottom":this.body[0].y += 1;break;
   }
   if(this.body[0].x < 0 || this.body[0].y < 0 || this.body[0].x > ((m.w-this.w) / this.w) || this.body[0].y > ((m.h-this.h) / this.h)){
    alert("撞墙了");
    return;
   }
   if(this.body[0].x === f.x && this.body[0].y === f.y){
    this.body.push({ele:null,x:this.body[this.body.length-1].x,y:this.body[this.body.length-1].y,c:randomColor()});
    f.randomPos();
   }
   for(var i=1;i<this.body.length;i++){
    if(this.body[0].x == this.body[i].x && this.body[0].y == this.body[i].y){
     alert("撞到自己了");
     return;
    }
   }
   this.createEle();
  }
  direct(type){
   switch(type){
    case 37:
     if(this.d === "right") break;
     this.d = "left";break;
    case 38:
     if(this.d === "bottom") break;
     this.d = "top";break;
    case 39:
     if(this.d === "left") break;
     this.d = "right";break;
    case 40:
     if(this.d === "top") break;
     this.d = "bottom";break;
   }
  }
 }
 function random(a,b){
  return Math.round(Math.random()*(a-b)+b);
 }
 function randomColor(){
  return `rgb(${random(0,255)},${random(0,255)},${random(0,255)})`;
 }

 var m = new Map();

 var f = new Food();
 f.randomPos();

 var s = new Snake();
 document.onkeydown = function(eve){
  var e = eve || window.event;
  var code = e.keyCode || e.which;
  s.direct(code);
 }
</script>

小编还为大家准备了精彩的专题:javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery中siblings()方法用法实例
Jan 08 Javascript
JS长整型精度问题实例分析
Jan 13 Javascript
扒一扒JavaScript 预解释
Jan 28 Javascript
JavaScript取得键盘按下方向键是哪个的方法
Aug 04 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
May 24 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
JS添加删除DIV的简单实例
Jul 08 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
Nov 09 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
Apr 10 Javascript
微信公众号平台接口开发 菜单管理的实现
Aug 14 Javascript
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
微信小程序 wx.getUserInfo引导用户授权问题实例分析
Mar 09 #Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 #Javascript
Node.js+Vue脚手架环境搭建的方法步骤
Mar 08 #Javascript
JS中的const命令你真懂它吗
Mar 08 #Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
Mar 08 #Javascript
Vue vm.$attrs使用场景详解
Mar 08 #Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
Mar 08 #Javascript
You might like
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
javscript对象原型的一些看法
2010/09/19 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
jquery实现图片切换代码
2016/10/13 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
python 实现目录复制的三种小结
2019/12/04 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
经典导游欢迎词大全
2014/01/16 职场文书
企业法人授权委托书
2014/09/25 职场文书
管理人员岗位职责
2015/02/14 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python