使用canvas实现贪吃蛇


文章目录

  • 使用canvas实现贪吃蛇
  • 前言
  • 一、组件版本&项目结构
  • 二、代码讲解
    • 1. 移动snake
      • 1.1 代码
      • 1.2 知识点
    • 2. 生成被吃者AO
      • 2.1 代码
      • 2.2 知识点
    • 3. 吃掉AO&蛇身加长
      • 3.1 代码
      • 3.2 知识点
  • 总结

前言

本文章讲述如何使用vue+canvas实现经典游戏贪吃蛇。体验游戏贪吃蛇 - AO,源码仅供学习参考。你需要知道vue框架,element ui帮助你快速快速开发。


一、组件版本&项目结构

查看详细


二、代码讲解

以下讲解自己写的代码,不会讲解canvas具体怎么实现的。也许可以参考以前的文章使用canvas 的资料

1. 移动snake

1.1 代码

//监听键盘事件
document.onkeydown = this.keyDown;
/*** 方向键控制元素移动函数* @param event 事件*/
keyDown(event) {if (!this.checkActionStartStatus()) return;let keyCodes = [37, 39, 38, 40];if (keyCodes.indexOf(event.keyCode) < 0) return;this.keyCode = event.keyCode;
}
/*** 移动*/
moveSnake() {//清除末尾let tail = this.snakeBodyArr[this.snakeBodyArr.length - 1];this.ctx.clearRect(tail.x, tail.y, tail.w, tail.h);//获取图片this.snakeBodyArr[0].keyCode = this.keyCode;//每一个方块都赋值前一个,实现移动一步for (let index = this.snakeBodyArr.length - 1; index > 0; index--) {this.snakeBodyArr[index].x = this.snakeBodyArr[index - 1].x;this.snakeBodyArr[index].y = this.snakeBodyArr[index - 1].y;this.snakeBodyArr[index].keyCode = this.snakeBodyArr[index - 1].keyCode;}switch (this.keyCode) {  // 获取当前按下键盘键的编码case 37 :  // 按下左箭头键,向左移动this.left();break;case 39 :  // 按下右箭头键,向右移动this.right();break;case 38 :  // 按下上箭头键,向上移动this.up();break;case 40 :  // 按下下箭头键,向下移动this.down();break;default:return;}this.drawSnake();
}
/*** 往右*/
right() {//是否超出右边界限if (this.snakeBodyArr[0].x + this.snakeBodyArr[0].w >= this.canvas.width) {if (!this.touchSnakeWall) this.gameOver();this.snakeBodyArr[0].x = 0;} else {this.snakeBodyArr[0].x += this.snakeBodyArr[0].w;}
},
/*** 往左*/
left() {//超出左边界限if (this.snakeBodyArr[0].x <= 0) {if (!this.touchSnakeWall) this.gameOver();this.snakeBodyArr[0].x = this.canvas.width - this.snakeBodyArr[0].w;} else {this.snakeBodyArr[0].x -= this.snakeBodyArr[0].w;}
},
/*** 往上*/
up() {//超出上边界限if (this.snakeBodyArr[0].y <= 0) {if (!this.touchSnakeWall) this.gameOver();this.snakeBodyArr[0].y = this.canvas.height - this.snakeBodyArr[0].h;} else {this.snakeBodyArr[0].y -= this.snakeBodyArr[0].h;}
},
/*** 往下*/
down() {//超出下边界限if (this.snakeBodyArr[0].y + this.snakeBodyArr[0].h >= this.canvas.height) {if (!this.touchSnakeWall) this.gameOver();this.snakeBodyArr[0].y = 0;} else {this.snakeBodyArr[0].y += this.snakeBodyArr[0].h;}
}

1.2 知识点

  • snake每一块身体组合在一起就需要使用数组。
  • 移动snake的规则1:移动头部(改变数组下标0,xy的数据)使用到right(),left(),up(),down()方法
  • 规则2:body向前移动一个(从下标1开始赋值前一位)这样就能实现每一块身体能向前动一步
  • 规则3:清除末尾。也就是清除上一次在的位置

2. 生成被吃者AO

2.1 代码

/*** 画出AO*/
ao() {//随机生成坐标let randomX = (Math.round(Math.random() * (this.canvas.width - this.aoWidth)));let randomY = (Math.round(Math.random() * (this.canvas.height - this.aoHeight)));let aoImg = this.getAOImg();this.ctx.drawImage(aoImg, randomX, randomY, this.aoWidth, this.aoHeight);this.aoArr.push({aoImg: aoImg,x: randomX,y: randomY,w: this.aoWidth,h: this.aoHeight,//1代表未被吃掉status: 1})
}

2.2 知识点

  • 获取canvas宽高,在canvas的范围内随机生成一个AO
  • 保存生成过的AO对象设置一个status为正常状态

3. 吃掉AO&蛇身加长

3.1 代码

//查找啊哦的位置
let aoObj = this.aoArr.find(o =>//把区间放大 小于AO+本身宽度 && 大于AO起点 && 有效的AOo.x + this.aoWidth >= snakeBodyHead.x && o.x - snakeBodyHead.w <= snakeBodyHead.x&& o.y + this.aoHeight >= snakeBodyHead.y && o.y - snakeBodyHead.h <= snakeBodyHead.y&& o.status === 1
);
//找到了AO位置把它吃掉
if (aoObj && aoObj.status === 1) {this.ctx.clearRect(aoObj.x, aoObj.y, this.aoWidth, this.aoHeight);//状态设置已被吃掉aoObj.status = 2;//蛇身+1let tail = this.snakeBodyArr[this.snakeBodyArr.length - 1];this.snakeBodyArr.push({fillStyle: "#" + Math.round(Math.random() * 10000),//每块身体颜色x: tail.x,y: tail.y,w: this.snakeHead.w,h: this.snakeHead.h});//记录已被吃掉的AOthis.aoDieNum++;//500ms出现下一个AOsetTimeout(() => {this.ao();}, 500);
}

3.2 知识点

  • 判断蛇头是否触碰到屏幕上的AOthis.aoArr.find
  • 查到AO后清除被吃掉的AO,status设置为2。下次就不会在被find到
  • this.snakeBodyArr[this.snakeBodyArr.length - 1]找到最后一个蛇体,添加到身体末尾
  • setTimeout停顿一些时间再重新生成一个新的AO

总结

以上就是实现贪吃蛇主要代码片段,无聊且有趣。

使用canvas实现贪吃蛇相关推荐

  1. php开发h5游戏,H5的canvas实现贪吃蛇小游戏

    这次给大家带来H5的canvas实现贪吃蛇小游戏,H5的canvas实现贪吃蛇小游戏注意事项有哪些,下面就是实战案例,一起来看一下. 本文介绍了H5 canvas实现贪吃蛇小游戏,分享给大家,具体如下 ...

  2. html5实现贪吃蛇小游戏,H5 canvas实现贪吃蛇小游戏

    本文介绍了h5 canvas实现贪吃蛇小游戏,分享给大家,具体如下: 实现效果如下 实现思路: ps:这个只是思路,详细可看代码注释 一.先把蛇画出来 定义一下蛇的结构,用一个数组保存一堆矩形,包含蛇 ...

  3. Canvas实现贪吃蛇小游戏(面向对象)

    Canvas实现贪吃蛇小游戏 我们常常在网页上制作的小游戏都是通过Canvas实现的,虽然我们也可以使用DOM来实现,但是这样会更加的节约资源. 我们书写这个小游戏的目的主要是为了适应js中关于面向对 ...

  4. canvas 绘制贪吃蛇游戏

    效果如下 代码 <!DOCTYPE html> <html lang="zh_CN"> <head><meta charset=" ...

  5. 基于html5贪吃蛇小游戏,使用HTML5 Canvas制作贪吃蛇小游戏

    近重要在研究OAuth2,等demo完成了,会给大家来一个专题分享. 看到我身边的一个同事在玩 蛇蛇争霸 感觉蛮有意思的,这里找了一个 贪吃蛇的游戏 分享给大家. 按理说canvas与其应用是老生常谈 ...

  6. HTML5 Canvas实现贪吃蛇(二)

    有了一个实心圆,就可想想大致的思路了. 游戏思路 全局变量:global 浏览器类型,区别PC浏览器和手机端的浏览器,broswerType: canvas的长和宽,paleWidth,paleHei ...

  7. 还记得诺基亚手机上贪吃蛇小游戏吗?

    诺基亚手机上的经典游戏 1. 贪吃蛇 2. 跳跳球 3. 熊猫爬树 还有俄罗斯方块等经典游戏,我就不11介绍了,欢迎大家在评论区中写下自己童年记忆深刻的游戏吧,如果写下了,希望大家可以动手去找到相应的 ...

  8. JavaScript 游戏系列(一): 贪吃蛇

    JavaScript 游戏系列目录 贪吃蛇 文章目录 JavaScript 游戏系列目录 一.实例截图 二.游戏分析 三.HTML 与 CSS 文件 1.入口文件 2.样式文件 四.游戏逻辑的实现 1 ...

  9. 如何用html做一个贪吃蛇,如何用HTML5制作贪吃蛇游戏

    如何用HTML5制作贪吃蛇游戏 发布时间:2020-07-09 15:09:59 来源:亿速云 阅读:122 作者:Leah 如何用HTML5制作贪吃蛇游戏?很多新手对此不是很清楚,为了帮助大家解决这 ...

  10. JavaScript+ Canvas开发趣味小游戏《贪吃蛇》

    一.效果展示 二.<贪吃蛇>基本实现思路 蛇头部分+蛇身体部分:采用对象形式来存储坐标,并将每个坐标对象放到一个snake数组中,方便使用.设置每个方格宽度30px,高度30px,画布高度 ...

最新文章

  1. pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数
  2. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)...
  3. 关于installshield安装界面上installshield字样的删除问题
  4. 工业交换机安全性能的必要性
  5. 哈佛终身教授刘军:生活在一个统计学的时代
  6. iPad网页开发教程及规则
  7. 【003】【深入解析Java中volatile关键字的作用】
  8. CCF202109-1 数组推导(100分)【序列处理】
  9. Cisco 安全设备管理工具:SDM
  10. 【转】jquery $.fn $.fx是什么意思
  11. 你的走路姿势正确吗?步态不对牵连多种疾病
  12. Ceph Octopus新版新功能:图形化Dashboard
  13. 钉钉与wcp知识库集成工具
  14. php 跳转qq群代码_Q群自动签到php+java实现
  15. IPv6静态路由设置
  16. 软考中级数据库系统工程师好考吗?
  17. 爱思服务器shsh文件类型,爱思助手SHSH怎么备份 爱思助手SHSH备份教程
  18. jq制作扑克牌图片切换 --
  19. 基于虚拟机的黑群晖NAS+基于虚拟局域网的远程访问
  20. 在Mac OS X上安装使用lazarus 1.6.4

热门文章

  1. 2021年全国大学生计算机能力挑战赛(Java)决赛试题代码(外加部分试题)
  2. 什么是锁?有几种锁?怎么用锁?
  3. Unity入门 简单的3D场景制作
  4. Mac软件打开时闪退怎么办?苹果电脑软件崩溃解决办法
  5. 最新北京人才公寓申请流程,技术员的福利~
  6. MD5加密 生成32位md5码
  7. 夏天计算机自动关机,电脑频繁自动关机,原因可能出在这
  8. 投影仪家用推荐最新?投影仪什么牌子性价比比较高
  9. 本地音乐如何导入apple_如何将自己的音乐添加到Apple Music
  10. 初识Centos7.5