使用js和canvas实现简单的网页贪吃蛇小游戏

news2024/11/23 14:58:19

玩法介绍

点击开始游戏后,使用键盘上的↑↓←→控制移动,吃到食物增加长度,碰到墙壁或碰到自身就游戏结束
在这里插入图片描述
在这里插入图片描述

代码实现

代码比较简单,直接阅读注释即可,复制即用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Snake Game</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }
        canvas {
            display: block;
            position: absolute;
            top: 0;
            left: 0;
            z-index: 1;
            background-color: #000;
        }
        .start-screen {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, 0.8);
            color: white;
            text-align: center;
            z-index: 2;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 24px;
        }
        button {
            font-size: 24px;
            padding: 10px 20px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div class="start-screen">
        <h1>Snake Game</h1>
        <button id="startButton">Start Game</button>
    </div>
    <canvas id="gameCanvas" width="800" height="600"></canvas>
    <script>
        const canvas = document.getElementById('gameCanvas');
        const ctx = canvas.getContext('2d');

        // 设置 Canvas 为全屏
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;

        // 方块大小
        const blockSize = 20;

        // 游戏状态
        let snake = [{ x: 100, y: 100 }];
        let food = { x: 200, y: 200 };
        let direction = 'right';
        let score = 0;
        let isRunning = false;

        // 游戏速度
        const speed = 100;

        // 绘制蛇
        function drawSnake() {
            ctx.fillStyle = '#0f0';
            snake.forEach(segment => {
                ctx.fillRect(segment.x, segment.y, blockSize, blockSize);
            });
        }

        // 绘制食物
        function drawFood() {
            ctx.fillStyle = '#f00';
            ctx.fillRect(food.x, food.y, blockSize, blockSize);
        }

        // 检查碰撞
        function checkCollision() {
            // 检查蛇是否撞墙
            if (snake[0].x < 0 || snake[0].x >= canvas.width || snake[0].y < 0 || snake[0].y >= canvas.height) {
                alert('Game Over!');
                isRunning = false;
                return;
            }

            // 检查蛇是否撞到自己
            for (let i = 1; i < snake.length; i++) {
                if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
                    alert('Game Over!');
                    isRunning = false;
                    return;
                }
            }

            // 检查蛇是否吃到食物
            if (snake[0].x === food.x && snake[0].y === food.y) {
                score++;
                placeFood();
            } else {
                snake.pop();
            }
        }

        // 放置新的食物
        function placeFood() {
            food = {
                x: Math.floor(Math.random() * (canvas.width / blockSize)) * blockSize,
                y: Math.floor(Math.random() * (canvas.height / blockSize)) * blockSize
            };
        }

        // 更新游戏状态
        function update() {
            if (!isRunning) return;

            let newX = snake[0].x;
            let newY = snake[0].y;

            if (direction === 'left') newX -= blockSize;
            if (direction === 'right') newX += blockSize;
            if (direction === 'up') newY -= blockSize;
            if (direction === 'down') newY += blockSize;

            snake.unshift({ x: newX, y: newY });

            checkCollision();
        }

        // 渲染游戏画面
        function draw() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            drawSnake();
            drawFood();
        }

        // 游戏主循环
        function gameLoop() {
            update();
            draw();
            setTimeout(gameLoop, speed);
        }

        // 键盘事件
        function handleKeyPress(event) {
            if (event.key === 'ArrowLeft' && direction !== 'right') direction = 'left';
            if (event.key === 'ArrowRight' && direction !== 'left') direction = 'right';
            if (event.key === 'ArrowUp' && direction !== 'down') direction = 'up';
            if (event.key === 'ArrowDown' && direction !== 'up') direction = 'down';
        }

        // 开始按钮事件
        document.getElementById('startButton').addEventListener('click', () => {
            const startScreen = document.querySelector('.start-screen');
            startScreen.style.display = 'none';

            // 添加键盘事件监听
            document.addEventListener('keydown', handleKeyPress);

            isRunning = true;
            placeFood();
            gameLoop();
        });

        // 游戏结束时移除键盘事件监听
        window.addEventListener('beforeunload', () => {
            document.removeEventListener('keydown', handleKeyPress);
        });
    </script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows环境,同一个服务器安装多个相同版本的mysql数据库

windows环境&#xff0c;同一个服务器安装多个相同版本的mysql数据库 1、第一个数据库 1.下载 mysql官网MySQL :: Download MySQL Community Server (Archived Versions)下载对应版本的zip文件 2.解压 解压zip文件夹 3.配置my.ini 打开my.ini配置文件&#xff0c;如果没…

Vistual Studio 使用

下载安装 安装管理工具 在安装管理工具里勾选如下内容 快捷键 F5&#xff1a;运行或调试F9&#xff1a;设置或删除断点F10&#xff1a;单步执行&#xff08;Step Over&#xff09;F11&#xff1a;进入函数内部&#xff08;Step Into&#xff09;ShiftF11&#xff1a;退出当…

智能伺服,精准控制:匠芯创科技M6800系列方案助力工业升级

匠芯创科技低压伺服硬件方案 随着工业4.0的推进和智能制造的兴起&#xff0c;工业机器人和电子制造设备经历了迅猛发展。低压伺服系统作为关键动力与控制组件&#xff0c;提高了生产效率和精度&#xff0c;促进制造工艺的自动化和智能化&#xff0c;在新兴产业中的应用日益增多…

智能的精髓在于避免单纯的计算

一、智能的精髓在于避免计算 智能通常被定义为一种能够适应环境、解决问题以及学习新知识的能力。计算在这个过程中扮演着重要角色&#xff0c;但并非唯一的因素。智能的真正精髓在于如何有效地避免不必要的计算&#xff0c;通过简化决策过程来提高效率。计算往往涉及大量的数…

智慧油田智能安全管控方案-AI助力油气田安全管控升级

在科技日新月异的今天&#xff0c;万物纵横科技凭借其前沿的智慧油田智能安全管控方案&#xff0c;正引领着油气田行业向智能化、高效化转型。该方案深度融合了AI视频智能分析与AIoT&#xff08;物联网人工智能&#xff09;技术&#xff0c;为采油场、油气场的设备运维、环境监…

腾讯音乐:从 Elasticsearch 到 Apache Doris 内容库升级,统一搜索分析引擎,成本直降 80%

导读&#xff1a; 为满足更严苛数据分析的需求&#xff0c;腾讯音乐借助 Apache Doris 替代了 Elasticsearch 集群&#xff0c;统一了内容库数据平台的内容搜索和分析引擎。并基于 Doris 倒排索引和全文检索的能力&#xff0c;支持了复杂的自定义标签计算&#xff0c;实现秒级查…

如何利用Fiddler进行抓包并自动化

首先一般使用Fiddler都是对手机模拟器进行抓包 接下来以MUMU模拟器为例 首先打开Fiddler-->tool-->options-->connection 将要打上的勾都打上&#xff0c;可以看到代理的端口是8888 打开HTTPS选项 把要打的勾打上&#xff0c;这样子才可以接收到HTTPS的包 MUMU打开…

im架构分享 即时通讯架构 即时消息 全球架构师峰会im分享 im分布式 企业级im架构 分布式im 即时通讯im架构

1. 之前收藏的淘宝李厉岷老师在全球架构师峰会上做的im技术分享&#xff0c;贴出来备注下。 2. 李老师infoQ主页链接&#xff1a; 李历岷 3. 文章&#xff1a; 电商IM消息系统架构演进_ArchSummit_李历岷_InfoQ精选文章 4. ppt下载地址 &#xff08;注&#xff1a;同期还有…

I2C(IIC)协议讲解

目录 1.I2C框架介绍1.1 I2C硬件框架1.2 I2C软件框架1.3 对于Linux 2. I2C协议2.1 传输数据的格式2.2 时序图2.3 协议细节 专栏 1.I2C框架介绍 1.1 I2C硬件框架 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种用于短距离通信的总线协议&#xff0c;它允许多个设备…

PyCharm+ssh跳板机+服务器

PyCharmssh跳板机服务器 文章目录 PyCharmssh跳板机服务器准备工作登录服务器查看CUDA查看conda创建虚拟环境 前言配置ssh免密登录设置ssh隧道配置pycharm测试第一种第二种 服务器空闲查询传输数据 准备工作 登录服务器 直接ssh连接就行,在终端(命令行)直接输入下面命令: 跳…

数学建模算法与应用 第13章 数字图像处理

目录 13.1 数字图像概述 13.2 图像的基本空域处理 Matlab代码示例&#xff1a;均值滤波与锐化滤波 13.3 图像的频域处理 Matlab代码示例&#xff1a;傅里叶变换与频域滤波 13.4 图像的边缘检测 Matlab代码示例&#xff1a;Sobel与Canny边缘检测 13.5 图像的形态学处理 …

恒创科技:香港服务器无法建立 SSL 连接如何解决?

在当今的数字时代&#xff0c;安全通信对于在线业务、网站和应用程序至关重要。建立安全通信的方法之一是通过 SSL(安全套接字层)协议。但当无法在用户的设备和托管您网站的香港服务器之间建立安全连接时&#xff0c;就会发生 SSL 连接错误。这通常是由于SSL 证书无效或您的设备…

【Adobe全家桶】 Adobe 全家桶 AE AU PR ME WIN MAC 各个版本

话不多说今天直接分享 Adobe 全家桶&#xff0c;2017-2024版本 包含 window版本 和MAC版本 Adobe Photoshop 2017-2023 CS5-6 mac版本下载地址 WIN版本下载地址 Adobe After Effects 2017-2024 CS5-6 WIN版本下载地址 mac版本下载地址 Adobe Media Encoder 2017-2024 WIN版…

VSCode 使用 EmmyLua 对lua进行调试

时间&#xff1a;2024年10月 其他&#xff1a;win10&#xff0c;EmmyLua v0.8.20 参考&#xff1a;https://blog.csdn.net/ShenHaoDeHao/article/details/140268354 有几个概念搞清楚就好理解了。一般开发中&#xff0c;我们编写的lua文件由宿主程序的来解析、执行&#xff1…

您是否也在寻找免费的 PDF 编辑器工具?10个备选PDF 编辑器工具

您是否也在寻找免费的 PDF 编辑器工具&#xff1f; 如果是&#xff0c;那么您在互联网上处于最佳位置&#xff01; 本指南中提到的所有 10 大免费 PDF 编辑器工具都易于使用&#xff0c;可以允许您添加文本、更改图像、添加图形、填写表格、添加签名等等。 因此&#xff0c;…

科技赋能,数字化项目管理发展新方向

项目管理作为推动业务发展的重要手段&#xff0c;正经历着深刻的变革。科技的赋能为数字化项目管理带来了全新的发展机遇&#xff0c;使其朝着更加高效、智能和协同的方向迈进。 一、项目管理发展的现状 当前&#xff0c;项目管理在各个领域得到了广泛应用&#xff0c;但也面临…

后端——eclipse实现前端后端的交互(2)

1.新建前后端文件 新建HTML文件和后端交互Servlet文件。新建文件的地址也有所要求&#xff0c;Servlet文件要在JavaResources下的src中。HTML文件在WebContent下 2. 引入jqury文件 后端与前端的互传需要通过jQuery的ajax,所以要传入jQuery的包到eclipse中&#xff0c;传入位置…

STM32 GPIO输出输入配置:【图文讲解】

1&#xff1a;输出配置 STM32 GPIO输出有四种配置&#xff1a;开漏输出\推挽输出\复用开漏\复用推挽 1&#xff1a;开漏输出&#xff1a; 输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行&#xff0c;适合于做电流型的驱动&#xff0c;其吸收电流的能力相对强…

沉浸式娱乐新纪元,什么是5G+实时云渲染VR大空间解决方案?

近年来&#xff0c;虚拟现实&#xff08;VR&#xff09;技术在娱乐、教育、医疗等多个领域展现出巨大的潜力&#xff0c;尤其是VR大空间体验&#xff0c;更是以其沉浸式和互动性的特点&#xff0c;迅速成为市场的新宠。据Statista数据显示&#xff0c;2023年&#xff0c;全球虚…

UE5影片渲染基本设置记录

以下是UE5过场动画制作中影片渲染其中一种高质量输出的基本设置记录&#xff1a; 控制台变量这里输入&#xff1a; r.ScreenPercentage r.DepthOfFieldQuality