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 相关文章推荐
javascript设计模式之工厂模式示例讲解
Mar 04 Javascript
写给小白的JavaScript引擎指南
Dec 04 Javascript
js实现select下拉框菜单
Dec 08 Javascript
深入理解JavaScript函数参数(推荐)
Jul 26 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
Sep 05 Javascript
javascript中Number的方法小结
Nov 21 Javascript
javascript数据结构中栈的应用之符号平衡问题
Apr 11 Javascript
JavaScript之promise_动力节点Java学院整理
Jul 03 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 Javascript
WebSocket的通信过程与实现方法详解
Apr 29 Javascript
Vue脚手架的简单使用实例
Jul 10 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
Dec 29 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 验证登陆类分享
2015/03/13 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
再论Javascript的类继承
2011/03/05 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
php结合js实现多条件组合查询
2019/05/28 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
安全生产检查通报
2014/01/29 职场文书
开学典礼决心书
2014/03/11 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
售房协议书范本2014
2014/10/23 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
React中的Context应用场景分析
2021/06/11 Javascript
Python实现照片卡通化
2021/12/06 Python