0

0

怎么使用Vue3+Canvas实现简易的贪吃蛇游戏

王林

王林

发布时间:2023-05-12 21:58:04

|

1562人浏览过

|

来源于亿速云

转载

    怎么使用vue3+canvas实现简易的贪吃蛇游戏

    规则

    玩法:玩家使用方向键操控一条长长的蛇不断吞下豆子,同时蛇身随着吞下的豆子不断变长,当蛇头撞到蛇身或障壁时游戏结束。

    思路

    元素:边界、蛇头、蛇身、食物

    边界:输入 行数 x, 列数 y 生成边界地图,用二维坐标标识每个点的位置;

    蛇头、蛇身:蛇头和蛇身分离,当吃到食物后,蛇身尾部加一

    立即学习前端免费学习笔记(深入)”;

    食物:位置随机生成;

    流程图

    怎么使用Vue3+Canvas实现简易的贪吃蛇游戏

    代码实现

    技术栈

    选择 vue3、vite 基础架构; 视图选用 canvas 技术来实现,相比 dom 来说性能更好;

    Removal.AI
    Removal.AI

    AI移出图片背景工具

    下载

    基本变量定义

    初始化

    在 onMounted 里执行,主要做 地图绘制、鼠标坐标检测、方向监测、食物绘制、定时器启用等操作。

    function handleInit() {
      canvas = document.getElementById('canvas')
    
      if (canvas?.getContext) {
        ctx = canvas?.getContext('2d')
    
        canvas.addEventListener('mousemove', e => {
          ctx.clearRect(10, height.value - 20, 120, 40)
          ctx.fillText(`当前鼠标位置:${e.offsetX}, ${e.offsetY}`, 10, height.value - 10)
        })
    
        document.addEventListener('keydown', e => {
          e.preventDefault()
    
          if (Direction[e.keyCode]) {
            direction = Direction[e.keyCode]
          }
        })
    
        process = setInterval(handleRenderSnake, 150)
        handleRenderFood()
        // window.requestAnimationFrame(handleRenderSnake)
      } else {
        alert('您的浏览器不支持 canvas')
      }
    }

    食物绘制

    当食物被吃掉后,需要销毁和重新生成

    // 绘制食物
    function handleRenderFood() {
      ctx.clearRect(foodCoordinate[0], foodCoordinate[1], 10, 10)
      foodCoordinate = [(Math.random() * width.value) | 0, (Math.random() * height.value) | 0]
      ctx.fillStyle = '#eb2f96'
      ctx.fillRect(foodCoordinate[0], foodCoordinate[1], 10, 10)
    }

    蛇头/蛇身绘制

    蛇是通过二维数组来表示的,每个节点代表身体的一部分,第一个节点代表蛇头,蛇的移动是通过 删除尾部节点,添加头部节点来实现,中间节点不用动,在四个方向上的处理略有不同。 注意当吃到食物时,当前帧尾部节点不再删除,即可实现蛇身长度加 1。

    function handleRenderSnake() {
      switch (direction) {
        case 'top':
          if (snakeList.slice(-1)[0][1] <= 0) {
            status.value = 'over'
            return
          }
    
          snakeList.push([
            snakeList[snakeList.length - 1][0],
            snakeList[snakeList.length - 1][1] - step,
          ])
          handleUpdateVerify()
          break
        case 'down':
          if (snakeList.slice(-1)[0][1] >= height.value - 1) {
            status.value = 'over'
            return
          }
    
          snakeList.push([
            snakeList[snakeList.length - 1][0],
            snakeList[snakeList.length - 1][1] + step,
          ])
          handleUpdateVerify()
    
          break
          ...

    碰撞算法、边界条件

    当蛇头触碰到地图边缘,将 game over, 只需根据蛇头当前坐标、当前方向,计算下一步的坐标是否会超出地图尺寸即可。

    吃到食物的计算方法:分别对蛇头坐标和食物坐标的 x、y 轴进行绝对值计算,小于元素尺寸时认为已接触。

    // 更新校验
    function handleUpdateVerify() {
      if (status.value === 'pause') {
        clearInterval(process)
      }
    
      if (store.value >= 100) {
        status.value = 'success'
        return
      }
    
      for (let i of snakeList) {
        ctx.clearRect(i[0], i[1], elementWidth, elementWidth)
      }
    
      let currentSnake = snakeList.slice(-1)[0]
      if (
        Math.abs(currentSnake[0] - foodCoordinate[0]) < 10 &&
        Math.abs(currentSnake[1] - foodCoordinate[1]) < 10
      ) {
        store.value++
        handleRenderFood()
      } else {
        snakeList.shift()
      }
    }

    积分计算、暂停,继续等功能

    全局变量 status 代表当前局势的状态,当 status === 'pause' 时,触发暂停操作,删除 定时器变量,点击重新开始按钮,生成新的定时器。

    当吃到食物时,全局变量 store ++, 双向绑定到页面上显示,暂时设置积分超过 100 即可通关。

    相关专题

    更多
    全局变量怎么定义
    全局变量怎么定义

    本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

    75

    2025.09.18

    python 全局变量
    python 全局变量

    本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

    96

    2025.09.18

    堆和栈的区别
    堆和栈的区别

    堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

    387

    2023.07.18

    堆和栈区别
    堆和栈区别

    堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

    571

    2023.08.10

    DOM是什么意思
    DOM是什么意思

    dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

    2929

    2024.08.14

    html5动画制作有哪些制作方法
    html5动画制作有哪些制作方法

    html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

    504

    2023.10.23

    页面置换算法
    页面置换算法

    页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

    400

    2023.08.14

    Java 桌面应用开发(JavaFX 实战)
    Java 桌面应用开发(JavaFX 实战)

    本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

    36

    2026.01.14

    php与html混编教程大全
    php与html混编教程大全

    本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

    14

    2026.01.13

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Canvas 绘制时钟
    Canvas 绘制时钟

    共7课时 | 1.5万人学习

    HTML5新特性基础视频教程
    HTML5新特性基础视频教程

    共18课时 | 3.2万人学习

    HTML5 Canvas 动画实战教程
    HTML5 Canvas 动画实战教程

    共28课时 | 6.3万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号