从零开始用HTML、CSS和JavaScript制作贪吃蛇网页小游戏

〇、前言

贪吃蛇是一款经典的休闲游戏,在诺基亚手机时代风靡全球。

在这里插入图片描述

作为编程入门者,实现一个贪吃蛇游戏是学习Web前端技术的绝佳练习

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

    • 〇、前言
    • 效果预览
    • 一、HTML结构
    • 二、CSS样式设计
    • 三、JavaScript游戏逻辑
    • 四、代码详解
      • 1. 游戏初始化
      • 2. 生成食物
      • 3. 移动蛇
      • 4. 碰撞检测
      • 5. 游戏控制
    • 五、完整代码

很高兴你打开了这篇博客,更多好用的软件工具,请关注我、订阅专栏《项目探索实验室》,内容持续更新中…

思维速览:
在这里插入图片描述

本文将详细讲解如何使用HTML、CSS和JavaScript从零开始创建一个功能完整的贪吃蛇网页游戏(更多功能可以根据个人开发需求拓展)

我们的贪吃蛇游戏将包含以下功能:

  • 基础的游戏逻辑(移动、吃食物、碰撞检测)
  • 分数记录和最高分保存
  • 游戏控制(开始、暂停、继续)
  • 自适应界面设计(支持PC和移动设备)
  • 逐步提高的游戏难度

效果预览

1️⃣静态展示:

在这里插入图片描述

2️⃣动态展示:

请添加图片描述

完成后的游戏效果如下:

  • 一个20x20格子的游戏场地
  • 绿色的蛇,红色的食物
  • 顶部显示当前分数和历史最高分
  • 底部有游戏控制按钮和移动设备专用的方向控制键

一、HTML结构

首先,创建基本的HTML结构:

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>贪吃蛇小游戏</title><!-- CSS将在这里添加 -->
</head>
<body><h1>贪吃蛇小游戏</h1><div class="game-container"><div class="game-header"><div>分数: <span id="score">0</span></div><div>最高分: <span id="high-score">0</span></div></div><div id="game-board"></div><div class="controls"><button id="start-button">开始游戏</button><div class="mobile-controls"><button class="up"></button><button class="left"></button><button class="right"></button><button class="down"></button></div></div></div><!-- JavaScript将在这里添加 -->
</body>
</html>

这个HTML结构包含了:

  • 游戏标题
  • 分数和最高分显示区域
  • 游戏主画布(game-board)
  • 游戏控制按钮
  • 移动设备的方向控制按钮

二、CSS样式设计

接下来,我们需要添加CSS样式,使游戏看起来更加美观:

<style>body {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100vh;margin: 0;background-color: #f0f0f0;font-family: Arial, sans-serif;}.game-container {display: flex;flex-direction: column;align-items: center;}.game-header {display: flex;justify-content: space-between;width: 400px;margin-bottom: 10px;}#game-board {width: 400px;height: 400px;border: 2px solid #333;position: relative;background-color: #eee;}.snake-part {width: 20px;height: 20px;background-color: #4CAF50;position: absolute;border-radius: 2px;}.snake-head {background-color: #388E3C;}.food {width: 20px;height: 20px;background-color: #F44336;position: absolute;border-radius: 50%;}.controls {margin-top: 20px;display: flex;flex-direction: column;align-items: center;}button {padding: 10px 20px;margin: 5px;font-size: 16px;cursor: pointer;background-color: #2196F3;color: white;border: none;border-radius: 4px;}button:hover {background-color: #0b7dda;}.mobile-controls {display: grid;grid-template-columns: 1fr 1fr 1fr;grid-template-rows: 1fr 1fr 1fr;gap: 5px;margin-top: 15px;max-width: 200px;}.mobile-controls button {padding: 15px;margin: 0;}.up {grid-column: 2;grid-row: 1;}.left {grid-column: 1;grid-row: 2;}.right {grid-column: 3;grid-row: 2;}.down {grid-column: 2;grid-row: 3;}@media (max-width: 500px) {#game-board {width: 300px;height: 300px;}.game-header {width: 300px;}}
</style>

这些CSS样式:

  • 使用Flexbox和Grid布局
  • 设计蛇和食物的外观
  • 美化按钮和控件
  • 添加响应式设计,适应不同屏幕尺寸

三、JavaScript游戏逻辑

最后,也是最重要的部分,我们需要实现游戏的核心逻辑:

<script>document.addEventListener('DOMContentLoaded', () => {// 游戏变量const boardSize = 20; // 20x20 格子const gridSize = 20; // 每个格子的大小(像素)const board = document.getElementById('game-board');const scoreElement = document.getElementById('score');const highScoreElement = document.getElementById('high-score');const startButton = document.getElementById('start-button');let snake = []; // 蛇的身体部分坐标let food = null; // 食物坐标let direction = 'right'; // 初始方向let nextDirection = 'right';let gameInterval = null;let score = 0;let highScore = localStorage.getItem('snakeHighScore') || 0;let gameSpeed = 150; // 游戏速度,毫秒let gameStarted = false;let gamePaused = false;highScoreElement.textContent = highScore;// 初始化游戏function initGame() {clearBoard();// 初始化蛇snake = [{x: 5, y: 10}, // 头部{x: 4, y: 10},{x: 3, y: 10}];// 重置游戏状态direction = 'right';nextDirection = 'right';score = 0;scoreElement.textContent = score;// 生成第一个食物generateFood();// 渲染初始状态renderSnake();renderFood();}// 清空游戏板function clearBoard() {board.innerHTML = '';}// 生成食物function generateFood() {let foodPosition;let onSnake;do {// 随机生成食物位置foodPosition = {x: Math.floor(Math.random() * boardSize),y: Math.floor(Math.random() * boardSize)};// 检查食物是否与蛇重叠onSnake = snake.some(part => part.x === foodPosition.x && part.y === foodPosition.y);} while (onSnake);food = foodPosition;}// 渲染蛇function renderSnake() {snake.forEach((part, index) => {const snakePart = document.createElement('div');snakePart.className = 'snake-part';if (index === 0) {snakePart.classList.add('snake-head');}snakePart.style.left = `${part.x * gridSize}px`;snakePart.style.top = `${part.y * gridSize}px`;board.appendChild(snakePart);});}// 渲染食物function renderFood() {const foodElement = document.createElement('div');foodElement.className = 'food';foodElement.style.left = `${food.x * gridSize}px`;foodElement.style.top = `${food.y * gridSize}px`;board.appendChild(foodElement);}// 移动蛇function moveSnake() {// 更新方向direction = nextDirection;// 获取蛇头的当前位置const head = {...snake[0]};// 根据方向移动蛇头switch (direction) {case 'up':head.y -= 1;break;case 'down':head.y += 1;break;case 'left':head.x -= 1;break;case 'right':head.x += 1;break;}// 检查碰撞if (checkCollision(head)) {gameOver();return;}// 将新头部添加到蛇的开始snake.unshift(head);// 检查是否吃到食物if (head.x === food.x && head.y === food.y) {// 吃到食物,增加分数score += 10;scoreElement.textContent = score;// 更新最高分if (score > highScore) {highScore = score;highScoreElement.textContent = highScore;localStorage.setItem('snakeHighScore', highScore);}// 生成新食物generateFood();// 增加游戏速度if (gameSpeed > 50) {gameSpeed -= 2;clearInterval(gameInterval);gameInterval = setInterval(gameLoop, gameSpeed);}} else {// 没吃到食物,移除蛇尾snake.pop();}// 重新渲染游戏clearBoard();renderSnake();renderFood();}// 检查碰撞function checkCollision(head) {// 检查墙壁碰撞if (head.x < 0 || head.x >= boardSize || head.y < 0 || head.y >= boardSize) {return true;}// 检查自身碰撞return snake.some((part, index) => {// 跳过第一个元素,因为它就是头部if (index === 0) return false;return part.x === head.x && part.y === head.y;});}// 游戏结束function gameOver() {clearInterval(gameInterval);alert(`游戏结束! 你的得分: ${score}`);gameStarted = false;startButton.textContent = '开始游戏';}// 游戏循环function gameLoop() {moveSnake();}// 开始游戏function startGame() {if (gameStarted) {// 如果游戏已经开始,暂停或继续if (gamePaused) {// 继续游戏gameInterval = setInterval(gameLoop, gameSpeed);startButton.textContent = '暂停游戏';gamePaused = false;} else {// 暂停游戏clearInterval(gameInterval);startButton.textContent = '继续游戏';gamePaused = true;}} else {// 开始新游戏initGame();gameInterval = setInterval(gameLoop, gameSpeed);gameStarted = true;gamePaused = false;startButton.textContent = '暂停游戏';}}// 处理键盘输入document.addEventListener('keydown', e => {if (!gameStarted || gamePaused) return;// 防止方向键引起页面滚动if(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', ' '].includes(e.key)) {e.preventDefault();}// 更新方向switch (e.key) {case 'ArrowUp':if (direction !== 'down') nextDirection = 'up';break;case 'ArrowDown':if (direction !== 'up') nextDirection = 'down';break;case 'ArrowLeft':if (direction !== 'right') nextDirection = 'left';break;case 'ArrowRight':if (direction !== 'left') nextDirection = 'right';break;}});// 移动设备控制按钮document.querySelector('.up').addEventListener('click', () => {if (direction !== 'down' && gameStarted && !gamePaused) nextDirection = 'up';});document.querySelector('.down').addEventListener('click', () => {if (direction !== 'up' && gameStarted && !gamePaused) nextDirection = 'down';});document.querySelector('.left').addEventListener('click', () => {if (direction !== 'right' && gameStarted && !gamePaused) nextDirection = 'left';});document.querySelector('.right').addEventListener('click', () => {if (direction !== 'left' && gameStarted && !gamePaused) nextDirection = 'right';});// 开始游戏按钮startButton.addEventListener('click', startGame);// 初始化游戏initGame();});
</script>

四、代码详解

1. 游戏初始化

function initGame() {clearBoard();// 初始化蛇snake = [{x: 5, y: 10}, // 头部{x: 4, y: 10},{x: 3, y: 10}];// 重置游戏状态direction = 'right';nextDirection = 'right';score = 0;scoreElement.textContent = score;// 生成第一个食物generateFood();// 渲染初始状态renderSnake();renderFood();
}

这个函数负责:

  • 清空游戏板
  • 创建初始长度为3的蛇
  • 重置方向和分数
  • 生成食物
  • 渲染初始游戏状态

2. 生成食物

function generateFood() {let foodPosition;let onSnake;do {// 随机生成食物位置foodPosition = {x: Math.floor(Math.random() * boardSize),y: Math.floor(Math.random() * boardSize)};// 检查食物是否与蛇重叠onSnake = snake.some(part => part.x === foodPosition.x && part.y === foodPosition.y);} while (onSnake);food = foodPosition;
}

这个函数:

  • 随机生成食物的位置
  • 确保食物不会出现在蛇身上
  • 使用do-while循环直到找到合适的位置

3. 移动蛇

function moveSnake() {// 更新方向direction = nextDirection;// 获取蛇头的当前位置const head = {...snake[0]};// 根据方向移动蛇头switch (direction) {case 'up':head.y -= 1;break;case 'down':head.y += 1;break;case 'left':head.x -= 1;break;case 'right':head.x += 1;break;}// 检查碰撞if (checkCollision(head)) {gameOver();return;}// 将新头部添加到蛇的开始snake.unshift(head);// 检查是否吃到食物if (head.x === food.x && head.y === food.y) {// 吃到食物,增加分数score += 10;scoreElement.textContent = score;// 更新最高分if (score > highScore) {highScore = score;highScoreElement.textContent = highScore;localStorage.setItem('snakeHighScore', highScore);}// 生成新食物generateFood();// 增加游戏速度if (gameSpeed > 50) {gameSpeed -= 2;clearInterval(gameInterval);gameInterval = setInterval(gameLoop, gameSpeed);}} else {// 没吃到食物,移除蛇尾snake.pop();}// 重新渲染游戏clearBoard();renderSnake();renderFood();
}

这个函数是游戏的核心,它:

  • 根据当前方向移动蛇头
  • 检查是否发生碰撞
  • 如果吃到食物,增加分数,生成新食物,加快游戏速度
  • 如果没吃到食物,移除蛇尾(保持长度不变)
  • 更新游戏界面

4. 碰撞检测

function checkCollision(head) {// 检查墙壁碰撞if (head.x < 0 || head.x >= boardSize || head.y < 0 || head.y >= boardSize) {return true;}// 检查自身碰撞return snake.some((part, index) => {// 跳过第一个元素,因为它就是头部if (index === 0) return false;return part.x === head.x && part.y === head.y;});
}

这个函数检查两种碰撞情况:

  • 蛇头撞到墙壁(超出游戏边界)
  • 蛇头撞到自己的身体

5. 游戏控制

function startGame() {if (gameStarted) {// 如果游戏已经开始,暂停或继续if (gamePaused) {// 继续游戏gameInterval = setInterval(gameLoop, gameSpeed);startButton.textContent = '暂停游戏';gamePaused = false;} else {// 暂停游戏clearInterval(gameInterval);startButton.textContent = '继续游戏';gamePaused = true;}} else {// 开始新游戏initGame();gameInterval = setInterval(gameLoop, gameSpeed);gameStarted = true;gamePaused = false;startButton.textContent = '暂停游戏';}
}

这个函数处理游戏的控制逻辑:

  • 开始新游戏
  • 暂停正在进行的游戏
  • 继续已暂停的游戏

五、完整代码

最后,我们将上面的HTML、CSS和JavaScript代码合并,得到完整的贪吃蛇游戏

<!--创作者:Code_流苏(CSDN)-->
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>贪吃蛇小游戏</title><style>body {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100vh;margin: 0;background-color: #f0f0f0;font-family: Arial, sans-serif;}.game-container {display: flex;flex-direction: column;align-items: center;}.game-header {display: flex;justify-content: space-between;width: 400px;margin-bottom: 10px;}#game-board {width: 400px;height: 400px;border: 2px solid #333;position: relative;background-color: #eee;}.snake-part {width: 20px;height: 20px;background-color: #4CAF50;position: absolute;border-radius: 2px;}.snake-head {background-color: #388E3C;}.food {width: 20px;height: 20px;background-color: #F44336;position: absolute;border-radius: 50%;}.controls {margin-top: 20px;display: flex;flex-direction: column;align-items: center;}button {padding: 10px 20px;margin: 5px;font-size: 16px;cursor: pointer;background-color: #2196F3;color: white;border: none;border-radius: 4px;}button:hover {background-color: #0b7dda;}.mobile-controls {display: grid;grid-template-columns: 1fr 1fr 1fr;grid-template-rows: 1fr 1fr 1fr;gap: 5px;margin-top: 15px;max-width: 200px;}.mobile-controls button {padding: 15px;margin: 0;}.up {grid-column: 2;grid-row: 1;}.left {grid-column: 1;grid-row: 2;}.right {grid-column: 3;grid-row: 2;}.down {grid-column: 2;grid-row: 3;}@media (max-width: 500px) {#game-board {width: 300px;height: 300px;}.game-header {width: 300px;}}</style>
</head>
<body><h1>贪吃蛇小游戏</h1><div class="game-container"><div class="game-header"><div>分数: <span id="score">0</span></div><div>最高分: <span id="high-score">0</span></div></div><div id="game-board"></div><div class="controls"><button id="start-button">开始游戏</button><div class="mobile-controls"><button class="up"></button><button class="left"></button><button class="right"></button><button class="down"></button></div></div></div><script>document.addEventListener('DOMContentLoaded', () => {// 游戏变量const boardSize = 20; // 20x20 格子const gridSize = 20; // 每个格子的大小(像素)const board = document.getElementById('game-board');const scoreElement = document.getElementById('score');const highScoreElement = document.getElementById('high-score');const startButton = document.getElementById('start-button');let snake = []; // 蛇的身体部分坐标let food = null; // 食物坐标let direction = 'right'; // 初始方向let nextDirection = 'right';let gameInterval = null;let score = 0;let highScore = localStorage.getItem('snakeHighScore') || 0;let gameSpeed = 150; // 游戏速度,毫秒let gameStarted = false;let gamePaused = false;highScoreElement.textContent = highScore;// 初始化游戏function initGame() {clearBoard();// 初始化蛇snake = [{x: 5, y: 10}, // 头部{x: 4, y: 10},{x: 3, y: 10}];// 重置游戏状态direction = 'right';nextDirection = 'right';score = 0;scoreElement.textContent = score;// 生成第一个食物generateFood();// 渲染初始状态renderSnake();renderFood();}// 清空游戏板function clearBoard() {board.innerHTML = '';}// 生成食物function generateFood() {let foodPosition;let onSnake;do {// 随机生成食物位置foodPosition = {x: Math.floor(Math.random() * boardSize),y: Math.floor(Math.random() * boardSize)};// 检查食物是否与蛇重叠onSnake = snake.some(part => part.x === foodPosition.x && part.y === foodPosition.y);} while (onSnake);food = foodPosition;}// 渲染蛇function renderSnake() {snake.forEach((part, index) => {const snakePart = document.createElement('div');snakePart.className = 'snake-part';if (index === 0) {snakePart.classList.add('snake-head');}snakePart.style.left = `${part.x * gridSize}px`;snakePart.style.top = `${part.y * gridSize}px`;board.appendChild(snakePart);});}// 渲染食物function renderFood() {const foodElement = document.createElement('div');foodElement.className = 'food';foodElement.style.left = `${food.x * gridSize}px`;foodElement.style.top = `${food.y * gridSize}px`;board.appendChild(foodElement);}// 移动蛇function moveSnake() {// 更新方向direction = nextDirection;// 获取蛇头的当前位置const head = {...snake[0]};// 根据方向移动蛇头switch (direction) {case 'up':head.y -= 1;break;case 'down':head.y += 1;break;case 'left':head.x -= 1;break;case 'right':head.x += 1;break;}// 检查碰撞if (checkCollision(head)) {gameOver();return;}// 将新头部添加到蛇的开始snake.unshift(head);// 检查是否吃到食物if (head.x === food.x && head.y === food.y) {// 吃到食物,增加分数score += 10;scoreElement.textContent = score;// 更新最高分if (score > highScore) {highScore = score;highScoreElement.textContent = highScore;localStorage.setItem('snakeHighScore', highScore);}// 生成新食物generateFood();// 增加游戏速度if (gameSpeed > 50) {gameSpeed -= 2;clearInterval(gameInterval);gameInterval = setInterval(gameLoop, gameSpeed);}} else {// 没吃到食物,移除蛇尾snake.pop();}// 重新渲染游戏clearBoard();renderSnake();renderFood();}// 检查碰撞function checkCollision(head) {// 检查墙壁碰撞if (head.x < 0 || head.x >= boardSize || head.y < 0 || head.y >= boardSize) {return true;}// 检查自身碰撞return snake.some((part, index) => {// 跳过第一个元素,因为它就是头部if (index === 0) return false;return part.x === head.x && part.y === head.y;});}// 游戏结束function gameOver() {clearInterval(gameInterval);alert(`游戏结束! 你的得分: ${score}`);gameStarted = false;startButton.textContent = '开始游戏';}// 游戏循环function gameLoop() {moveSnake();}// 开始游戏function startGame() {if (gameStarted) {// 如果游戏已经开始,暂停或继续if (gamePaused) {// 继续游戏gameInterval = setInterval(gameLoop, gameSpeed);startButton.textContent = '暂停游戏';gamePaused = false;} else {// 暂停游戏clearInterval(gameInterval);startButton.textContent = '继续游戏';gamePaused = true;}} else {// 开始新游戏initGame();gameInterval = setInterval(gameLoop, gameSpeed);gameStarted = true;gamePaused = false;startButton.textContent = '暂停游戏';}}// 处理键盘输入document.addEventListener('keydown', e => {if (!gameStarted || gamePaused) return;// 防止方向键引起页面滚动if(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', ' '].includes(e.key)) {e.preventDefault();}// 更新方向switch (e.key) {case 'ArrowUp':if (direction !== 'down') nextDirection = 'up';break;case 'ArrowDown':if (direction !== 'up') nextDirection = 'down';break;case 'ArrowLeft':if (direction !== 'right') nextDirection = 'left';break;case 'ArrowRight':if (direction !== 'left') nextDirection = 'right';break;}});// 移动设备控制按钮document.querySelector('.up').addEventListener('click', () => {if (direction !== 'down' && gameStarted && !gamePaused) nextDirection = 'up';});document.querySelector('.down').addEventListener('click', () => {if (direction !== 'up' && gameStarted && !gamePaused) nextDirection = 'down';});document.querySelector('.left').addEventListener('click', () => {if (direction !== 'right' && gameStarted && !gamePaused) nextDirection = 'left';});document.querySelector('.right').addEventListener('click', () => {if (direction !== 'left' && gameStarted && !gamePaused) nextDirection = 'right';});// 开始游戏按钮startButton.addEventListener('click', startGame);// 初始化游戏initGame();});</script>
</body>
</html>

很感谢你能看到这里,如果你有哪些想学习的项目,欢迎在评论区分享!
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

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

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

相关文章

计算机网络-服务器模型

一.服务器模型 1.支持多客户端访问 //单循环服务器 socket bind listen while(1) { accept while(1) { recv/send } } close 注&#xff1a;该模式remvform为阻塞态&#xff0c;服务器将等待接收数据 2..支持多客户端同时访问 (并发能力) socket…

aardio - 虚表 —— 两个虚表之间互相拖动交换数据

插入到虚表末尾的方法&#xff1a; import win.ui; import godking.vlistEx; /*DSG{{*/ mainForm win.form(text"vlistEx - table adapter";right849;bottom578;border"thin") mainForm.add( radiobutton{cls"radiobutton";text"移动&qu…

正十七边形尺规作图证明——从高斯的发现到几何实现

正十七边形尺规作图证明——从高斯的发现到几何实现 1. 引言&#xff1a;一个历史性的数学突破 在欧几里得几何中&#xff0c;尺规作图&#xff08;仅使用直尺和圆规&#xff09;是最为基础的几何构造方法。古希腊数学家已知如何构造正三角形、正方形和正五边形&#xff0c;但…

Facebook 的历史与发展:从校园网站到全球社交平台

引言 Facebook&#xff0c;这个全球最大的社交网络平台之一&#xff0c;其发展历程充满了创新和变革。从最初的校园网站到如今的全球社交平台&#xff0c;Facebook 不仅改变了人们的沟通方式&#xff0c;也重塑了信息传播和社交互动的模式。 起源&#xff1a;校园内的点子 Fa…

windows无界面后台定时任务 (重启自启动,ODBS为例)

一、前言 mdb(Microsoft Database)是Microsoft Access中使用的一种数据存储格式,可以通过ODBC驱动程序进行访问和操作,在Python中也可以安装相应模块打开。 这是我在项目中更新bs数据的一个实践记录,结合windows定时一起记录一下,方便以后照搬~ 二、安装 Python安装库…

Android Studio 配置国内镜像源

Android Studio版本号&#xff1a;2022.1.1 Patch 2 1、配置gradle国内镜像&#xff0c;用腾讯云 镜像源地址&#xff1a;https\://mirrors.cloud.tencent.com/gradle 2、配置Android SDK国内镜像 地址&#xff1a;Index of /AndroidSDK/

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)

文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤&#xff08;Ollama方式&#xff09;1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…

安装并运行hadoop程序

1.在虚拟机上安装javaJDK &#xff08;1&#xff09;把javaJDK文件上传到服务器 在opt文件夹下新建一个software文件夹&#xff0c;将jdk拖入software &#xff08;2&#xff09;解压文件 在opt文件夹下新建一个module文件夹&#xff0c;确认上传成功之后&#xff0c;在softwa…

学习threejs,Animation、Core、CustomBlendingEquation、Renderer常量汇总

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Animation常量汇总1.1.1 循…

Ubuntu的软件源

百度搜索 ubuntu清华镜像源 根据下面的网页&#xff0c;选择对应Ubuntu操作系统的源&#xff0c;一定要对应&#xff01;&#xff01;&#xff01; https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/上图的系统是16.04 xenial&#xff0c;这时就一定要使用16.04 xenial的源 …

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…

我用Ai学LVGL之入门(DeepSeek版)

文章目录 什么是LVGL?**1. 基本定义****2. 核心特性****3. 典型应用场景****4. 核心优势****5. 与其他嵌入式GUI的对比****6. 如何快速体验&#xff1f;****7. 学习资源** 如何开始学习lvgl&#xff1f;**一、了解LVGL的核心特性与硬件要求****二、搭建开发环境与移植LVGL****…

JmeterHttp请求头管理出现Unsupported Media Type问题解决

JmeterHttp请求头管理出现Unsupported Media Type问题解决 大多数的app与pc端压测的时候都会出现这种情况 当我们在jemter测试当中当中遇见Unsupported Media Type&#xff0c;有一种可能就是我们请求的网页的content-Type的类型与我们测试的时候的类型不一致 解决方法 可以添…

香港地区上线独立多用户电商平台系统需要注意哪些问题

在香港地区上线独立多用户电商平台系统时&#xff0c;需结合本地化需求、技术架构、法律合规及用户体验等多方面因素&#xff0c;以下是需要注意的关键问题及建议&#xff1a; 一、技术架构与服务器部署 服务器配置与带宽选择 根据业务规模选择合适的香港服务器配置&#xff0…

【A2DP】MPEG - 2/4 AAC 编解码器互操作性要求详解

目录 一、概述 二、编解码器特定信息元素(Codec Specific Information Elements ) 2.1 信息元素结构 2.2 对象类型(Object Type) 2.3 MPEG - D DRC 2.4 采样频率(Sampling Frequency) 2.5 通道(Channels) 2.6 比特率(Bit rate) 2.7 可变比特率(VBR) 三、…

使用express创建服务器保存数据到mysql

创建数据库和表结构 CREATE DATABASE collect;USE collect;CREATE TABLE info (id int(11) NOT NULL AUTO_INCREMENT,create_date bigint(20) DEFAULT NULL COMMENT 时间,type varchar(20) DEFAULT NULL COMMENT 数据分类,text_value text COMMENT 内容,PRIMARY KEY (id) ) EN…

使用Galaxy创建生物信息学工作流的步骤详解

李升伟 整理 Galaxy 是一个基于 Web 的生物信息学平台&#xff0c;提供了直观的用户界面和丰富的工具&#xff0c;帮助用户创建和管理生物信息学工作流。以下是使用 Galaxy 创建生物信息学工作流的主要步骤&#xff1a; 1. 访问 Galaxy 平台 打开 Galaxy 的官方网站&#xff…

react中的fiber和初次渲染

源码中定义了不同类型节点的枚举值 组件类型 文本节点HTML标签节点函数组件类组件等等 src/react/packages/react-reconciler/src/ReactWorkTags.js export const FunctionComponent 0; export const ClassComponent 1; export const IndeterminateComponent 2; // Befo…

关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题

如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入&#xff1a; <meta charset"UTF-8"> 以jsp为例子&#xff0c;我们…

谐振开关型零电流开关变换器原理及仿真

以Buck DC/DC变换器为例&#xff0c;介绍零电流关断ZCS PWM变换器和零电流关断ZCS PFM变换器工作原理&#xff0c;及simulink仿真结果。 零电流关断脉冲宽度调制ZCS PWM变换器工作原理 下图是Buck DC/DC ZCS PWM变换器的主电路图&#xff0c;它由输入电源Vd、主开关管T1&…