使用js和canvas实现简单的网页贪吃蛇小游戏
玩法介绍
点击开始游戏后,使用键盘上的↑↓←→控制移动,吃到食物增加长度,碰到墙壁或碰到自身就游戏结束


代码实现
代码比较简单,直接阅读注释即可,复制即用
<!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>
相关文章:
使用js和canvas实现简单的网页贪吃蛇小游戏
玩法介绍 点击开始游戏后,使用键盘上的↑↓←→控制移动,吃到食物增加长度,碰到墙壁或碰到自身就游戏结束 代码实现 代码比较简单,直接阅读注释即可,复制即用 <!DOCTYPE html> <html lang"en"…...
Kafka SASL/PLAIN认证模式
Kafka 认证模式命令使用示例 创建Topic 指定用户创建 [rootkafka01 kraft]# /usr/local/kafka3.5-sasl-data/bin/kafka-topics.sh --bootstrap-server x.x.x.11:9092 --create --topic fkaaa35 --replication-factor 3 --partitions 3 --command-config /usr/local/kafka3.…...
苹果AI科学家研究证明基于LLM的模型存在缺陷 因为它们无法推理
苹果公司人工智能科学家的一篇新论文发现,基于大型语言模型的引擎(如 Meta 和 OpenAI 的引擎)仍然缺乏基本的推理能力。该小组提出了一个新的基准–GSM-Symbolic,以帮助其他人衡量各种大型语言模型(LLM)的推…...
鸿蒙NEXT开发-页面路由(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...
asp.net Core MVC 内容协商
内容协商 内容协商是Asp.Net Core 控制器的一项功能,而Asp.Net MVC5 控制器并不支持它。 引入内容协商是为了满足 Web API 框架的需要。 在 Asp.net Core 中,内容协商 被内置到引擎中,供开发人员使用。 顾名思义,内容协商指的是…...
智能EDA小白从0开始 —— DAY10 Yosys
Yosys 概述 工作原理 Yosys的工作原理深入来讲,是一个复杂但有序的硬件设计自动化流程,其核心在于将高级硬件描述语言(HDL)如Verilog或VHDL编写的代码,通过一系列精细的步骤转换为门级网表。这一流程首先涉及对HDL代…...
《OpenCV计算机视觉》—— 人脸检测
文章目录 一、人脸检测流程介绍二、用于人脸检测的关键方法1.加载分类器(cv2.CascadeClassifier())2.检测图像中的人脸(cv2.CascadeClassifier.detectMultiscale()) 三、代码实现 一、人脸检测流程介绍 下面是一张含有多个人脸的…...
【unity框架开发12】从零手搓unity存档存储数据持久化系统,实现对存档的创建,获取,保存,加载,删除,缓存,加密,支持多存档
文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存…...
YOLOv11进行图像与视频的目标检测
一、AI应用系统实战项目 项目名称项目名称1.人脸识别与管理系统2.车牌识别与管理系统...
SpinalHDL之错误集(一)
本文作为SpinalHDL学习笔记第七十六篇,作为错误集使用,类似高中生的错题集,记录使用SpinalHDL过程中遇到的问题,小到语法错误、版本兼容问题,大到SpinalHDL库函数错误等等,持续更新。 SpinalHDL学习笔记总…...
【arcgis】ArcGIS中如何避免标注压盖要素
ArcGIS中如何避免标注压盖要素 在制图工作中,标注(Label)是传达地理信息的重要方式。然而,在复杂的地图上,标注容易出现压盖要素的情况,影响地图的美观性和信息的准确传达。ArcGIS提供了Maplex标注引擎&am…...
数通--3
一、动态路由 内部 路由器之间要互联互通,必须遵循相同的协议 企业内部用 IGP,企业之间用BGP RIP(已淘汰,不考) 距离就是长短,矢量就是方向,即路由的出接口 一台路由器 A 配好RIP,…...
SpringBoot基础(五):集成JUnit5
SpringBoot基础系列文章 SpringBoot基础(一):快速入门 SpringBoot基础(二):配置文件详解 SpringBoot基础(三):Logback日志 SpringBoot基础(四):bean的多种加载方式 SpringBoot基础(五):集成JUnit5 目录 一、JUnit…...
正点原子学习笔记之汇编LED驱动实验
1 汇编LED原理分析 为什么要写汇编 需要用汇编初始化一些SOC外设 使用汇编初始化DDR、I.MX6U不需要 设置sp指针,一般指向DDR,设置好C语言运行环境 1.1 LED硬件分析 可以看到LED灯一端接高电平,一端连接了GPIO_3上面…...
网络学习第二篇
认识网关和路由器 这里大家先了解一下什么三层设备。 三层设备 三层设备是指在网络架构中能够工作在第三层(网络层)的设备,通常包括三层交换机和路由器。这些设备可以根据IP地址进行数据包的转发和路由选择,从而在不同的网络之间…...
一些小结汇总
1.常用浏览器及对应内核 Safari浏览器(苹果浏览器):Webkit内核 Google浏览器:Blink内核 Firefox:Gecko内核 Edge浏览器:Chromium内核 IE浏览器:Trident内核 2.10个块标签和10个行标签 …...
20240720 科大讯飞 笔试
文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.122、编程题2.12.22.33、选择题(Linux 选做)3.13.23.34、选择题(C++ 选做)4.14.24.34.44.54.64.75、选择题(数据库选做)5.15.25.3岗位:嵌入式开发工程师 题型: 必做:12 道选择题,3 道编程题 选做:Linux(3…...
【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯CoT思维链概述💯CoT思维链在大型语言模型中的应用💯CoT思维链改变对模型推理能力的理解和改进方式多样化应用场景挑战与未来发展总结 Ὂ…...
一、安装VMWARE和CentOS
一、安装VMware 1、基本说明 学习Linux需要一个环境,我们需要创建一个虚拟机,然后在虚拟机上安装一个Centos系统来学习 先安装virtual machine 15.5再安装Linux(CentOS 7.6/centos8.1)原理示意图 2、vmware15.5下载 官方地址:https://www.vmware.com/…...
岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类
岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类 岩石分类检测数据集 (Rock Classification and Detection Dataset) 描述: 本数据集旨在支持对不同类型的岩石进行自动分类和检测,特别适用于地质勘探、矿物识别、环境监测等领域。通过使用该数据集训练的模…...
3个核心革新让英雄联盟玩家彻底告别繁琐游戏操作
3个核心革新让英雄联盟玩家彻底告别繁琐游戏操作 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英雄联盟对局中&#…...
告别两阶段!用单个冻结的ConvNeXt CLIP搞定开放词汇分割,速度提升6.6倍
FC-CLIP:用冻结卷积CLIP重塑开放词汇分割的工程实践 开放词汇分割技术正在彻底改变计算机视觉应用的边界。想象一下,当自动驾驶车辆遇到从未在训练数据中出现过的障碍物,或是电商平台需要即时识别刚刚上市的新商品时,传统封闭词汇…...
从音乐均衡器到语音降噪:深入浅出玩转数字谐振器设计与MATLAB仿真
从音乐均衡器到语音降噪:深入浅出玩转数字谐振器设计与MATLAB仿真 你是否曾在调整音乐播放器的均衡器时好奇——那些滑动条如何精确控制特定频段的声音强弱?这背后隐藏的数字信号处理魔法,正是我们今天要探索的数字谐振器技术。无论是提取语音…...
Cobalt Strike内网渗透:从Beacon生成到多层跳板实战(避坑版)
Cobalt Strike内网渗透实战:Beacon配置与多层跳板避坑指南 在网络安全领域,内网渗透测试往往是最具挑战性的环节之一。面对复杂的企业网络架构,传统的攻击手段常常在多层防火墙和隔离策略面前败下阵来。Cobalt Strike作为一款专业的渗透测试工…...
nli-distilroberta-baseAI应用:心理健康聊天机器人对话逻辑连贯性监测
NLI DistilRoBERTa Base AI应用:心理健康聊天机器人对话逻辑连贯性监测 1. 项目概述 心理健康聊天机器人正成为越来越多人寻求心理支持的重要工具。然而,这类对话系统面临一个关键挑战:如何确保对话内容的逻辑连贯性?这正是nli-…...
智能客服系统搭建实战:基于NLP与微服务架构的AI客服实现指南
最近在帮公司搭建一套智能客服系统,从零开始踩了不少坑,也积累了一些实战经验。今天就来聊聊,如何基于当前比较成熟的 NLP 和微服务架构,一步步构建一个能扛住真实业务压力的 AI 客服系统。整个过程涉及技术选型、核心模块实现、性…...
XC泰山服务器麒麟V10系统安装全流程解析
1. 准备工作:了解XC泰山服务器与麒麟V10系统 在开始安装之前,我们需要先了解一下XC泰山服务器和麒麟V10操作系统的基本情况。XC泰山服务器是国内自主研发的高性能服务器,采用ARM架构处理器,具有高性能、低功耗的特点。而麒麟V10则…...
医学影像组学实战:Pyradiomics YAML配置文件全解析(附完整示例)
医学影像组学实战:Pyradiomics YAML配置文件全解析(附完整示例) 在医学影像分析领域,特征提取是构建精准诊断模型的关键步骤。Pyradiomics作为开源的医学影像组学工具包,通过YAML配置文件提供了高度灵活的特征提取方案…...
Windows内存管理的隐形助手:Mem Reduct如何让老旧电脑重获新生?
Windows内存管理的隐形助手:Mem Reduct如何让老旧电脑重获新生? 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/…...
别再死记硬背了!用Treap(树堆)搞定LeetCode平衡树难题,附C++完整模板
Treap实战指南:用随机化平衡树高效解决LeetCode难题 1. 为什么选择Treap而非传统平衡树? 在算法竞赛和面试场景中,我们经常需要处理动态有序集合的操作。传统平衡树如AVL和红黑树虽然能保证严格的平衡性,但它们的实现复杂度往往让…...
