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 学习笔记(十一)
Jan 19 Javascript
jquery 1.4.2发布!主要是性能与API
Feb 25 Javascript
jquery ajax请求实例深入解析
Nov 26 Javascript
jquery 删除字符串最后一个字符的方法解析
Feb 11 Javascript
javascript中解析四则运算表达式的算法和示例
Aug 11 Javascript
JS实现跟随鼠标的链接文字提示框效果
Aug 06 Javascript
jquery动态遍历Json对象的属性和值的方法
Jul 27 Javascript
Angularjs中的ui-bootstrap的使用教程
Feb 19 Javascript
layui table 表格模板按钮的实例代码
Sep 21 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 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中的boolean(布尔)类型详解
2013/10/28 PHP
php中spl_autoload详解
2014/10/17 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
基于jquery的cookie的用法
2011/01/10 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
八年级音乐教学反思
2014/01/09 职场文书
总经理助理职责
2014/02/04 职场文书
公司表扬稿范文
2015/05/05 职场文书
九九重阳节致辞
2015/07/31 职场文书
安全生产学习心得体会
2016/01/18 职场文书
导游词之西递宏村
2019/12/10 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS