原生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 相关文章推荐
ExtJS 2.0实用简明教程 之Ext类库简介
Apr 29 Javascript
IE下使用cloneNode注意事项分享
Nov 22 Javascript
让你的博客飘雪花超出屏幕依然看得见
Jan 04 Javascript
浅谈 jQuery 事件源码定位问题
Jun 18 Javascript
JavaScript Math.round() 方法
Dec 18 Javascript
AngularJS中使用three.js的实例详解
Jul 21 Javascript
vuejs 单文件组件.vue 文件的使用
Jul 28 Javascript
vue项目中的webpack-dev-sever配置方法
Dec 14 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
vue组件中实现嵌套子组件案例
Aug 31 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
Oct 29 Javascript
如何在vue 中使用柱状图 并自修改配置
Jan 21 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定时自动生成静态HTML的实现代码
2010/06/20 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
thinkPHP5分页功能实现方法分析
2017/10/25 PHP
PHP与以太坊交互详解
2018/08/24 PHP
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
Javascript call及apply应用场景及实例
2020/08/26 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
重命名批处理python脚本
2013/04/05 Python
Python中变量交换的例子
2014/08/25 Python
Python复制目录结构脚本代码分享
2015/03/06 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
python支持多继承吗
2020/06/19 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
参观考察邀请函范文
2014/01/29 职场文书
网络信息安全承诺书
2014/03/26 职场文书
心理健康日活动总结
2014/05/08 职场文书
校园文明倡议书
2014/05/16 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
五年级作文之想象作文
2019/10/30 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript