javascript实现贪吃蛇小游戏


Posted in Javascript onJuly 28, 2020

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

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
</body>
<script>
 // 贪吃蛇:
 // 键盘的方向键,控制蛇的方向,碰撞食物,实现增加长度的效果,撞到墙壁或自身,游戏结束
 // 分析:
 // 地图:提供边界
 // 食物:随机出现,可以被碰撞(坐标重复)
 // 蛇:初始的固定长度,移动,改变方向,碰撞食物,碰撞墙,碰撞自己(坐标重复)
 
 class Map{
 constructor(){
 // 提前设定将来的地图的样式数据
 this.w = 800;
 this.h = 400;
 this.c = "#ccc";
 // 执行创建地图方法
 this.createEle();
 }
 createEle(){
 this.mapEle = document.createElement("div");
 this.mapEle.style.cssText = `width:${this.w}px;height:${this.h}px;background:${this.c};margin:0 auto;position:relative;border:solid 10px black;`;
 document.body.appendChild(this.mapEle);
 }
 }
 class Food{
 constructor(){
 // 提前设定将来的食物的样式数据
 this.w = 20;
 this.h = 20;
 this.c = "red";
 this.x = 0;
 this.y = 0;
 // 执行创建食物方法
 this.createEle();
 }
 createEle(){
 this.foodEle = document.createElement("div");
 // 设置left和top时要注意,将地图假设成了20个像素的一个格子,注意位置的换算
 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;`;
 // console.log(m.mapEle);
 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(){
 // 1.提前设定将来的蛇节的样式数据
 this.w = 20;
 this.h = 20;
 // 2.因为蛇由多个设计组成,每个蛇节都有自己的独立信息,所以数据结构设计成如下格式
 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()
 }];

 // 7-1.提前设置默认方向
 this.d = "right";

 // 3.开始创建蛇节元素,设置样式
 this.createEle();
 }
 createEle(){
 // 4.使用循环多次创建,因为有多个蛇节
 for(var i=0;i<this.body.length;i++){
 // 12.创建之前,需要判断元素是否已经存在,如果已经存在,不需要创建
 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;`;
 }
 // 找到蛇头
 this.body[0].ele.innerHTML = "0";

 // 5.延迟之后,开始移动
 setTimeout(()=>{
 this.move();
 },300);
 }
 move(){
 // 6.从最后一个元素向前找前一个元素的坐标,直到第一个
 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;
 }
 // 7.第一个元素根据默认方向,决定想哪走
 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;
 }
 
 // 8.移动过程中,判断是否撞到边界,任意一个边界都不行
 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的停止,结束程序
 return;
 }

 // 9.移动过程中,判断是否与食物的坐标重复,如果重复
 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();
 }

 // 10.移动过程中,判断蛇头的坐标是否与某个任意一个蛇节的坐标重复
 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;
 }
 }

 // 以上只是在修改坐标,生效了么?设置回去了么?
 // 走的过程中有可能吃到食物,增加一个蛇节(元素),创建元素
 // 11.所以,使用创建蛇节方法,重新设置蛇节的位置以及判断是否需要创建新元素
 this.createEle();
 }
 direct(type){
 // 14.处理键盘穿件来的code值
 // 处理之前要先判断,当前是否按下了相反方向
 // 如果是相反方向,直接结束判断,不执行
 // 如果不是相反方向,改变初始的默认方向
 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();
 // 为了测试,先用计时器,重复执行,看一看随机效果
 // setInterval(() => {
 f.randomPos();
 // }, 500);

 var s = new Snake();
 // 13.当按下键盘时,将按下的键盘的code值,传给蛇的专属处理方法
 document.onkeydown = function(eve){
 var e = eve || window.event;
 var code = e.keyCode || e.which;
 s.direct(code);
 }


 // 因为后期要做不允许掉头的效果
 // 所以,采取当前方法:两个分支处理方向


</script>
</html>

javascript实现贪吃蛇小游戏

更多有趣的经典小游戏实现专题,分享给大家:

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

Javascript 相关文章推荐
基于jquery的代码显示区域自动拉长效果
Dec 07 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
Mar 17 Javascript
javascript事件模型实例分析
Jan 30 Javascript
JS+CSS实现美化的下拉列表框效果
Aug 11 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
Nov 19 Javascript
javascript宿主对象之window.navigator详解
Sep 07 Javascript
JS基于递归实现倒计时效果的方法
Nov 26 Javascript
react以create-react-app为基础创建项目
Mar 14 Javascript
angularJs中json数据转换与本地存储的实例
Oct 08 Javascript
使用vue实现多规格选择实例(SKU)
Aug 23 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
May 28 Javascript
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 Javascript
Element DateTimePicker日期时间选择器的使用示例
Jul 27 #Javascript
Js图片点击切换轮播实现代码
Jul 27 #Javascript
在vue中实现echarts随窗体变化
Jul 27 #Javascript
Vue组件跨层级获取组件操作
Jul 27 #Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
Jul 27 #Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
Jul 27 #Javascript
JS的时间格式化和时间戳转换函数示例详解
Jul 27 #Javascript
You might like
PHP图片库imagemagick安装方法
2014/09/23 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
js以对象为索引的关联数组
2010/07/04 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
python删除某个字符
2018/03/19 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
Django进阶之CSRF的解决
2018/08/01 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
python3 enum模块的应用实例详解
2019/08/12 Python
python实现局域网内实时通信代码
2019/12/22 Python
Python如何定义有可选参数的元类
2020/07/31 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
骨干教师培训感言
2014/01/16 职场文书
销售简历自我评价
2014/01/24 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
2014迎国庆演讲稿
2014/09/19 职场文书
2016春节家属慰问信
2015/03/25 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
初中英语教学随笔
2015/08/15 职场文书
pycharm代码删除恢复的方法
2021/06/26 Python