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 相关文章推荐
jquery中防刷IP流量软件影响统计的一点对策
Jul 10 Javascript
你可能不知道的JavaScript的new Function()方法
Apr 17 Javascript
采用call方式实现js继承
May 20 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
May 19 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
Nov 11 Javascript
java必学必会之static关键字
Dec 03 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
Jan 08 Javascript
JavaScript实现点击按钮字体放大、缩小
Feb 29 Javascript
BootStrap 导航条实例代码
May 18 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 Javascript
d3.js 地铁轨道交通项目实战
Nov 27 Javascript
vue-cli4项目开启eslint保存时自动格式问题
Jul 13 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编程每天必学之验证码
2016/03/03 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
javascript 写类方式之十
2009/07/05 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
深入理解Node module模块
2018/03/26 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
python实现俄罗斯方块
2018/06/26 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
Python 实现微信防撤回功能
2019/04/29 Python
Python中@property的理解和使用示例
2019/06/11 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
python中几种自动微分库解析
2019/08/29 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
小班秋游活动方案
2014/02/22 职场文书
特教教师先进事迹
2014/05/21 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
教师远程研修感悟
2015/11/18 职场文书
高中班主任培训心得体会
2016/01/07 职场文书