從零開始用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.pswp.cn/news/897156.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897156.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897156.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode1328

非常抱歉&#xff0c;我理解錯了你的要求&#xff01;現在我會嚴格按照你的要求重新組織內容&#xff0c;確保在代碼段中不加入注釋&#xff0c;并在代碼逐行講解中加入代碼段。 LeetCode1328 目錄 題目描述示例思路分析代碼段代碼逐行講解復雜度分析總結的知識點整合總結 題…

STM32點亮LED燈

1.1 介紹&#xff1a; LED模塊。它的控制方法非常簡單&#xff0c;要想點亮LED&#xff0c;只要讓它兩端有一定的電壓就可以&#xff1b;實驗中&#xff0c;我們通過編程控制信號端S的高低電平&#xff0c;從而控制LED的亮滅。我們提供一個測試代碼控制LED模塊上實現閃爍的效果…

【華三】STP端口角色與狀態深度解析

STP端口角色與狀態深度解析&#xff1a;構建無環網絡的基石 引言一、STP基礎回顧二、端口角色詳解1. 根端口&#xff08;Root Port&#xff09;2. 指定端口&#xff08;Designated Port&#xff09;3. 非指定端口&#xff08;阻塞端口&#xff09; 三、端口狀態轉換流程四、角色…

計算機畢業設計Python+Django+Vue3微博數據輿情分析平臺 微博用戶畫像系統 微博輿情可視化(源碼+ 文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

稚暉君級硬核:智元公司開源機器人通信框架AimRT入駐GitCode平臺

在科技的浪潮中&#xff0c;機器人技術正以前所未有的速度發展。它們不再只是科幻小說中的概念&#xff0c;而是逐漸融入到我們的日常生活中&#xff0c;從工廠的自動化生產線到家庭的智能助手&#xff0c;機器人的身影無處不在。然而&#xff0c;隨著機器人應用的日益復雜&…

[項目]基于FreeRTOS的STM32四軸飛行器: 四.LED控制

基于FreeRTOS的STM32四軸飛行器: 四.LED控制 一.配置Com層二.編寫驅動 一.配置Com層 先在Com_Config.h中定義燈位置的枚舉類型&#xff1a; 之后定義Led的結構體&#xff1a; 定義飛行器狀態&#xff1a; 在Com_Config.c中初始化四個燈&#xff1a; 在Com_Config.h外部聲明…

Ubuntu20.04雙系統安裝及軟件安裝(一):系統安裝

Ubuntu20.04雙系統安裝及軟件安裝&#xff08;一&#xff09;&#xff1a;系統安裝 Ubuntu系統卸載Ubuntu20.04安裝BIOS進入系統安裝 許久沒寫博客了&#xff0c;今天開始重新回歸了。首先記錄我在雙系統上重裝Ubuntu20.04的安裝過程記錄以及個人見解。 Ubuntu系統卸載 參考雙…

cursor+deepseek實現完整的俄羅斯方塊小游戲

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>俄羅斯方塊</title><style>body {margin: 0;display: flex;justify-content: center;align-items: center;height: 100vh;background: …

人工智能開發面經AI、大數據、算法

以下是一份AI算法開發崗位的面試面經&#xff0c;結合最新行業趨勢和經典問題&#xff0c;涵蓋技術解析與實戰案例&#xff0c;供參考&#xff1a; 一、機器學習基礎&#xff08;占比約30%&#xff09; 1. 過擬合與欠擬合的解決方案 問題&#xff1a;如何解決模型過擬合&…

【原創】Ollama Test API For Linux/MacOS/Unix

安裝Json解析工具 Linux/Unix sudo apt-get install jq -yMacOS brew install jq -y設置環境變量 export IP"192.168.250.229" export PORT"8080" export MODEL"deepseek-r1:7b"檢查Ollama版本 curl http://"$IP":"$PORT&qu…

【Git】基本指令

工作區、暫存區、版本庫 工作區&#xff1a;是在電腦上你要寫代碼或文件的目錄。暫存區&#xff1a;英文叫 stage 或 index。一般存放在 .git 目錄下的 index 文件&#xff08;.git/index&#xff09;中&#xff0c;我們把暫存區有時也叫作索引&#xff08;index&#xff09;。…

從數據到決策,永洪科技助力良信電器“智”領未來

在數字經濟浪潮洶涌的時代&#xff0c;數字化轉型已成為企業增強競爭力、實現可持續發展的必由之路。良信電器&#xff0c;作為國內知名的電氣設備制造企業&#xff0c;積極響應時代號召&#xff0c;攜手永洪科技&#xff0c;共同開啟了數字化轉型的新篇章。 上海良信電器股份有…

帶觸屏筆記本關閉屏幕觸控方法

以聯想yogaPro16s2023為例 該筆記本顯示器為觸控屏&#xff0c;不想使用屏幕觸控功能&#xff1b; 關閉方法如下&#xff1a; Win11與win10操作一樣 鼠標放到開始&#xff0c;右鍵&#xff0c;選擇&#xff0c;設備管理器 找到&#xff0c;人體學輸入設備&#xff0c;符合H…

大模型——基于 DIFY 的自動化數據分析實戰

基于 DIFY 的自動化數據分析實戰 簡介: 本文介紹如何使用DIFY搭建數據分析自動化流程,實現從輸入需求到查詢數據庫、LLM分析再到可視化輸出的全流程。基于經典的employees數據集和DIFY云端環境,通過LLM-SQL解析、SQL執行、LLM數據分析及ECharts可視化等模塊,高效完成數據分…

中原銀行:從“小機+傳統數據庫”升級為“OceanBase+通用服務器”,30 +系統成功上線|OceanBase DB大咖說(十五)

OceanBase《DB 大咖說》第 15 期&#xff0c;我們邀請到了中原銀行金融科技部數據團隊負責人&#xff0c;呂春雷。本文為本期大咖說的精選。 呂春雷是一位資歷深厚的數據庫專家&#xff0c;從傳統制造企業、IT企業、甲骨文公司到中原銀行&#xff0c;他在數據庫技術與運維管理…

django各種mixin用法

在 Django 中,Mixin 是一種用于擴展類功能的設計模式。通過 Mixin,可以在不修改原有類的情況下,為其添加新的方法或屬性。Django 中的 Mixin 廣泛應用于視圖(View)、表單(Form)、模型(Model)等組件中。以下是 Django 中常見 Mixin 的用法和示例: 一、視圖(View)中的…

SpringBoot集成Netty實現Ws和Tcp通信

本教程將指導你如何在 Spring Boot 項目中集成 Netty&#xff0c;實現 WebSocket 和 TCP 通信。以下是詳細的步驟和代碼示例。 環境準備 在 你的pom.xml 中添加 Netty 依賴&#xff1a; <dependency><groupId>io.netty</groupId><artifactId>nett…

與中國聯通技術共建:通過obdiag分析OceanBase DDL中的報錯場景

中國聯通軟件研究院&#xff08;簡稱聯通軟研院&#xff09;在全面評估與廣泛調研后&#xff0c;在 2021年底決定采用OceanBase 作為基礎&#xff0c;自研分布式數據庫產品CUDB&#xff08;即China Unicom Database&#xff0c;中國聯通數據庫&#xff09;。目前&#xff0c;該…

機器學習-隨機森林解析

目錄 一、.隨機森林的思想 二、隨機森林構建步驟 1.自助采樣 2.特征隨機選擇 3構建決策樹 4.集成預測 三. 隨機森林的關鍵優勢 ?**(1) 減少過擬合** ?**(2) 高效并行化** ?**(3) 特征重要性評估** ?**(4) 耐抗噪聲** 四. 隨機森林的優缺點 ?優點 ?缺點 五.…

深度集成DeepSeek,智問BI@GPT引領商業智能“深度思考“革命

當下傳統的數據分析工具如同顯微鏡&#xff0c;雖然能幫助我們看到數據的細節&#xff0c;卻難以揭示數據背后的深層規律。億信華辰最新升級的智問BIGPT產品&#xff0c;通過深度集成DeepSeek大模型&#xff0c;首次在商業智能領域實現了"深度思考"功能。這項突破性創…