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 相关文章推荐
js 新浪的一个图片播放图片轮换效果代码
Jul 15 Javascript
一个轻量级的javascript库 pj介绍
Dec 19 Javascript
模拟select的代码
Oct 19 Javascript
JavaScript 更严格的相等 [译]
Sep 20 Javascript
浅谈Javascript中匀速运动的停止条件
Dec 19 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 Javascript
省市二级联动小案例讲解
Jul 24 Javascript
简单的渐变轮播插件
Jan 12 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
Dec 20 Javascript
zTree树形菜单交互选项卡效果的实现方法
Dec 25 Javascript
Vue自定义属性实例分析
Feb 23 Javascript
p5.js绘制旋转的正方形
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
火车头采集器3.0采集图文教程
2007/03/17 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
Javascript改变CSS样式(局部和全局)
2013/12/18 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
通过实例讲解JS如何防抖动
2019/06/15 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
详解vue 组件注册
2020/11/20 Vue.js
Python3简单实例计算同花的概率代码
2017/12/06 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
Python实现爬取并分析电商评论
2020/06/19 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
《苏珊的帽子》教学反思
2014/04/07 职场文书
八项规定对照检查材料
2014/08/31 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android