用HTML.CSS.JavaScript实现一个贪吃蛇小游戏

目录

    • 一、引言
    • 二、实现思路
      • 1. HTML 结构
      • 2. CSS 样式
      • 3. JavaScript 逻辑
    • 三、代码实现
    • 四、效果展示

一、引言

贪吃蛇是一款经典的小游戏,曾经风靡一时。今天,我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目,可以了解到如何使用 HTML5 的画布元素(<canvas>)来绘制图形,以及如何使用 JavaScript 来处理游戏逻辑。

二、实现思路

1. HTML 结构

我们首先创建一个基本的 HTML 结构,包含一个 <canvas> 元素用于绘制游戏画面,以及一些必要的 <script><style> 标签。

2. CSS 样式

使用 CSS 对 <canvas> 元素进行简单的样式设置,使其具有边框,并居中显示。

3. JavaScript 逻辑

  • 初始化游戏元素:定义蛇的初始位置、食物的初始位置、分数等。
  • 处理用户输入:监听键盘事件,根据用户按下的方向键来改变蛇的移动方向。
  • 绘制游戏画面:使用 requestAnimationFramesetInterval 函数来不断更新游戏画面,包括蛇的移动、食物的生成和绘制、分数的显示等。
  • 处理碰撞检测:检测蛇是否撞到墙壁或自己的身体,如果是,则游戏结束。
  • 处理食物的生成和消耗:当蛇吃到食物时,分数增加,并且生成新的食物。

三、代码实现

上述代码中,我们使用了 HTML5 的 <canvas> 元素来绘制游戏画面,通过 JavaScript 来处理游戏逻辑。具体实现步骤如下:

  1. 初始化游戏元素:定义蛇的初始位置、食物的初始位置、分数等。
  2. 监听键盘事件:根据用户按下的方向键来改变蛇的移动方向。
  3. 绘制游戏画面:使用 setInterval 函数来不断更新游戏画面,包括蛇的移动、食物的生成和绘制、分数的显示等。
  4. 处理碰撞检测:检测蛇是否撞到墙壁或自己的身体,如果是,则游戏结束。
  5. 处理食物的生成和消耗:当蛇吃到食物时,分数增加,并且生成新的食物。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="https://unpkg.com/@tailwindcss/browser@4"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" rel="stylesheet"><title>贪吃蛇小游戏</title><style>#game-board {border: 2px solid #333;display: block;margin: 20px auto;}</style>
</head><body class="bg-gray-100 flex flex-col items-center justify-center h-screen"><h1 class="text-3xl font-bold mb-4">贪吃蛇小游戏</h1><canvas id="game-board" width="400" height="400"></canvas><script>const canvas = document.getElementById('game-board');const ctx = canvas.getContext('2d');const box = 20;let snake = [];snake[0] = {x: 9 * box,y: 10 * box};let food = {x: Math.floor(Math.random() * 19) * box,y: Math.floor(Math.random() * 19) * box};let score = 0;let d;document.addEventListener('keydown', direction);function direction(event) {if (event.keyCode === 37 && d!== 'RIGHT') {d = 'LEFT';} else if (event.keyCode === 38 && d!== 'DOWN') {d = 'UP';} else if (event.keyCode === 39 && d!== 'LEFT') {d = 'RIGHT';} else if (event.keyCode === 40 && d!== 'UP') {d = 'DOWN';}}function draw() {ctx.clearRect(0, 0, canvas.width, canvas.height);for (let i = 0; i < snake.length; i++) {ctx.fillStyle = (i === 0)? 'green' : 'lightgreen';ctx.fillRect(snake[i].x, snake[i].y, box, box);ctx.strokeStyle = 'darkgreen';ctx.strokeRect(snake[i].x, snake[i].y, box, box);}ctx.fillStyle = 'red';ctx.fillRect(food.x, food.y, box, box);let snakeX = snake[0].x;let snakeY = snake[0].y;if (d === 'LEFT') snakeX -= box;if (d === 'UP') snakeY -= box;if (d === 'RIGHT') snakeX += box;if (d === 'DOWN') snakeY += box;if (snakeX === food.x && snakeY === food.y) {score++;food = {x: Math.floor(Math.random() * 19) * box,y: Math.floor(Math.random() * 19) * box};} else {snake.pop();}let newHead = {x: snakeX,y: snakeY};if (snakeX < 0 || snakeX >= canvas.width || snakeY < 0 || snakeY >= canvas.height || collision(newHead, snake)) {clearInterval(game);alert(`游戏结束!你的最终得分是: ${score}`);}snake.unshift(newHead);ctx.fillStyle = 'white';ctx.font = '20px Arial';ctx.fillText('Score: '+ score, 10, 30);}function collision(head, array) {for (let i = 0; i < array.length; i++) {if (head.x === array[i].x && head.y === array[i].y) {return true;}}return false;}let game = setInterval(draw, 100);</script>
</body></html>

四、效果展示

初始界面

在这里插入图片描述
小蛇吃到自己,死亡结算

在这里插入图片描述

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

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

相关文章

基于α-β剪枝的含禁手AI五子棋

前言&#xff1a; 正常的五子棋应当设有禁手规则&#xff0c;否则先手黑棋必赢&#xff0c;基于此点设计出一款包含禁手的AI五子棋项目&#xff0c;该项目代码已在github开源&#xff0c;感兴趣的友友可以自取试玩:ace-trump-tech/AI-Gomoku-with-Prohibition-Moves: 含禁手的A…

Spring Boot 集成 Redis中@Cacheable 和 @CachePut 的详细对比,涵盖功能、执行流程、适用场景、参数配置及代码示例

以下是 Cacheable 和 CachePut 的详细对比&#xff0c;涵盖功能、执行流程、适用场景、参数配置及代码示例&#xff1a; 1. 核心对比表格 特性CacheableCachePut作用缓存方法的返回结果&#xff0c;避免重复计算执行方法并更新缓存&#xff0c;不覆盖原有缓存执行流程缓存命中…

可以使用费曼学习法阅读重要的书籍

书本上画了很多线&#xff0c;回头看等于没画出任何重点。 不是所有的触动都是有效的。就像你曾经看过很多好文章&#xff0c;当时被触动得一塌糊涂&#xff0c;还把它们放进了收藏夹&#xff0c;但一段时间之后&#xff0c;你就再也记不起来了。如果让你在一本书上画出令自己…

Nginx之https重定向为http

为了将Nginx中443端口的请求重定向到80端口&#xff0c;你可以按照以下步骤进行操作&#xff1a; ‌确认Nginx已经正确安装并运行‌&#xff1a; 确保Nginx服务已经在你的系统上安装并运行。你可以通过运行以下命令来检查Nginx的状态&#xff08;具体命令可能因操作系统而异&a…

【ARTS】【LeetCode-2873】有序三元组中的最大值!

前言 仅做学习使用&#xff0c;侵删 什么是ARTS&#xff1f; 算法(Algorithm): 每周至少一道LeetCode算法题&#xff0c;加强编程训练和算法学习 阅读(Review)&#xff1a; 阅读并点评至少一篇英文技术文章&#xff0c;提高英文水平 技巧 (Tip)&#xff1a;学习至少一个技…

基于spring boot 鲜花销售系统PPT(源码+lw+部署文档+讲解),源码可白嫖!

课题意义 随着网络不断的普及发展&#xff0c;鲜花销售系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的信息管理系统&#xff0c;利用目前网络给用户带来的方便快捷这一特点对系统进行调整&am…

Redis常用的数据结构及其使用场景

字符串(String) string 是 redis 最基本的类型&#xff0c;你可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key 对应一个 value。 string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据&#xff0c;比如jpg图片或者序列化的对象。 string 类型是 R…

设计模式简述(五)建造者模式

建造者模式 描述基本要素协调类使用 描述 建造者模式属于创造型设计模式。 通常用于构建一系列复杂对象&#xff0c;这些对象有一定的共性。 我们可以通过不同的建造者&#xff0c;组装不同的对象 与工厂模式的区别&#xff0c;建造者模式更侧重与基于基础构件组装而非直接创…

Java基础 4.6

1.成员方法练习 //编写类A&#xff1a;判断一个数是奇数还是偶数&#xff0c;返回boolean //根据行、列、字符打印对应行数和列数的字符&#xff0c;比如&#xff1a;行4 列4 字符# 则打印相应的效果 public class MethodExercise01 {public static void main(String[] args) …

前端快速入门学习4——CSS盒子模型、浮动、定位

一、盒子模型 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素&#xff0c;它包括&#xff1a;边距&#xff0c;边框&#xff0c;填充&#xff0c…

瑞数信息发布《BOTS自动化威胁报告》,揭示AI时代网络安全新挑战

近日&#xff0c;瑞数信息正式发布《BOTS自动化威胁报告》&#xff0c;力求通过全景式观察和安全威胁的深度分析&#xff0c;为企业在AI时代下抵御自动化攻击提供安全防护策略&#xff0c;从而降低网络安全事件带来的影响&#xff0c;进一步增强业务韧性和可持续性。 威胁一&am…

Docker设置代理

目录 前言创建代理文件重载守护进程并重启Docker检查代理验证 前言 拉取flowable/flowable-ui失败&#xff0c;用DaoCloud源也没拉下来&#xff0c;不知道是不是没同步。索性想用代理拉镜像。在此记录一下。 创建代理文件 创建docker代理配置 sudo mkdir -p /etc/systemd/s…

Debezium嵌入式连接postgresql封装服务

文章目录 1.项目结构&#xff1a;2.依赖&#xff1a;3.application.properties4.DebeziumConnectorConfig类5.TableEnum类6.TableHandler接口&#xff08;表处理抽象&#xff09;7.DefaultTableHandler默认实现类8.UserTableHandler处理类9.TableHandlerFactory工厂10.Debezium…

ER-图,详情和画法

一、E-R图的核心元素 1.实体 表示现实中对象或概念&#xff0c;用矩形表示 示例&#xff1a;用户、老师、学生 2.属性 描述实体的特征&#xff0c;用椭圆表示。 分为主键&#xff08;用户id&#xff09; 和非主键&#xff08;用户昵称&#xff09; 3.关系 表示实体间的…

Windows Flip PDF Plus Corporate PDF翻页工具

软件介绍 Flip PDF Plus Corporate是一款功能强大的PDF翻页工具&#xff0c;也被称为名编辑电子杂志大师。这款软件能够迅速将PDF文件转换为具有翻页动画效果的电子书&#xff0c;同时保留原始的超链接和书签。无论是相册、视频、音频&#xff0c;还是Flash、视频和链接&#…

Linux文件系统中的Page Cache和内存管理中的Page之间的关系

Linux文件系统中的Page Cache和内存管理中的Page之间有密切的关联&#xff0c;两者在底层机制上紧密结合&#xff0c;共同实现高效的内存和文件系统管理。以下是它们的关系和关键点&#xff1a; 核心关系 Page Cache的底层是内存Page Page Cache是由内存管理中的物理内存页&…

每日一个小病毒(C++)EnumChildWindows+shellcode

这里写目录标题 1. `EnumChildWindows` 的基本用法2. 如何利用 `EnumChildWindows` 执行 Shellcode?关键点:完整 Shellcode 执行示例3. 为什么 `EnumChildWindows` 能执行 Shellcode?4. 防御方法5. 总结EnumChildWindows 是 Windows API 中的一个函数,通常用于枚举所有子窗…

AI爬虫?爬!

1.你是否还在为大模型的key而感到忧伤和囊中羞涩&#xff0c;openrouter.ai&#xff0c;目前可免费白嫖多个大模型&#xff0c;代码如下 from openai import OpenAIclient OpenAI(base_url"https://openrouter.ai/api/v1",api_key"", )completion clien…

洛谷题单3-P5720 【深基4.例4】一尺之棰-python-流程图重构

题目描述 《庄子》中说到&#xff0c;“一尺之棰&#xff0c;日取其半&#xff0c;万世不竭”。第一天有一根长度为 a a a 的木棍&#xff0c;从第二天开始&#xff0c;每天都要将这根木棍锯掉一半&#xff08;每次除 2 2 2&#xff0c;向下取整&#xff09;。第几天的时候木…

c++中的auto关键字

在 C 中&#xff0c;auto 是一个类型推断关键字&#xff08;C11 引入&#xff09;&#xff0c;允许编译器根据变量的初始化表达式自动推导其类型。它极大地简化了代码编写&#xff0c;尤其在涉及复杂类型或模板的场景中。以下是 auto 的详细说明&#xff1a; 1. 基本用法 1.1 …