这次给大家带来H5的canvas实现贪吃蛇小游戏,H5的canvas实现贪吃蛇小游戏注意事项有哪些,下面就是实战案例,一起来看一下。

本文介绍了H5 canvas实现贪吃蛇小游戏,分享给大家,具体如下:

实现效果如下

实现思路:

ps:这个只是思路,详细可看代码注释

一、先把蛇画出来定义一下蛇的结构,用一个数组保存一堆矩形,包含蛇头(红)和蛇身(灰)。

画蛇(初始状态)

二、蛇能动(重点)蛇移动方式:自始至终都只有蛇头在动画一个灰色的方块,位置与蛇头重叠

将这个方块插到数组中蛇头后面一个的位置arrar.splice(0,1,rect)

砍去末尾的方块array.pop()

将蛇头向设定方向移动一格

需要一个保存方向的变量(direction)

根据方向进行移动,一次移动一个格

根据按键改方向

三、随机投放食物需要随机食物的位置

需要判断食物在不在蛇身上。

四、吃食物判断食物是否与蛇头重叠

数组加一个元素(少删除一个元素就是加一个元素)

生成新的食物

五、gameover撞墙判定

装自己判定

Document

#canvas{

box-shadow: 0 5px 40px black;

}

var canvas = document.getElementById('canvas');

var context = canvas.getContext('2d');

//构造对象方块

function Rect (x,y,w,h,color) {

this.x = x;

this.y = y;

this.w = w;

this.h = h;

this.color = color;

}

//画方块的方法

Rect.prototype.draw = function () {

context.beginPath();

context.fillStyle = this.color;

context.rect(this.x,this.y,this.w,this.h);

context.fill();

context.stroke();

}

//构造对象蛇

function Snake () {

//定义一个空数组存放组成整蛇的方块对象

var snakeArray = [];

//画出4个方块,设置成灰色

for (var i = 0; i < 4; i++) {

var rect = new Rect(i*20,0,20,20,"gray");

//之所以用splice(往前加)而不是用push(往后加),是为了让蛇头出现在数组第一个位置

snakeArray.splice(0,0,rect);

}

//把数组第一个作为蛇头,蛇头设成红色

var head = snakeArray[0];

head.color = "red";

//此处将两个后面常用的东西定为属性,方便后面调用

this.head = snakeArray[0]; //蛇头

this.snakeArray = snakeArray; //整蛇数组

//给定初始位置向右(同keyCode右箭头)

this.direction = 39;

}

//画蛇的方法

Snake.prototype.draw = function () {

for (var i = 0; i < this.snakeArray.length; i++) {

this.snakeArray[i].draw();

}

}

//蛇移动的方法

Snake.prototype.move = function () {

//此处是核心部分,蛇的 移动方式

//1、画一个灰色的方块,位置与蛇头重叠

//2、将这个方块插到数组中蛇头后面一个的位置

//3、砍去末尾的方块

//4、将蛇头向设定方向移动一格

var rect = new Rect(this.head.x,this.head.y,this.head.w,this.head.h,"gray");

this.snakeArray.splice(1,0,rect);

//判断是否吃到食物,isEat判定函数写在最后了

//吃到则食物重新给位置,不砍去最后一节,即蛇变长

//没吃到则末尾砍掉一节,即蛇长度不变

if (isEat()){

food = new getRandomFood();

}else{

this.snakeArray.pop();

}

//设置蛇头的运动方向,37 左,38 上,39 右,40 下

switch (this.direction) {

case 37:

this.head.x -= this.head.w

break;

case 38:

this.head.y -= this.head.h

break;

case 39:

this.head.x += this.head.w

break;

case 40:

this.head.y += this.head.h

break;

default:

break;

}

// gameover判定

// 撞墙

if (this.head.x > canvas.width || this.head.x < 0 || this.head.y > canvas.height || this.head.y < 0){

clearInterval(timer);

}

// 撞自己,循环从1开始,避开蛇头与蛇头比较的情况

for (var i = 1; i < this.snakeArray.length; i++) {

if (this.snakeArray[i].x == this.head.x && this.snakeArray[i].y == this.head.y){

clearInterval(timer);

}

}

}

//画出初始的蛇

var snake = new Snake()

snake.draw();

//画出初始的食物

var food = new getRandomFood()

//定时器

var timer = setInterval(function () {

context.clearRect(0,0,canvas.width,canvas.height);

food.draw();

snake.move();

snake.draw();

}, 100)

//键盘事件,其中的if判定是为了让蛇不能直接掉头

document.onkeydown = function (e) {

var ev = e||window.event;

switch(ev.keyCode){

case 37:{

if (snake.direction !== 39){

snake.direction = 37;

}

break;

}

case 38:{

if (snake.direction !== 40){

snake.direction = 38;

}

break;

}

case 39:{

if (snake.direction !== 37){

snake.direction = 39;

}

break;

}

case 40:{

if (snake.direction !== 38){

snake.direction = 40;

}

break;

}

}

ev.preventDefault();

}

//随机函数,获得[min,max]范围的值

function getNumberInRange (min,max) {

var range = max-min;

var r = Math.random();

return Math.round(r*range+min)

}

//构建食物对象

function getRandomFood () {

//判定食物是否出现在蛇身上,如果是重合,则重新生成一遍

var isOnSnake = true;

//设置食物出现的随机位置

while(isOnSnake){

//执行后先将判定条件设置为false,如果判定不重合,则不会再执行下列语句

isOnSnake = false;

var indexX = getNumberInRange(0,canvas.width/20-1);

var indexY = getNumberInRange(0,canvas.height/20-1);

var rect = new Rect(indexX*20, indexY*20, 20, 20, "green");

for (var i = 0; i < snake.snakeArray.length; i++) {

if(snake.snakeArray[i].x == rect.x && snake.snakeArray[i].y == rect.y){

//如果判定重合,将其设置为true,使随机数重给

isOnSnake = true;

break;

}

}

}

//返回rect,使得实例化对象food有draw的方法

return rect;

}

//判定吃到食物,即蛇头坐标与食物坐标重合

function isEat () {

if (snake.head.x == food.x && snake.head.y == food.y){

return true;

} else {

return false;

}

}

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

php开发h5游戏,H5的canvas实现贪吃蛇小游戏相关推荐

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

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

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

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

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

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

  4. C语言小游戏大全,C语言贪吃蛇小游戏(附源码)

    一.C语言小游戏大全,C语言贪吃蛇小游戏(附源码) 贪吃蛇小游戏源码和更多C语言课设项目小游戏源码免 费 下 载 链 接 如下: c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载 ...

  5. c++编写手机小游戏代码_C++代码实现贪吃蛇小游戏

    本文实例为大家分享了C++实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 1.游戏描述 贪吃蛇可谓是从小玩到大的经典趣味小游戏,蛇每吃到一次食物,身体就会长一节,如果撞到墙或者撞到自身,游戏结束 ...

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

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

  7. GUI编程---贪吃蛇小游戏开发

    学习链接:狂神说Java–1小时开发贪吃蛇小游戏 ①初识理论 帧:时间片足够小=>就是动画,1秒30帧.连起来是动画,拆开就是静态的图片! 键盘监听 定时器Timer 游戏图片素材:GUI之贪吃 ...

  8. 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】

    基于单片机stm32f407的单机小游戏----贪吃蛇小游戏 1.介绍 这是我花一个星期完成的一个简单地单机贪吃蛇小游戏项目,芯片是stm32f407,项目是基于正点原子-探索者开发板完成的,有需要的 ...

  9. Qt入门开发__贪吃蛇小游戏

    qt是一个由Qt Company于1991年开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序(比如控制台工具和服务器).在图形用户界面开发相比MFC更加 ...

最新文章

  1. VS2008常用快捷键
  2. SQL Server2005如何进行数据库定期备份(转)
  3. 初探swift语言的学习笔记四-2(对上一节有些遗留进行处理)
  4. android 回车键事件编程
  5. Hadoop入门基础教程 Hadoop之伪分布式环境搭建
  6. 无人驾驶(pid算法)
  7. 【实用插件】精心挑选6款优秀的 jQuery Tooltip 插件
  8. 小米路由器mini刷老毛子教程
  9. U盘量产工具_修复、U盘写保护无法格式化、U盘文件乱码格式
  10. 【编程常识】关于 Visual Basic 6.0 语言
  11. java opencv dct 压缩_使用OpenCV计算DCT
  12. CC攻击(Challenge Collapsar)原理及防范方法
  13. C# RSA、AES加密解密
  14. python爬虫豆瓣top250_Python 爬取豆瓣TOP250实战
  15. dcos -1.7 都有哪些服务
  16. 重整旗鼓学java之java基础
  17. python批量添加姓名生成奖状批量处理图片教师学生奖状
  18. 安徽师范大学898专硕复习讲义
  19. 041孙悟空第三人称视角
  20. Tomcat原理系列之四:Tomat如何启动spring(加载web.xml)

热门文章

  1. CSR867x — Speaker Equalizer曲线调试笔记
  2. 宽带,猫,路由器的关系是什么?
  3. c语言课程设计报告停车系统,停车场管理系统C语言课程设计
  4. 如何在linux下安装rar软件,Linux下安装使用RAR压缩软件的方法
  5. centos7上安装rar解压软件
  6. FFmpeg初探——基于FFmpeg的图片合成视频
  7. JQuery快速入门之插件
  8. 《自适应机器人交互白皮书》
  9. PowerPoint2019删除当前ppt页上的某个动画
  10. Java中OutOfMemoryError(内存溢出)和Tomcat进程假死崩溃