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 相关文章推荐
基于Vue.js实现简单搜索框
Mar 26 Javascript
JS实现的系统调色板完整实例
Dec 21 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
详解Angular2组件之间如何通信
Jun 22 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
Aug 19 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
Aug 31 Javascript
微信小程序的开发范式BeautyWe.js入门详解
Jul 10 Javascript
JS函数参数的传递与同名参数实例分析
Mar 16 Javascript
VSCode搭建Vue项目的方法
Apr 30 Javascript
详解JSON.stringify()的5个秘密特性
May 26 Javascript
JS代码简洁方式之函数方法详解
Jul 28 Javascript
vue 修改 data 数据问题并实时显示操作
Sep 07 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
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
php jsonp单引号转义
2014/11/23 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
JS中表单的使用小结
2014/01/11 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
2014年最火的Node.JS后端框架推荐
2014/10/27 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
Python判断文本中消息重复次数的方法
2016/04/27 Python
python字符串中的单双引
2017/02/16 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
python实现数据写入excel表格
2018/03/25 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
python 装饰器的使用示例
2020/10/10 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
打架检讨书100字
2014/01/08 职场文书
规划编制实施方案
2014/03/15 职场文书
班级口号大全
2014/06/09 职场文书
岗位说明书怎么写
2014/07/30 职场文书
总经理检讨书
2014/09/15 职场文书
公司员工手册范本
2015/05/14 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
一文搞懂Python Sklearn库使用
2021/08/23 Python