search
HomeWeb Front-endH5 TutorialH5 canvas implements the Snake game

This time I will bring you the H5 canvas to implement the Snake game, and the H5 canvas to implement the Snake game. Notes What are the following, the following is a practical case, let’s take a look.

This article introduces the H5 canvas implementation of the Snake game and shares it with everyone. The details are as follows:

The implementation effect is as follows

Implementation ideas:

ps: This is just an idea, please refer to the code comments for details

First, first Draw a snake

  1. # Define the structure of the snake and use an array to save a bunch of rectangles, including the snake head (red) and the snake body (gray).

  2. Drawing a snake (initial state)

2. The snake can move (key points)

  1. Snake movement method: only the snake head is moving from beginning to end

    1. Draw a gray square, the position overlaps with the snake head

    2. Insert this block into the array at a position behind the snake head arrar.splice(0,1,rect)

    3. Cut off the last block array.pop()

    4. Move the snake head one space to the set direction

  2. Requires a variable to save the direction (direction)

  3. Move according to the direction, move one frame at a time

  4. Change the direction according to the keys

Three , Randomly put food

  1. Need random food location

  2. Need to determine whether the food is on the snake.

##4. Eat food

  1. Determine whether the food overlaps with the snake head

  2. Add an element to the array (removing one element means adding one element)

  3. Generate new food

5. gameover

  1. Judgment of hitting the wall

  2. Pretend to make your own judgment

  3. nbsp;html>
    
    
        <meta>
        <title>Document</title>
        <style>
            #canvas{
                box-shadow: 0 5px 40px black;
            }
        </style>
    
    
        <canvas></canvas>
    
    <script>
        var canvas = document.getElementById(&#39;canvas&#39;);
        var context = canvas.getContext(&#39;2d&#39;);
        //构造对象方块
        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;
            }
        }
    </script>
    
I believe I read the case in this article You have mastered the method. For more exciting information, please pay attention to other related articles on the php Chinese website!

Recommended reading:

H5 drag-and-drop API for drag-and-drop sorting

What are the newly added tags in html5

The above is the detailed content of H5 canvas implements the Snake game. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Vue和Canvas:如何实现手写签名和手势识别功能Vue和Canvas:如何实现手写签名和手势识别功能Jul 18, 2023 am 08:49 AM

Vue和Canvas:如何实现手写签名和手势识别功能引言:手写签名和手势识别功能在现代应用程序中越来越常见,它们可以为用户提供更加直观和自然的交互方式。Vue.js作为一款流行的前端框架,搭配Canvas元素可以实现这两个功能。本文将介绍如何使用Vue.js和Canvas元素来实现手写签名和手势识别功能,并给出相应的代码示例。一、手写签名功能实现要实现手写签

Canvas的优势有哪些Canvas的优势有哪些Aug 17, 2023 pm 04:52 PM

canvas的优势有强大的绘图功能、高性能、跨平台兼容性、支持多种图形格式、可以与其他Web技术集成、可以实现动态效果和可以实现复杂的图像处理。详细介绍:1、Canvas提供了丰富的绘图功能,可以绘制各种形状、线条、文本、图像等;2、Canvas在浏览器中直接操作像素,因此具有很高的性能;3、Canvas是基于HTML5标准的一部分,可以在各种现代浏览器上运行等等。

如何利用Vue和Canvas创建逼真的天气动态背景如何利用Vue和Canvas创建逼真的天气动态背景Jul 17, 2023 am 08:33 AM

如何利用Vue和Canvas创建逼真的天气动态背景引言:在现代网页设计中,动态背景效果是吸引用户眼球的重要元素之一。本文将介绍如何利用Vue和Canvas技术来创建一个逼真的天气动态背景效果。通过代码示例,你将学习如何编写Vue组件和利用Canvas绘制不同天气场景,从而实现一个独特而吸引人的背景效果。步骤一:创建Vue项目首先,我们需要创建一个Vue项目。

canvas特效有哪些canvas特效有哪些Aug 18, 2023 pm 04:12 PM

canvas特效有粒子效果、线条动画、图片处理、文字动画、音频可视化、3D效果、游戏开发等。详细介绍:1、粒子效果,通过控制粒子的位置、速度和颜色等属性来实现各种效果,如烟花、雨滴、星空等;2、线条动画,通过在画布上绘制连续的线条,创建出各种动态的线条效果;3、图片处理,通过对图片进行处理,可以实现各种炫酷的效果,如图片切换、图片特效等;4、文字动画等等特性。

canvas插件有哪些canvas插件有哪些Aug 17, 2023 pm 05:00 PM

canvas插件有Fabric.js、EaselJS、Konva.js、Three.js、Paper.js、Chart.js和Phaser。详细介绍:1、Fabric.js 是一个基于Canvas的开源 JavaScript 库,它提供了一些强大的功能;2、EaselJS是CreateJS库中的一个模块,它提供了一套简化了Canvas编程的API;3、Konva.js等等。

Vue和Canvas:如何实现视频播放器的定制化界面Vue和Canvas:如何实现视频播放器的定制化界面Jul 18, 2023 pm 02:49 PM

Vue和Canvas:如何实现视频播放器的定制化界面引言:在现代互联网时代,视频已经成为人们生活中必不可少的一部分。为了提供良好的用户体验,许多网站和应用程序都提供了自定义的视频播放器界面。本文将介绍如何使用Vue和Canvas技术实现一个定制化的视频播放器界面。一、前期准备在开始之前,您需要确保您已经安装了Vue和Canvas,并且熟悉这两种技术的基本用法

Vue和Canvas:如何实现图片的马赛克效果Vue和Canvas:如何实现图片的马赛克效果Jul 16, 2023 pm 10:17 PM

Vue和Canvas:如何实现图片的马赛克效果引言:随着Web技术的不断发展,越来越多的人开始使用Vue框架来构建交互式的前端应用。而在前端开发中,常常需要为用户提供图片处理的功能。本文将介绍如何利用Vue和Canvas实现图片的马赛克效果,为用户带来更好的视觉体验。一、马赛克效果概述马赛克效果是一种将图像的细节部分进行像素化处理,使得整个图像变得模糊和抽象

canvas引擎有哪些canvas引擎有哪些Aug 17, 2023 pm 05:29 PM

canvas引擎有Three.js、Pixi.js、EaselJS、Konva.js、Paper.js等。详细介绍:1、Pixi.js,提供了简单易用的API,支持精灵、纹理、滤镜等功能,同时还提供了丰富的工具和插件,方便开发者进行交互、动画和优化等操作;2、Pixi.js,提供了简单易用的API,支持精灵、纹理、滤镜等功能,还提供了丰富的工具和插件;3、EaselJS等等。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools