贪吃蛇web小游戏

蛇的移动:通过定时器实现蛇的自动移动,并通过监听用户的键盘输入来改变蛇的移动方向。

食物的生成:随机在地图上生成食物,并在蛇吃到食物时更新得分和食物的位置。

墙和边界的碰撞判断

        监测蛇是否撞墙(遍历获取墙的位置,检查蛇的边界框是否与当前墙的边界框相交)

        有四种情况:

            蛇的左边界 小于 墙的右边界,蛇在墙的右侧(蛇从右往左撞墙)

            蛇的右边界 大于 墙的左边界,蛇在墙的左侧(蛇从左往右撞墙)

            蛇上边界的 小于 墙的下边界,蛇在墙的上侧(蛇从下往上撞墙)

            蛇下边界的 大于 墙的上边界,蛇在墙的上侧(蛇从上往下撞墙)

完整源代码如下:

// snake.html<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>snake</title><style>* {margin: 0;padding: 0;}/* 地图 */.map {width: 400px;height: 400px;background-color: black;margin: 0 auto;margin-top: 50px;position: relative;}/* 蛇 */.snake {/* 蛇的宽高 */width: 20px;height: 20px;background-color: red;/* 确保蛇在地图内 */position: absolute;}/* 食物 */.food {/* 食物的宽高 */width: 20px;height: 20px;background-color: green;/* 确保食物在地图内 */position: absolute;}/* 得分 */.score {position: absolute;bottom: 10px;/* 距离底部10px */left: 10px;/* 距离左侧10px */color: white;/* 设置分数颜色为白色 */}/* 墙 */.wall1 {width: 20px;height: 80px;background-color: gray;position: absolute;top: 40px;left: 140px;}.wall2 {width: 20px;height: 80px;background-color: gray;position: absolute;top: 180px;left: 40px;}.wall3 {width: 140px;height: 20px;background-color: gray;position: absolute;top: 300px;left: 140px;}.wall4 {width: 140px;height: 20px;background-color: gray;position: absolute;top: 200px;left: 200px;}.wall5 {width: 140px;height: 20px;background-color: gray;position: absolute;top: 120px;left: 140px;}.wall6 {width: 20px;height: 120px;background-color: gray;position: absolute;top: 240px;left: 120px;}</style>
</head><body><div class="map"><div class="food"></div><div class="snake"></div><div class="score">Score: 0</div><div class="wall1">1</div><div class="wall2">2</div><div class="wall3">3</div><div class="wall4">4</div><div class="wall5">5</div><div class="wall6">6</div></div><script src="./snake.js"></script>
</body></html><!-- 
重点在于:遍历墙数组,检查蛇是否与墙发生碰撞(在snake.js最后)-->
// snake.jsdocument.addEventListener('DOMContentLoaded', function () {// 获取食物,地图,蛇,得分显示,墙var food = document.querySelector('.food');var map = document.querySelector('.map');var snake = document.querySelector('.snake');var scoredisplay = document.querySelector('.score');var walls = document.querySelectorAll('.wall1, .wall2, .wall3, .wall4, .wall5, .wall6');// 声明变量let snakeX; // 蛇的x坐标let snakeY; // 蛇的y坐标let snakeDirection; // 蛇运动方向let score; // 得分// 重新开始游戏function resetGame() {clearInterval(snakeMoveInterval); // 清除移动定时器snakeX = 160;snakeY = 160;snakeDirection = 'right';score = 0;updateScore();generateFood();startGame();}resetGame();// 更新分数显示function updateScore() {scoredisplay.textContent = '得分: ' + score;}// 生成随机位置的食物var foodX, foodY; // 声明全局变量function generateFood() {foodX = Math.floor(Math.random() * (map.offsetWidth / 20)) * 20;foodY = Math.floor(Math.random() * (map.offsetHeight / 20)) * 20;//虽然/20*20看似没变化,但实际上,如果删掉了这里,食物的位置不会严丝合缝在“格子”上,而是会有所偏移food.style.left = foodX + 'px';food.style.top = foodY + 'px';food.style.display = 'block'; // 让食物作为一个块级元素显示// 一定要让食物显示,因为蛇碰到食物后,食物被隐藏了}// 定时器,持续地让蛇向当前移动方向移动var snakeMoveInterval;// 开始游戏function startGame() {snakeMoveInterval = setInterval(function () {// 根据蛇的移动方向移动蛇的位置// 左上角是原点,向右是 X 轴正方向,向下是 Y 轴正方向if (snakeDirection === 'left' && snakeX > 0) {snakeX -= 20; // 向左移动20px} else if (snakeDirection === 'up' && snakeY > 0) {snakeY -= 20; // 向上移动20px} else if (snakeDirection === 'right' && snakeX < map.offsetWidth - 20) {snakeX += 20; // 向右移动20px} else if (snakeDirection === 'down' && snakeY < map.offsetHeight - 20) {snakeY += 20; // 向下移动20px} else {// 蛇撞到了地图边界,游戏失败var restart = confirm('游戏失败!你的得分是: ' + score + ' 是否重新开始?');if (restart) {resetGame();}return; // 结束函数}// 更新蛇的位置snake.style.left = snakeX + 'px';snake.style.top = snakeY + 'px';// 检查是否吃到了食物if (snakeX === foodX && snakeY === foodY) {food.style.display = 'none'; // 食物消失generateFood(); // 生成新的食物score += 5; // 增加分数updateScore(); // 更新分数显示}// 检查是否撞墙if (isSnakeCollidingWithWall(snakeX, snakeY)) {var restart = confirm('游戏失败!你的得分是: ' + score + ' 是否重新开始?');if (restart) { // 重新开始resetGame();}return; // 不重新开始,则结束函数}}, 500); // 每隔500ms移动一次}// 开始游戏startGame();// 键盘事件监听器,控制蛇的移动方向document.addEventListener('keydown', function (event) {if (event.keyCode === 37 && snakeDirection !== 'right') { // 左箭头键snakeDirection = 'left';} else if (event.keyCode === 38 && snakeDirection !== 'down') { // 上箭头键snakeDirection = 'up';} else if (event.keyCode === 39 && snakeDirection !== 'left') { // 右箭头键snakeDirection = 'right';} else if (event.keyCode === 40 && snakeDirection !== 'up') { // 下箭头键snakeDirection = 'down';}});// 检查是否撞墙function isSnakeCollidingWithWall(snakeX, snakeY) {// 定义蛇的矩形边界框对象,包含蛇头的位置 (x, y) 和蛇的宽度和高度var snakeRect = {x: snakeX, // 蛇的横坐标y: snakeY, // 蛇的纵坐标width: 20, // 蛇的宽度height: 20 // 蛇的高度};// !!!重点!!!// 遍历墙数组,检查蛇是否与墙发生碰撞for (var i = 0; i < walls.length; i++) {// 获取当前墙var wall = walls[i];var wallRect = {// 墙的位置 (x, y) x: wall.offsetLeft,// 墙体元素左侧边缘相对于其最近的定位祖先元素的偏移量,并将其作为墙体的 x 坐标y: wall.offsetTop,// 墙体元素顶部边缘相对于其最近的定位祖先元素的偏移量,并将其作为墙体的 y 坐标// 墙的宽高width: wall.offsetWidth,height: wall.offsetHeight};// 检查蛇的边界框是否与当前墙的边界框相交if (snakeRect.x < wallRect.x + wallRect.width &&snakeRect.x + snakeRect.width > wallRect.x &&snakeRect.y < wallRect.y + wallRect.height &&snakeRect.y + snakeRect.height > wallRect.y) {return true; // 发生碰撞}// 蛇的左边界 小于 墙的右边界,蛇在墙的右侧(蛇从右往左撞墙)// 蛇的右边界 大于 墙的左边界,蛇在墙的左侧(蛇从左往右撞墙)// 蛇上边界的 小于 墙的下边界,蛇在墙的上侧(蛇从下往上撞墙)// 蛇下边界的 大于 墙的上边界,蛇在墙的上侧(蛇从上往下撞墙)}return false; // 未发生碰撞}
});

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

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

相关文章

Codeforces Round 295 (Div. 2) B. Two Buttons (BFS)

瓦夏发现了一个奇怪的装置。装置的前面板上有一个红色按钮、一个蓝色按钮和一个显示正整数的显示屏。点击红色按钮后&#xff0c;设备将显示的数字乘以 2 2 2。点击蓝色按钮后&#xff0c;设备从显示屏上的数字中减去 1 1 1。如果某个时候数字不再是正数&#xff0c;设备就会…

格式化D盘后C盘内的文件会受影响吗?深度解析

在计算机的日常使用中&#xff0c;磁盘格式化是一个常见的操作&#xff0c;它能帮助我们清除磁盘上的数据&#xff0c;为新的数据腾出空间。然而&#xff0c;当涉及到系统盘和其他存储盘时&#xff0c;许多用户会担心一个问题&#xff1a;如果我格式化了非系统盘&#xff0c;比…

paddle ocr

paddle安装教程&#xff0c;git clone xxxgit https://blog.csdn.net/Castlehe/article/details/117356343 只有paddle 1.x 的教程&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/static/doc/doc_en/quickstart_en.md 报错是因为安装的是paddle 2.x而教程只给了…

蓝桥杯真题演练:2023B组c/c++

日期统计 小蓝现在有一个长度为 100 的数组&#xff0c;数组中的每个元素的值都在 0 到 9 的范围之内。 数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 …

连锁品牌企业为何不能使用通用收银系统?

在连锁服装品牌企业中&#xff0c;加盟连锁店往往选择使用特定的收银管理系统&#xff0c;而不是市面上通用的收银系统。这一选择背后有着几个主要原因&#xff1a; 首先&#xff0c;加盟连锁店的核心在于品牌的一致性和管理。采用统一的收银管理系统可以确保所有门店在运营和管…

2024连锁收银系统哪个好 有什么特点

在服装连锁店的经营中&#xff0c;选择一款优秀的收银系统至关重要。收银系统不仅仅是简单的结账工具&#xff0c;更是管理销售、库存和客户信息的关键平台。以下将介绍几款优秀的服装连锁店收银系统&#xff0c;以便您更好地了解各款系统的特点和优势。 1. 商淘云连锁店收银系…

【CSS】一篇文章讲清楚screen、window和html元素的位置:top、left、width、height

一个Web网页从内到外的顺序是&#xff1a; 元素div,ul,table... → 页面body → 浏览器window → 屏幕screen 分类详情屏幕screen srceen.width - 屏幕的宽度 screen.height - 屏幕的高度&#xff08;屏幕未缩放时&#xff0c;表示屏幕分辨率&#xff09; screen.availLeft …

数据分析_Pandas中的OLAP(类SQL中窗口函数)

数据分析_Pandas中的OLAP(类SQL中窗口函数) 窗口函数: 被称为联机分析函数 (OLAP, Online Anallytical Processing) 或者分析函数(Analytic Function)。 窗口函数允许用户根据数据行与所谓窗口 [so-called window] 中的当前行之间的某种关系对数据行执行计算, 并对每一行数据…

中国绿色技术助力全球能源转型(国际论坛)

中国的清洁能源发展战略和实践对全球能源结构转型产生了深远影响。作为全球最大的可再生能源生产和消费国&#xff0c;中国在推动国内可再生能源产业发展的同时&#xff0c;也积极与世界各国分享技术和经验&#xff0c;促进全球范围内清洁能源技术的普及和应用成本的降低。例如…

C 408—《数据结构》易错考点200题(含解析)

目录 Δ前言 一、绪论 1.1 数据结构的基本概念 : 1.2 算法和算法评价 : 二、线性表 2.2 线性表的顺序表示 : 2.3 线性表的链式表示 : 三、栈、队列和数组 3.1 栈 3.2 队列 3.3 栈和队列的应用 3.4 数组和特殊矩阵 四、串 4.2 串的模式匹配 五、树与二叉树 5.1 树的基…

解决 Mac App Store 不显示可用更新的问题

相信不少人遇到过 Mac App Store 有更新提示&#xff0c;但进入应用商店的「更新」一栏不会显示可用更新的软件列表。只有进入对应软件详情页才会显示可更新。 解决方法是使用快捷键「⌘ R」来刷新页面。 Related Link: Troubleshooting App Store Issues

Docker 安装 RocketMQ

目录 一、新建两个配置文件 1.1 创建docker-compose.yml文件 1.2 .新建broker.conf文件 二、运行 三、可视化界面 一、新建两个配置文件 1.1 创建docker-compose.yml文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_name: rmqnamesrvports…

Gradle 实战 - 命令行传递-ApiHug准备-工具篇-013

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

人工智能科普:人工智能的分类

人工智能的分类多种多样&#xff0c;根据不同的标准和应用场景&#xff0c;可以将其划分为多个不同的类别。以下是对人工智能分类的详细探讨。 一、按应用领域分类 1. 智能机器人&#xff1a;智能机器人是人工智能技术在机器人领域的应用。它们能够根据环境和任务的不同进行自…

【论文速读】| 基于大语言模型的模糊测试技术

本次分享论文为&#xff1a;Large Language Models Based Fuzzing Techniques: A Survey 基本信息 原文作者&#xff1a;Linghan Huang, Peizhou Zhao, Huaming Chen, Lei Ma 作者单位&#xff1a;悉尼大学&#xff1b;东京大学&#xff1b;阿尔伯塔大学 关键词&#xff1a;…

DP算法的精髓是什么?

概述 DP(动态规划)通过将原问题拆分成一系列子问题&#xff0c;并通过对子问题求解。所以&#xff0c;也可以把DP算法定义为“多阶段决策最优解模型”&#xff08;决策树&#xff09; 同时该模型也具有以下明显特征&#xff1a; 问题的最优解包含子问题的最优解。反过来说的…

[全网最全]2024MathorCup妈妈杯ABCD题成品论文33页+配套完整代码数据汇总

所有题目的每一小问解答&#xff08;含配套代码和数据&#xff09;都已经更新完毕&#xff0c;其中C题成品论文33页更新&#xff0c;B题论文更新&#xff0c;A题半成品论文21页完整解答代码数据。 &#xff08;完整版的资料放在文末了&#xff09; A题 移动通信网络中PCI规划问…

使用云服务器搭建CentOS操作系统

云服务器搭建CentOS操作系统 前言一、购买云服务器腾讯云阿里云华为云 二、使用 XShell 远程登陆到 Linux关于 Linux 桌面下载 XShell安装XShell查看 Linux 主机 ip使用 XShell 登陆主机 三、无法使用密码登陆的解决办法 前言 CentOS是一种基于Red Hat Enterprise Linux&#…

Java入门学习Day05

本篇文章主要有创建package、关系运算符、逻辑运算符、三元运算符和其对应的实例。 一、创建package 创建一个包&#xff0c;把我们之前或之后用到的运算符代码都放到这个package里&#xff0c;方面管理。 包的命名通常是公司的网站名称倒着写(com.mayin)&#xff0c;再加上…

老板想实现核心人才激励,首先需要明确谁是核心人才?

导读&#xff1a;实现核心人才激励&#xff0c;首先需要明确谁是核心人才&#xff1f;美国康奈尔大学的Snell教授按照人力资源价值性和稀缺性标准,将组织的人力资源分成4种类型:“核心人才、通用型人才、辅助性人才和独特人才”。 ​ 人才同时具有贡献大&#xff0c;市场稀缺…