js实现贪吃蛇游戏 canvas绘制地图


Posted in Javascript onSeptember 09, 2020

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

js实现贪吃蛇游戏 canvas绘制地图

思路

400px * 400px的地图,每20px*20px分成单元格绘制蛇身
每次移动即更换尾 部 头部的颜色

js实现贪吃蛇游戏 canvas绘制地图

全部代码

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <style>
 html,
 body {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
 }
 </style>
</head>

<body>
 <canvas width="400" height="400" style="background-color: #362E3D;">给我换chromium</canvas>

 <script>
 const map = document.getElementsByTagName('canvas')[0].getContext('2d'); // 数组存蛇身位置 一行 1-20 二行21-40 总共20*20
 var snake = [23, 22, 21]; // 数组头部蛇头 后部蛇尾
 var direction = 1; // 1右 -1左 -20上 20下
 var flag = 1; // 解决快速键盘bug
 var food = 50; // 食物位置

 function draw(x, color) {
  map.fillStyle = color;
 
 //用1-400标识没找到通用像素换算公式 最后一列分开计算
  if (x % 20 == 0) { // 最后一列
  map.fillRect(380 + 2, Math.floor(x / 21) * 20 + 2, 18, 18); // 使1-400的块标志对应像素点
  } else { // 其余列
  map.fillRect((x % 20 - 1) * 20 + 2, Math.floor(x / 20) * 20 + 2, 18, 18);
  }
  flag = 1; // draw()完后才能改变direction
 }

 let len = snake.length;
 for (let i = 0; i < len; i++)
  draw(snake[i], "#FDE5C5");

 (function () {
  let head = snake[0] + direction;

  if (head % 20 == 1 && direction == 1 || head % 20 == 0 && direction == -1 || head < 1 || head > 400 ||
  snake.includes(head))
  return alert('GG');
  snake.unshift(head);

  draw(head, "#FDE5C5");

  if (head == food) {
  while (snake.includes(food = Math.floor(Math.random() * 400 + 1)));
  // arr.includes 有的话返回true 否则false
  } else { //正常移动 没吃到才改变尾部颜色
  draw(snake.pop(), "#362E3D");
  }
  draw(food, "#EB1A4B");

  setTimeout(arguments.callee, 100); // arguments.callee 代表函数名 调用匿名函数自己
 })();

 document.onkeydown = function (event) {
  event = event || window.event; // ie中是windo.event
  if (flag) { // draw执行后(蛇移动后)才可以改变direction
  switch (event.keyCode) {
   case 37:
   direction != 1 ? direction = -1 : 0;
   break;
   case 38:
   direction != 20 ? direction = -20 : 0;
   break;
   case 39:
   direction != -1 ? direction = 1 : 0;
   break;
   case 40:
   direction != -20 ? direction = 20 : 0;
   break;
  }
  }
  flag = 0; // 等待下一次draw执行
 }
 </script>
</body>


</html>

解决 连续快速键盘bug
方向键上下左右实际改变 direction 的值,如果再蛇下一次移动之前连续改变,有可能会产生反向吃自己的bug
所以加入flag 详情看源码

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

Javascript 相关文章推荐
js 获取计算后的样式写法及注意事项
Feb 25 Javascript
jQuery中ajax的使用与缓存问题的解决方法
Dec 19 Javascript
js 立即调用的函数表达式如何写
Jan 12 Javascript
js拆分字符串并将分割的数据放到数组中的方法
May 06 Javascript
基于slideout.js实现移动端侧边栏滑动特效
Nov 28 Javascript
整理关于Bootstrap排版的慕课笔记
Mar 29 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
Apr 13 Javascript
vue2 自定义动态组件所遇到的问题
Jun 08 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
Oct 27 Javascript
解决js ajax同步请求造成浏览器假死的问题
Jan 18 Javascript
基于小程序请求接口wx.request封装的类axios请求
Jul 02 Javascript
Javascript call及apply应用场景及实例
Aug 26 Javascript
Vue路由 重定向和别名的区别说明
Sep 09 #Javascript
JavaScript常用8种数组去重代码实例
Sep 09 #Javascript
Vue项目配置跨域访问和代理proxy设置方式
Sep 08 #Javascript
如何使用jQuery操作Cookies方法解析
Sep 08 #jQuery
js实现右键弹出自定义菜单
Sep 08 #Javascript
vue 使用原生组件上传图片的实例
Sep 08 #Javascript
使用js和canvas实现时钟效果
Sep 08 #Javascript
You might like
初级的用php写的采集程序
2007/03/16 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP取余函数介绍MOD(x,y)与x%y
2014/05/15 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
js类型检查实现代码
2010/10/29 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
对python调用RPC接口的实例详解
2019/01/03 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
详解Python yaml模块
2020/09/23 Python
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
网络技术支持面试题
2013/04/22 面试题
网络专业学生个人的自我评价
2013/12/16 职场文书
企业给企业的表扬信
2014/01/13 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
党员转正申请报告
2015/05/15 职场文书