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初学困境—js初学
Dec 29 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
Sep 06 Javascript
js对象的构造和继承实现代码
Dec 05 Javascript
JavaScript中prototype为对象添加属性的误区介绍
Oct 15 Javascript
常见表单重复提交问题整理及解决方法
Nov 13 Javascript
详解JavaScript中的自定义事件编写
May 10 Javascript
JS与jQuery实现隔行变色的方法
Sep 09 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
Jul 12 jQuery
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 Javascript
javascript防抖函数debounce详解
Jun 11 Javascript
VUEX采坑之路之获取不到$store的解决方法
Nov 08 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
Apr 14 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 获取完整url地址
2008/12/20 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
jQuery的slideToggle方法实例
2013/05/07 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
处理Python中的URLError异常的方法
2015/04/30 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
日本无添加化妆品:HABA
2016/08/18 全球购物
美国温暖商店:The Warming Store
2018/12/15 全球购物
什么是View State?
2013/01/27 面试题
《回乡偶书》教学反思
2014/04/12 职场文书
书法大赛策划方案
2014/06/04 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
redis cluster支持pipeline的实现思路
2021/06/23 Redis
PHP设计模式(观察者模式)
2021/07/07 PHP
Android自定义双向滑动控件
2022/04/19 Java/Android