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获得CheckBoxList选中的数量
Oct 27 Javascript
Dom 是什么的详细说明
Oct 25 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 Javascript
JavaScript基本语法学习教程
Jan 14 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
Aug 15 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
Sep 18 Javascript
图文介绍Vue父组件向子组件传值
Feb 17 Javascript
JavaScript继承定义与用法实践分析
May 28 Javascript
微信小程序实现多行文字超出部分省略号显示功能
Oct 23 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 分页分组类
2009/12/10 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
python list转dict示例分享
2014/01/28 Python
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
python中as用法实例分析
2015/04/30 Python
Python变量和数据类型详解
2017/02/15 Python
Python内置函数reversed()用法分析
2018/03/20 Python
python实现括号匹配的思路详解
2018/08/23 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
python模块导入的方法
2019/10/24 Python
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
Python面试题集
2012/03/08 面试题
园林资料员岗位职责
2013/12/30 职场文书
人事部经理岗位职责
2014/03/07 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
Python PIL按比例裁剪图片
2022/05/11 Python