贪吃蛇游戏

贪吃蛇

一、html

 <div class="container" id="app"></div><script src="./js/index.js"></script>

二、css

* {margin: 0;top: 0;}
.set {margin: 15px auto;width: 600px;
}
.container {width: 600px;height: 600px;background-color: #225675;margin: 40px auto;outline: 20px solid #7dd9ff;position: relative;
}
.snake {position: absolute;
}
.snake-head {width: 0px;height: 0px;border-bottom: 10px solid transparent;border-left: 10px solid rgb(157, 219, 177);border-right: 10px solid transparent;border-top: 10px solid transparent;transform: rotate(0deg);
}.snake-body {border-radius: 50%;background-color: #7db5ff;
}
.egg {position: absolute;background-color: rgb(241, 54, 232);border-radius: 50%;
}.cover {position: absolute;top: 0;left: 0;right: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.5);display: flex;justify-content: center;align-items: center;
}
.cover .content {width: 60%;height: 50px;background-color: rgb(134, 225, 237);display: flex;justify-content: center;align-items: center;
}

三、JavaScript

// 获取一个随机数,用于生成随机位置的蛋
function getRandom(rate) {return Math.floor(Math.random() * rate);
}// 定义蛇类
class Snake {constructor(snakeBody, size, direction) {this.direction = direction; // 初始化蛇的方向this.size = size; // 初始化蛇的大小// 初始化蛇的身体,将传入的坐标乘以大小this.snakeBody =snakeBody.length > 0 &&snakeBody.map((pos) => ({left: pos.left * size,top: pos.top * size,}));}// 渲染蛇render() {let template = "";let transformDeg = 0;switch (this.direction) {case "right":transformDeg = 0;break;case "down":transformDeg = 90;break;case "left":transformDeg = 180;break;case "up":transformDeg = -90;break;}return this.snakeBody.reduce((prev, next, currentIndex) => {if (currentIndex === 0) {template =prev +`<div class="snake-head snake" style="left:${next.left}px;top:${next.top}px;border-width:${this.size / 2}px;transform: rotate(${transformDeg}deg);"></div>\n`;} else {template =prev +`<div class="snake-body snake" style="left:${next.left}px;top:${next.top}px;width:${this.size}px;height:${this.size}px;transform: rotate(${transformDeg}deg);"></div>`;}return template;}, "");}// 移动蛇的头部nextStep() {const head = this.snakeBody[0];//获取蛇的头部let newHead;switch (this.direction) {case "right":newHead = { left: head.left + this.size, top: head.top };//水平方向向右移动一个距离,垂直方向保持不动,left值需增加break;case "down":newHead = { left: head.left, top: head.top + this.size };//水平方向不动,垂直方向向下一个距离,top值需增加break;case "left":newHead = { left: head.left - this.size, top: head.top };//水平方向向左移动一个距离,垂直方向保持不动,left值需减少break;case "up":newHead = { left: head.left, top: head.top - this.size };//水平方向不动,垂直方向向上一个距离,top值需减少break;}// 将新头添加到蛇身体数组的开头,并且删掉最后一个this.snakeBody.unshift(newHead);this.snakeBody.pop();console.log(this.direction);console.log(this.size);console.log(this.snakeBody);}// 增加蛇的长度snakeGrowUp() {let snake = this.snakeBody;let lens = snake.length;let snakeTail;const prev = snake[lens - 2]; // 蛇尾部倒数第二个const next = snake[lens - 1]; // 蛇尾部倒数第一个if (prev.top === next.top && prev.left < next.left) {// 向左运动snakeTail = { ...next, left: next.left + this.size };} else if (prev.top === next.top && prev.left > next.left) {// 向右运动snakeTail = { ...next, left: next.left - this.size };} else if (prev.left === next.left && prev.top > next.top) {// 向下运动snakeTail = { ...next, top: next.top - this.size };} else {// 向上运动snakeTail = { ...next, top: next.top + this.size };}this.snakeBody.push(snakeTail); // 添加新尾部this.render(); // 重新渲染蛇身体}// 判断蛇是否撞到墙壁或自身isArriveWall() {const snake = this.snakeBody;let isEnd;// 判断是否撞墙if (snake[0].left >= this.size * MAPSIZE ||snake[0].top >= this.size * MAPSIZE ||snake[0].left < 0 ||snake[0].top < 0) {isEnd = true;}// 判断是否撞自己for (let i = 1; i < snake.length; i++) {if (snake[0].left === snake[i].left && snake[0].top === snake[i].top) {isEnd = true;break;}}return isEnd;}// 改变蛇的方向changeSnakeDirection(direction) {this.direction = direction;}
}// 定义蛋类
class Egg {constructor(size) {this.position = { left: 3 * size, top: 0 * size }; // 初始化蛋的位置this.size = size; // 初始化蛋的大小}// 渲染蛋render() {const div = document.createElement("div");div.innerHTML = `<div class='egg' style="left:${this.position.left}px;top:${this.position.top}px;width:${this.size}px;height:${this.size}px">`;return div.children[0];}// 更新蛋的位置flushed() {this.position = {left: getRandom(MAPSIZE) * this.size,top: getRandom(MAPSIZE) * this.size,};}
}// 判断蛇是否吃到蛋
function isArriveEgg(snake, egg) {const snakeBody = snake.snakeBody;return (snakeBody[0].left === egg.position.left &&snakeBody[0].top === egg.position.top);
}const MAPSIZE = 30; // 地图大小
let timer;// 初始化游戏
function init(app) {const snake = new Snake([{ left: 2, top: 0 },{ left: 1, top: 0 },{ left: 0, top: 0 },],20);const egg = new Egg(20);render(app, snake, egg);let direction;// 监听键盘事件,控制蛇的方向document.addEventListener("keydown", (e) => {if (e.key === "ArrowUp" || e.key.toLocaleLowerCase() === "w") {direction != "down" && (direction = "up");} else if (e.key === "ArrowDown" || e.key.toLocaleLowerCase() === "s") {direction != "up" && (direction = "down");} else if (e.key === "ArrowRight" || e.key.toLocaleLowerCase() === "d") {direction != "left" && (direction = "right");} else if (e.key === "ArrowLeft" || e.key.toLocaleLowerCase() === "a") {direction != "right" && (direction = "left");} else {return;}snake.changeSnakeDirection(direction);timer && clearInterval(timer);direction && autoMove(app, snake, egg);});
}// 自动移动蛇
function autoMove(app, snake, egg) {timer = setInterval(() => {snake.nextStep();if (isArriveEgg(snake, egg)) {snake.snakeGrowUp();egg.flushed();}// 判断是否撞墙if (snake.isArriveWall()) {endGame(app, snake);} else {render(app, snake, egg);}}, Math.floor(1000 / 5));
}// 渲染游戏界面
function render(app, snake, egg) {const snakeTemplate = snake.render();const eggDom = egg.render();app.innerHTML = snakeTemplate;app.appendChild(eggDom);
}// 游戏结束
function endGame(App, snake) {timer && clearInterval(timer);const div = document.createElement("div");div.innerHTML = `<div class="cover"><div class="content">游戏结束,得分${snake.snakeBody.length - 3}</div></div>`;const endGameDom = div.children[0];App.parentNode.appendChild(endGameDom);endGameDom.addEventListener("click", () => {App.parentNode.removeChild(endGameDom);init(App);});
}

四、样式截图请添加图片描述

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

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

相关文章

【动态路由】系统Web URL资源整合系列(后端技术实现)【apisix实现】

需求说明 软件功能需求&#xff1a;反向代理功能&#xff08;描述&#xff1a;apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…

Spring Boot(七):Swagger 接口文档

1. Swagger 简介 1.1 Swagger 是什么&#xff1f; Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…

MongoDB 7 分片副本集升级方案详解(上)

#作者&#xff1a;任少近 文章目录 前言&#xff1a;Mongodb版本升级升级步骤环境1.1环境准备1.2standalone升级1.3分片、副本集升级 前言&#xff1a;Mongodb版本升级 在开始升级之前&#xff0c;请参阅 MongoDB下个版本中的兼容性变更文档&#xff0c;以确保您的应用程序和…

Redis离线安装

Linux系统Centos安装部署Redis缓存插件 参考&#xff1a;Redis中文网&#xff1a; https://www.redis.net.cn/ 参考&#xff1a;RPM软件包下载地址&#xff1a; https://rpmfind.net/linux/RPM/index.html http://rpm.pbone.net/ https://mirrors.aliyun.com/centos/7/os…

长视频生成、尝试性检索、任务推理 | Big Model Weekly 第56期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 COMAL:AConvergent Meta-Algorithm for Aligning LLMs with General Preferences 许多对齐方法&#xff0c;包括基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;依赖于布拉德利-特里&#…

SQL高级语法

1. TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说&#xff0c;TOP 子句是非常有用的。 SQL Server 的语法&#xff1a; SELECT TOP number|percent column_name(s) FROM table_name MySQL 语法 在 MySQL 中&#xff0c;并没有直接支持 TOP 语…

均匀面阵抗干扰算法原理及MATLAB仿真

均匀面阵抗干扰算法原理及MATLAB仿真 仿真方向图&#xff0c;频谱图&#xff0c;计算输出SNR、INR、SINR 文章目录 前言一、抗干扰算法原理二、抗干扰算法仿真三、MATLAB源代码总结 前言 \;\;\;\;\; 在阵列信号处理中&#xff0c;信号的抗干扰处理是重中之重&#xff0c;传输期…

Elasticsearch:同义词在 RAG 中重要吗?

作者&#xff1a;来自 Elastic Jeffrey Rengifo 及 Toms Mura 探索 RAG 应用程序中 Elasticsearch 同义词的功能。 同义词允许我们使用具有相同含义的不同词语在文档中搜索&#xff0c;以确保用户无论使用什么确切的词语都能找到他们所寻找的内容。你可能会认为&#xff0c;由于…

算法与数据结构(最小栈)

题目 思路 为了返回栈中的最小元素&#xff0c;我们需要额外维护一个辅助栈 min_stack&#xff0c;它的作用是记录当前栈中的最小值。 min_stack的作用&#xff1a; min_stack的栈顶元素始终是当前栈 st 中的最小值。 每当st中压入一个新元素时&#xff0c;如果这个元素小于等…

midjourney 一 prompt 提示词

midjourney 不需要自然语言的描述&#xff0c;它只需要关键词即可。 一个完整的Midjourney prompt通常包括三个部分 图片提示&#xff08;Image Prompts&#xff09;、文本提示&#xff08;Text Prompt&#xff09;和参数&#xff08;Parameters&#xff09;。 1、图片提示(…

英码科技基于昇腾算力实现DeepSeek离线部署

DeepSeek-R1 模型以其创新架构和高效能技术迅速成为行业焦点。如果能够在边缘进行离线部署&#xff0c;不仅能发挥DeepSeek大模型的效果&#xff0c;还能确保数据处理的安全性和可控性。 英码科技作为AI算力产品和AI应用解决方案服务商&#xff0c;积极响应市场需求&#xff0…

Android13-包安装器PackageInstaller-之apk安装流程

目的 我们最终是为了搞明白安装的整个流程通过安卓系统自带的包安装器来了解PMS 安装流程实现需求定制&#xff1a;静默安装-安装界面定制-安装拦截验证。【核心目的】 安装流程和PMS了解不用多说了; 安装定制相关&#xff1a; 如 手机上安装时候弹出锁屏界面需要输入密码;安…

新型基于Go语言的恶意软件利用Telegram作为C2通信渠道

研究人员发现了一种新型后门恶意软件&#xff0c;使用Go语言编写&#xff0c;并利用Telegram作为其命令与控制&#xff08;C2&#xff09;通信渠道。尽管该恶意软件似乎仍处于开发阶段&#xff0c;但它已经具备完整的功能&#xff0c;能够执行多种恶意活动。这种创新的C2通信方…

5分钟了解! 探索 AnythingLLM,借助开源 AI 打造私有化智能知识库,熟悉向量数据库

本文是系列文章&#xff0c;在前面提到安装Ollama和AnythingLLM的教程&#xff0c;本文会着重解决本地文档向量化的过程&#xff0c;同时本地应用的管理。 图1. 上传本地文档进行向量化处理 • 构建向量数据库特别慢&#xff1a;支持的文档格式很多&#xff0c;但在我的电脑32…

电商小程序(源码+文档+部署+讲解)

引言 随着移动互联网的快速发展&#xff0c;电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段&#xff0c;为消费者提供了一个便捷、高效的购物平台&#xff0c;从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计&#xff0c;服…

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面 系统注册页…

合并多次commit记录

合并多次commit记录 1. 首先先提交多次记录2. 某个版本之前的commit记录合并 1. 首先先提交多次记录 在log中可以看到有多次commit 记录 然后拉取最新代码 (base) ➜ gaolijie git:(master) git pull --rebase origin masterFrom https://gitee.com/Blue_Pepsi_Cola/gaoliji…

哈希表(C语言版)

文章目录 哈希表原理实现(无自动扩容功能)代码运行结果 分析应用 哈希表 如何统计一段文本中&#xff0c;小写字母出现的次数? 显然&#xff0c;我们可以用数组 int table[26] 来存储每个小写字母出现的次数&#xff0c;而且这样处理&#xff0c;效率奇高。假如我们想知道字…

uniapp商城之首页模块

文章目录 前言一、自定义导航栏1.静态结构2.修改页面配置3.组件安全区适配二、通用轮播组件1. 静态结构组件2.自动导入全局组件3.首页轮播图数据获取三、首页分类1.静态结构2.首页获取分类数据并渲染四、热门推荐1.静态结构2.首页获取推荐数据并渲染3.首页跳转详细推荐页五、猜…

CNAPPgoat:一款针对云环境的安全实践靶场

关于CNAPPgoat CNAPPgoat是一款针对云环境的安全实践靶场&#xff0c;该工具旨在帮助广大研究人员在云环境中模块化地提供故意留下安全缺陷的设计组件&#xff0c;专为防御者和渗透测试人员提供练习场地而设计。 CNAPPgoat的主要功能是跨多个云服务提供商部署故意留下安全缺陷…