原生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 相关文章推荐
javascript 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
js post方式传递提交的实现代码
May 31 Javascript
JS将制定内容复制到剪切板示例代码
Feb 11 Javascript
jQuery中:reset选择器用法实例
Jan 04 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
May 26 Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 Javascript
巧用canvas
Jan 21 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
Feb 20 Javascript
微信小程序 开发之顶部导航栏实例代码
Feb 23 Javascript
JS实现AES加密并与PHP互通的方法分析
Apr 19 Javascript
12个非常有用的JavaScript技巧
May 17 Javascript
vue-cli webpack 引入swiper的操作方法
Sep 15 Javascript
微信小程序 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破解防盗链图片的一个简单方法
2014/06/07 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
用一段js程序来实现动画功能
2007/03/06 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python遍历pandas数据方法总结
2018/02/09 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
Python创建或生成列表的操作方法
2019/06/19 Python
简单了解python单例模式的几种写法
2019/07/01 Python
python文字转语音实现过程解析
2019/11/12 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
幼儿园家长会欢迎词
2014/01/09 职场文书
责任心演讲稿
2014/05/14 职场文书
初中班级口号
2014/06/09 职场文书
运动会演讲稿100字
2014/08/25 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
工程安全生产协议书
2014/11/21 职场文书
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
windows系统搭建WEB服务器详细教程
2022/08/05 Servers