有了一个实心圆,就可想想大致的思路了。

游戏思路

全局变量:global

  • 浏览器类型,区别PC浏览器和手机端的浏览器,broswerType;
  • canvas的长和宽,paleWidth,paleHeight;
  • 实心圆半径,radius;
  • 蛇身前进步长,step;

蛇:snake

  • 蛇身的组成是一个一个实心圆,所以最核心的属性就是长度,设为length;
  • 蛇需要移动,就需要一个前进的方向,设为head;
  • 需要在canvas中绘制蛇身,需要一系列坐标,需要一个数组来存储这些坐标,设为body;
  • 考虑到后续可能要改变蛇前进的速度,设定速度speed;
  • 设置一个定时移动的方法,moveTimer;

食物:food

  • 作为游戏的一个结束条件,给食物设定一个总量,totalNum;
  • 同时可能会放置多个食物,设定一个同时存在的食物数量concurrenctNum;
  • 吞食一个食物之后蛇身增加的长度,energy;
  • 同时放置多个食物时,为了控制食物数量,检测是否生成新食物,将现存食物数量保存下来,presentFoodNum;
  • 绘制多个食物,需要数组存储食物坐标,foodsLocation;

这里有个比较关键的问题就是蛇身具体怎么动起来。首先肯定是根据重绘canvas来让它动起来的,那么就需要两次绘制中snake.body的坐标点有变化,这个变化是根据snake.head这个方向来的,这里约定:0-上,1-下,2-左,3-右。具体到坐标的变化,很直观的想法是后面一个坐标替代前面一个坐标,然后再新增一个坐标,但这样一来,是比较复杂的。我采取的做法是:

  • 根据snake.head生成一个新的圆-newpart;
  • 将newpat插入snake.body;
  • 通过snake.length截取新的蛇身,完成绘制;

这样一来,算法复杂度是很小的。接下来,代码码起来。

首先,绘制边界:

c.width = global.paleWidth;
c.height = global.paleHeight;
cc.beginPath();
cc.fillStyle = "#FFFF00";
cc.lineWidth = 4;
cc.moveTo(0, 0);
cc.lineTo(global.paleWidth - 3, 0);
cc.lineTo(global.paleWidth - 3, global.paleHeight - 3);
cc.lineTo(0, global.paleHeight - 3);
cc.lineTo(0, 0);
cc.stroke();
cc.closePath();

接着,可以在点上面随机找一个绘制一个圆,同时把这个坐标放入snake.body:

var initX = Math.floor(Math.random() * (global.paleWidth + 1)) / 3 * 3;
var initY = Math.floor(Math.random() * (global.paleHeight + 1)) / 3 * 3;
var initLocation = [initX, initY];
snake.body.push(initLocation);
snake.paintCycle(initLocation, global.lineWidth, global.radius);

同时,设置一个定时方法,执行蛇的移动动作:

snake.moveTimer = setInterval(snake.move, 600);

下面构建move方法:

move: function() {switch (snake.head) {case 0:var newPart = [snake.body[snake.body.length - 1][0], snake.body[snake.body.length - 1][1] - global.step];if (newPart[1] < 0)newPart[1] += global.paleHeight;break;case 1:var newPart = [snake.body[snake.body.length - 1][0], snake.body[snake.body.length - 1][1] + global.step];if (newPart[1] > global.paleHeight)newPart[1] -= global.paleHeight;break;case 2:var newPart = [snake.body[snake.body.length - 1][0] - global.step, snake.body[snake.body.length - 1][1]];if (newPart[0] < 0)newPart[0] += global.paleWidth;break;case 3:var newPart = [snake.body[snake.body.length - 1][0] + global.step, snake.body[snake.body.length - 1][1]];if (newPart[0] > global.paleWidth)newPart[0] -= global.paleWidth;break;}snake.body.push(newPart);cc.clearRect(3, 3, global.paleWidth - 10, global.paleHeight - 10);if (snake.body.length > snake.length) {snake.body = snake.body.splice(1, snake.length);}for (i = 0; i < snake.body.length; i++) {snake.paintCycle(snake.body[i], 5.6, 3);}
}

这样,蛇身就会动起来了。接下来就需要设计食物了。

HTML5 Canvas实现贪吃蛇(二)相关推荐

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

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

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

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

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

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

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

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

  5. c/c++游戏编程之控制台贪吃蛇(二)

    c/c++游戏编程之控制台贪吃蛇(一) c/c++游戏编程之控制台贪吃蛇(二) 为了解决"闪屏"问题,我们不再使用system("cls")进行清屏,而是直接用 ...

  6. html5+JavaScript实现贪吃蛇游戏(可查看排行榜和个人历史记录)

    先看结果截图(界面很丑,但是主要是为了贪吃蛇游戏算法设计和历史记录.排行榜功能的实现,希望以后不被产品经理打,哈哈) 功能描述: 1.开始游戏页面之前输入玩家姓名 2.历史记录:可以查看之前自己玩过的 ...

  7. html贪吃蛇自动走,分享一个用html5实现的贪吃蛇特效代码

    本篇小编为大家分享一个用html5实现的简单贪吃蛇特效代码,喜欢的小伙伴们可以看一下 Snake //内置大量BUG,I'm sorry. var lev=100; //定时器间隔时间 var num ...

  8. html5实现贪吃蛇,分享一个用html5实现的贪吃蛇特效代码

    本篇小编为大家分享一个用html5实现的简单贪吃蛇特效代码,喜欢的小伙伴们可以看一下 Snake //内置大量BUG,I'm sorry. var lev=100; //定时器间隔时间 var num ...

  9. HTML5小游戏贪吃蛇分析与实现

    昨天下午研发中心总结大会,晚上大家一起吃饭. 多少面孔成了曾经,多人新人充满憧憬,明年又会是如何.年年岁岁花相似,岁岁年年人不同. 晚上大家吃饭,我们桌不喝酒. 口味虽然淡了点,勉强也还算尽兴. 8点 ...

最新文章

  1. Blender数字雕刻终极指南学习教程
  2. CSS垂直居中解决方案
  3. 【数据结构-线性表】顺序表和链表(几种链表操作技巧+几种链表形式)
  4. 直播 | AAAI 2021:文本对抗攻防中的对抗训练方法
  5. [导入]javascript身份证号码验证函数支持带x
  6. 《深入浅出数据分析》第九章——R语言
  7. Qt工作笔记-使用SQL中的LIMIT进行数据分页
  8. 信息学奥赛一本通 1163:阿克曼(Ackmann)函数
  9. 7-2 整除分块 (15 分)
  10. 用注解给映射视图的类创建联合主键
  11. ubuntu 打不开商店怎么办
  12. 进制转换的方法 详解
  13. cockroachdb设计翻译
  14. 贪心算法 看这一篇就够了
  15. mysql报警脚本_MySQL Server 报警脚本
  16. 【吴恩达deeplearning.ai】Course 5 - 2.10 词嵌入除偏
  17. Python与C++语法比较--字符串篇
  18. 华为认证是自学还是报班合适
  19. 【你知道maven么?】
  20. 修改浏览器User-Agent

热门文章

  1. php 生成rss源,网站RSS源自动创建及调用方法(PHP版)
  2. Django学习日记3
  3. 华为IAD设备命令配置IP地址
  4. arduino UNO通过AT指令控制esp8266连接WiFi及onenet云平台
  5. 【JY】LS-DYNA求解效率深度测评│六种规模,本地VS云端5种不同硬件配置
  6. 文明之光二册-读书笔记
  7. 费劲心思却走向编程地狱的4个陷阱
  8. 应用在射频条件下木材干燥试验过程中温湿度和压力监控系统中的光纤传感器
  9. http和https工作原理
  10. 论文投稿指南——中文核心期刊推荐(电子、通信技术3)