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 相关文章推荐
Tips 带三角可关闭的文字提示
Oct 06 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
Nov 19 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
Sep 29 Javascript
jQuery+css实现百度百科的页面导航效果
Dec 16 Javascript
常见JS验证脚本汇总
Dec 01 Javascript
jQuery mobile 移动web(4)
Dec 20 Javascript
jQuery Mobile操作HTML5的常用函数总结
May 17 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
Jun 29 Javascript
详解js中call与apply关键字的作用
Nov 21 Javascript
Vue自定义指令拖拽功能示例
Feb 17 Javascript
uni-app之APP和小程序微信授权方法
May 09 Javascript
vue el-upload上传文件的示例代码
Dec 21 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 动态生成静态HTML页面示例代码
2014/01/15 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
php和html的区别点详细总结
2019/09/24 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
Open and Print a Word Document
2007/06/15 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
JS实现炫酷轮播图
2020/11/15 Javascript
Python中模块string.py详解
2017/03/12 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
专科毕业生就业推荐信
2013/11/01 职场文书
护士岗位职责
2014/02/16 职场文书
法定代表人授权委托书
2014/04/04 职场文书
企业精神口号
2014/06/11 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS