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 相关文章推荐
javascript获取设置div的高度和宽度兼容任何浏览器
Sep 22 Javascript
JavaScript实现的购物车效果可以运用在好多地方
May 09 Javascript
javascript获取当前鼠标坐标的方法
Jan 10 Javascript
简单分析javascript面向对象与原型
May 21 Javascript
在JavaScript中操作时间之getMonth()方法的使用
Jun 10 Javascript
解析Vue2.0双向绑定实现原理
Feb 23 Javascript
Bootstrap实现省市区三级联动(亲测可用)
Jul 26 Javascript
JavaScript实现单图片上传并预览功能
Sep 30 Javascript
浅谈Ant Design Pro 菜单自定义 icon
Nov 17 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 Javascript
15个值得收藏的JavaScript函数
Sep 15 Javascript
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
JavaScript canvas实现跟随鼠标事件
2020/02/10 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
Python中字符串的修改及传参详解
2016/11/30 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
Python处理PDF与CDF实例
2020/02/26 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
煤矿安全演讲稿
2014/05/09 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
环保标语口号
2014/06/13 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
婚宴来宾致辞
2015/07/28 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
生活小常识广播稿
2015/08/19 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle