經典掃雷游戲實現:從零構建HTML5掃雷游戲

一、引言

????????掃雷是一款經典的單人益智游戲,起源于20世紀60年代,并在90年代隨著Windows操作系統的普及而風靡全球。本文將詳細介紹如何使用現代網頁技術(HTML、CSS和JavaScript)從零開始構建一個功能完整的掃雷游戲。我們將涵蓋游戲邏輯設計、用戶界面實現以及性能優化等方面。


二、游戲概述

掃雷游戲的核心規則很簡單:

  1. 游戲在一個方格棋盤上進行,某些隨機方格中隱藏著"地雷"
  2. 玩家需要揭開所有不含地雷的方格
  3. 揭開方格后會顯示周圍8個方格中的地雷數量
  4. 玩家可以標記他們認為有地雷的方格
  5. 如果揭開一個地雷,游戲立即結束


三、技術實現

HTML結構

游戲的基本HTML結構包括:

  • 游戲標題和難度選擇按鈕
  • 游戲信息顯示區域(剩余地雷數、計時器、重置按鈕)
  • 游戲棋盤
  • 游戲狀態和統計信息顯示
<div class="game-container"><header><h1><i class="fas fa-bomb"></i> 經典掃雷</h1><div class="game-controls"><div class="difficulty-selector"><button class="active" data-level="easy">簡單</button><button data-level="medium">中等</button><button data-level="hard">困難</button></div><div class="game-info"><span class="flags"><i class="fas fa-flag"></i> <span id="flag-count">10</span></span><button id="reset-btn"><i class="fas fa-redo"></i></button><span class="timer"><i class="fas fa-clock"></i> <span id="time">0</span></span></div></div></header><div class="game-board" id="game-board"></div><div class="game-status"><div id="message"></div><div class="game-stats"><div>最佳時間: <span id="best-time">-</span>秒</div><div>當前勝率: <span id="win-rate">0%</span></div></div></div>
</div>

JavaScript游戲邏輯

游戲的核心邏輯包括:

  1. ?游戲初始化?
    • 創建棋盤數據結構
    • 隨機放置地雷
    • 計算每個方格周圍的地雷數量
function initGame() {// 初始化游戲狀態boardData = [];// 創建游戲板數據for (let i = 0; i < boardSize * boardSize; i++) {boardData.push({isMine: false,isRevealed: false,isFlagged: false,neighborMines: 0});}// 放置地雷let minesPlaced = 0;while (minesPlaced < mineCount) {const randomIndex = Math.floor(Math.random() * boardSize * boardSize);if (!boardData[randomIndex].isMine) {boardData[randomIndex].isMine = true;minesPlaced++;}}// 計算每個格子周圍的地雷數for (let i = 0; i < boardSize; i++) {for (let j = 0; j < boardSize; j++) {const index = i * boardSize + j;if (!boardData[index].isMine) {boardData[index].neighborMines = countAdjacentMines(i, j);}}}
}

  1. ?游戲交互處理?
    • 左鍵點擊揭開方格
    • 右鍵點擊標記/取消標記方格
    • 遞歸揭開空白區域
function handleCellClick(row, col) {if (gameOver) return;const index = row * boardSize + col;const cell = board.children[index];const cellData = boardData[index];if (cellData.isRevealed || cellData.isFlagged) return;if (cellData.isMine) {// 點到地雷,游戲結束gameOver = true;revealAllMines();messageElement.textContent = '游戲結束!';return;}revealCell(row, col);// 檢查是否獲勝if (revealedCount === boardSize * boardSize - mineCount) {gameOver = true;messageElement.textContent = '恭喜你贏了!';}
}
  1. ?游戲狀態管理?
    • 計時器
    • 勝負判斷
    • 游戲統計信息
function startTimer() {clearInterval(timerInterval);timerInterval = setInterval(() => {timer++;timerElement.textContent = timer;}, 1000);
}function updateStats() {bestTimeElement.textContent = bestTime === Infinity ? '-' : bestTime;winRateElement.textContent = gamesPlayed > 0 ? `${Math.round((gamesWon / gamesPlayed) * 100)}%` : '0%';
}

CSS樣式設計

游戲的視覺設計采用現代、簡潔的風格,使用CSS Grid布局實現響應式棋盤:

.game-board {display: grid;grid-template-columns: repeat(10, 1fr);gap: 3px;background: #bdc3c7;padding: 5px;border-radius: 5px;
}.cell {aspect-ratio: 1/1;display: flex;justify-content: center;align-items: center;background: #ecf0f1;border-radius: 3px;cursor: pointer;
}.cell.revealed {background: #d5dbdb;
}.cell.flagged {background: #f9e79f;
}.cell.mine {background: #e74c3c;color: white;
}

四、功能亮點

  1. ?多種難度級別?:提供簡單、中等和困難三種難度選擇
  2. ?游戲統計?:記錄最佳時間和勝率
  3. ?響應式設計?:適配不同屏幕尺寸
  4. ?本地存儲?:使用localStorage保存最佳成績
  5. ?視覺反饋?:不同的數字使用不同顏色,提高可讀性


五、技術細節解析

地雷生成算法

游戲使用Fisher-Yates洗牌算法的簡化版本來隨機放置地雷:

let minesPlaced = 0;
while (minesPlaced < mineCount) {const randomIndex = Math.floor(Math.random() * boardSize * boardSize);if (!boardData[randomIndex].isMine) {boardData[randomIndex].isMine = true;minesPlaced++;}
}

遞歸揭開空白區域

當玩家點擊一個周圍沒有地雷的方格時,游戲會自動遞歸揭開所有相鄰的空白方格:

function revealCell(row, col) {// ...if (cellData.neighborMines > 0) {cell.textContent = cellData.neighborMines;cell.style.color = getNumberColor(cellData.neighborMines);} else {// 遞歸揭示周圍的格子for (let i = Math.max(0, row - 1); i <= Math.min(boardSize - 1, row + 1); i++) {for (let j = Math.max(0, col - 1); j <= Math.min(boardSize - 1, col + 1); j++) {if (i === row && j === col) continue;revealCell(i, j);}}}
}

數字顏色編碼

為了提升游戲體驗,不同數字使用不同顏色表示:

function getNumberColor(num) {const colors = ['',       // 0'#1976D2', // 1'#388E3C', // 2'#D32F2F', // 3'#7B1FA2', // 4'#FF8F00', // 5'#0097A7', // 6'#5D4037', // 7'#616161'  // 8];return colors[num];
}

六、性能優化

  1. ?事件委托?:使用事件委托減少事件監聽器數量
  2. ?CSS硬件加速?:使用transform屬性實現平滑動畫
  3. ?最小化重繪?:只在必要時更新DOM
  4. ?內存管理?:合理使用數據結構減少內存占用

七、擴展功能建議

  1. 添加音效和動畫效果
  2. 實現多人對戰模式
  3. 添加成就系統
  4. 支持自定義棋盤大小和地雷數量
  5. 添加教程和新手引導

八、總結

通過本文的介紹,我們完整實現了一個功能豐富的掃雷游戲。這個項目涵蓋了現代Web開發的多個重要方面,包括:

  • DOM操作和事件處理
  • 游戲狀態管理
  • 遞歸算法應用
  • 響應式設計
  • 本地存儲使用

這個掃雷游戲不僅具有娛樂性,同時也是學習JavaScript和前端開發的優秀示例項目。讀者可以在此基礎上進一步擴展功能,或者優化現有實現。

完整代碼:

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>經典掃雷</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head><body><div class="game-container"><header><h1><i class="fas fa-bomb"></i> 經典掃雷</h1><div class="game-controls"><div class="difficulty-selector"><button class="active" data-level="easy">簡單</button><button data-level="medium">中等</button><button data-level="hard">困難</button></div><div class="game-info"><span class="flags"><i class="fas fa-flag"></i> <span id="flag-count">10</span></span><button id="reset-btn"><i class="fas fa-redo"></i></button><span class="timer"><i class="fas fa-clock"></i> <span id="time">0</span></span></div></div></header><div class="game-board" id="game-board"></div><div class="game-status"><div id="message"></div><div class="game-stats"><div>最佳時間: <span id="best-time">-</span>秒</div><div>當前勝率: <span id="win-rate">0%</span></div></div></div></div><script>document.addEventListener('DOMContentLoaded', () => {const board = document.getElementById('game-board');const flagCountElement = document.getElementById('flag-count');const timerElement = document.getElementById('time');const messageElement = document.getElementById('message');const resetButton = document.getElementById('reset-btn');const difficultyButtons = document.querySelectorAll('.difficulty-selector button');const bestTimeElement = document.getElementById('best-time');const winRateElement = document.getElementById('win-rate');let boardSize = 10;let mineCount = 10;let boardData = [];let revealedCount = 0;let flagCount = 0;let gameOver = false;let timer = 0;let timerInterval = null;let gamesPlayed = 0;let gamesWon = 0;let bestTime = localStorage.getItem('minesweeperBestTime') || Infinity;// 初始化游戲function initGame() {clearInterval(timerInterval);timer = 0;timerElement.textContent = timer;revealedCount = 0;flagCount = 0;flagCountElement.textContent = mineCount;gameOver = false;messageElement.textContent = '';board.innerHTML = '';boardData = [];// 創建游戲板數據for (let i = 0; i < boardSize * boardSize; i++) {boardData.push({isMine: false,isRevealed: false,isFlagged: false,neighborMines: 0});}// 放置地雷let minesPlaced = 0;while (minesPlaced < mineCount) {const randomIndex = Math.floor(Math.random() * boardSize * boardSize);if (!boardData[randomIndex].isMine) {boardData[randomIndex].isMine = true;minesPlaced++;}}// 計算每個格子周圍的地雷數for (let i = 0; i < boardSize; i++) {for (let j = 0; j < boardSize; j++) {const index = i * boardSize + j;if (!boardData[index].isMine) {boardData[index].neighborMines = countAdjacentMines(i, j);}}}// 創建游戲板UIfor (let i = 0; i < boardSize; i++) {for (let j = 0; j < boardSize; j++) {const index = i * boardSize + j;const cell = document.createElement('div');cell.className = 'cell';cell.dataset.row = i;cell.dataset.col = j;cell.addEventListener('click', () => handleCellClick(i, j));cell.addEventListener('contextmenu', (e) => {e.preventDefault();handleRightClick(i, j);});board.appendChild(cell);}}// 調整游戲板大小board.style.gridTemplateColumns = `repeat(${boardSize}, 1fr)`;}// 計算相鄰地雷數function countAdjacentMines(row, col) {let count = 0;for (let i = Math.max(0, row - 1); i <= Math.min(boardSize - 1, row + 1); i++) {for (let j = Math.max(0, col - 1); j <= Math.min(boardSize - 1, col + 1); j++) {if (i === row && j === col) continue;const index = i * boardSize + j;if (boardData[index].isMine) count++;}}return count;}// 處理格子點擊function handleCellClick(row, col) {if (gameOver) return;const index = row * boardSize + col;const cell = board.children[index];const cellData = boardData[index];// 開始游戲時啟動計時器if (revealedCount === 0 && !cellData.isFlagged) {startTimer();}if (cellData.isRevealed || cellData.isFlagged) return;if (cellData.isMine) {// 點到地雷,游戲結束gameOver = true;revealAllMines();cell.classList.add('mine');messageElement.textContent = '游戲結束!';clearInterval(timerInterval);gamesPlayed++;updateStats();return;}revealCell(row, col);// 檢查是否獲勝if (revealedCount === boardSize * boardSize - mineCount) {gameOver = true;messageElement.textContent = '恭喜你贏了!';clearInterval(timerInterval);gamesWon++;if (timer < bestTime) {bestTime = timer;localStorage.setItem('minesweeperBestTime', bestTime);bestTimeElement.textContent = bestTime;}updateStats();}}// 處理右鍵點擊(插旗)function handleRightClick(row, col) {if (gameOver) return;const index = row * boardSize + col;const cell = board.children[index];const cellData = boardData[index];if (cellData.isRevealed) return;if (cellData.isFlagged) {// 取消旗子cellData.isFlagged = false;cell.classList.remove('flagged');flagCount--;} else {// 插旗cellData.isFlagged = true;cell.classList.add('flagged');flagCount++;}flagCountElement.textContent = mineCount - flagCount;}// 揭示格子function revealCell(row, col) {const index = row * boardSize + col;const cell = board.children[index];const cellData = boardData[index];if (cellData.isRevealed || cellData.isFlagged) return;cellData.isRevealed = true;cell.classList.add('revealed');revealedCount++;if (cellData.neighborMines > 0) {cell.textContent = cellData.neighborMines;cell.style.color = getNumberColor(cellData.neighborMines);} else {// 如果是空白格子,遞歸揭示周圍的格子for (let i = Math.max(0, row - 1); i <= Math.min(boardSize - 1, row + 1); i++) {for (let j = Math.max(0, col - 1); j <= Math.min(boardSize - 1, col + 1); j++) {if (i === row && j === col) continue;revealCell(i, j);}}}}// 獲取數字顏色function getNumberColor(num) {const colors = ['',       // 0'#1976D2', // 1'#388E3C', // 2'#D32F2F', // 3'#7B1FA2', // 4'#FF8F00', // 5'#0097A7', // 6'#5D4037', // 7'#616161'  // 8];return colors[num];}// 揭示所有地雷function revealAllMines() {for (let i = 0; i < boardSize; i++) {for (let j = 0; j < boardSize; j++) {const index = i * boardSize + j;if (boardData[index].isMine) {const cell = board.children[index];cell.classList.add('mine');cell.innerHTML = '<i class="fas fa-bomb"></i>';}}}}// 開始計時器function startTimer() {clearInterval(timerInterval);timerInterval = setInterval(() => {timer++;timerElement.textContent = timer;}, 1000);}// 更新統計信息function updateStats() {bestTimeElement.textContent = bestTime === Infinity ? '-' : bestTime;winRateElement.textContent = gamesPlayed > 0 ? `${Math.round((gamesWon / gamesPlayed) * 100)}%` : '0%';}// 設置難度級別function setDifficulty(level) {difficultyButtons.forEach(btn => btn.classList.remove('active'));event.target.classList.add('active');switch (level) {case 'easy':boardSize = 10;mineCount = 10;break;case 'medium':boardSize = 16;mineCount = 40;break;case 'hard':boardSize = 20;mineCount = 80;break;}initGame();}// 事件監聽resetButton.addEventListener('click', initGame);difficultyButtons.forEach(btn => {btn.addEventListener('click', () => setDifficulty(btn.dataset.level));});// 初始化游戲initGame();updateStats();});</script>
</body>
<style>body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);margin: 0;padding: 20px;min-height: 100vh;display: flex;justify-content: center;align-items: center;}.game-container {background: white;border-radius: 15px;box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);padding: 25px;width: 100%;max-width: 800px;}header h1 {color: #2c3e50;text-align: center;margin-bottom: 20px;}.game-controls {display: flex;justify-content: space-between;align-items: center;margin-bottom: 20px;flex-wrap: wrap;gap: 15px;}.difficulty-selector button {padding: 8px 15px;border: none;border-radius: 5px;background: #ecf0f1;cursor: pointer;transition: all 0.3s;}.difficulty-selector button.active {background: #3498db;color: white;}.game-info {display: flex;align-items: center;gap: 15px;}#reset-btn {background: #e74c3c;color: white;border: none;width: 40px;height: 40px;border-radius: 50%;cursor: pointer;transition: all 0.3s;}#reset-btn:hover {transform: rotate(360deg);}.flags,.timer {font-weight: bold;color: #2c3e50;}.game-board {display: grid;grid-template-columns: repeat(10, 1fr);gap: 3px;margin: 0 auto;background: #bdc3c7;padding: 5px;border-radius: 5px;}.cell {aspect-ratio: 1/1;display: flex;justify-content: center;align-items: center;background: #ecf0f1;border-radius: 3px;cursor: pointer;font-weight: bold;user-select: none;transition: all 0.2s;}.cell:hover {background: #d6eaf8;}.cell.revealed {background: #d5dbdb;}.cell.flagged {background: #f9e79f;}.cell.mine {background: #e74c3c;color: white;}.game-status {margin-top: 20px;text-align: center;}#message {font-size: 1.2em;font-weight: bold;min-height: 24px;margin-bottom: 10px;}.game-stats {display: flex;justify-content: center;gap: 20px;color: #7f8c8d;}@media (max-width: 600px) {.game-board {grid-template-columns: repeat(8, 1fr);}}
</style></html>

九、彩蛋

藏在星橋鵲語中的相思

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97635.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97635.shtml

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

相關文章

ccache編譯加速配置

ccache 介紹 ccache(“compiler cache”的縮寫)是一個編譯器緩存,該工具會高速緩存編譯生成的信息,并在編譯的特定部分使用高速緩存的信息, 比如頭文件,這樣就節省了通常使用 cpp 解析這些信息所需要的時間。 github :https://github.com/ccache/ccache home:https://c…

數據庫主鍵選擇策略分析

為什么不推薦使用數據庫自增主鍵&#xff1f;分庫分表問題&#xff1a;自增ID在分庫分表場景下會導致ID沖突需要額外機制(如步長設置)來保證全局唯一&#xff0c;增加系統復雜度安全性問題&#xff1a;自增ID容易暴露業務量(如訂單號連續)可能被惡意爬取數據分布式系統限制&…

線性代數理論——狀態空間的相關概念以及由系統的輸入輸出導出狀態空間描述

線性代數理論——狀態空間 狀態&#xff1a;動態系統的狀態就是指系統的過去、現在、將來的運動狀況&#xff0c;精確的說就是狀態需要一組必要而充分的數據來表明。 狀態變量&#xff1a;可以表達系統運動狀態的變量都是狀態變量。 狀態變量組&#xff1a;可以完全表征系統在時…

【GaussDB】排查應用高可用切換出現數據庫整體卡頓及報錯自治事務無法創建的問題

【GaussDB】排查應用高可用切換出現數據庫整體卡頓及報錯自治事務無法創建的問題 背景 某客戶在做應用程序的高可用切換測試&#xff0c;在應用程序中&#xff0c;收到了來自數據庫的報錯&#xff0c;不能創建自治事務 ERROR: autonomous transaction failed to create auton…

shell腳本第五階段---shell函數與正則表達式

學習目標掌握case語句的基本語法結構掌握函數的定義以及調用掌握常用的正則表達式元字符含義一、case語句case語句為多選擇語句。可以用case語句匹配一個值與一個模式&#xff0c;如果匹配成功&#xff0c;執行相匹配的命令。case var in 定義變量&#xff1b;var代表變量名…

164.在 Vue3 中使用 OpenLayers 加載 Esri 地圖(多種形式)

適配&#xff1a;Vue 3 Vite TypeScript&#xff08;也兼容 JS&#xff09; 地圖引擎&#xff1a;OpenLayers v10 目標&#xff1a;一次性學會 多種 Esri 底圖加載方式、注記疊加、動態切換、令牌&#xff08;Token&#xff09;鑒權、常見坑位排查。一、效果預覽二、為什么選…

深入了解Flink核心:Slot資源管理機制

TaskExecutor、Task 和 Slot 簡單來說&#xff0c;它們的關系可以比作&#xff1a;TaskExecutor&#xff1a;一個工廠&#xff0c;擁有固定的生產資源。TaskSlot&#xff1a;工廠里的一個工位。每個工位都預先分配了一份獨立的資源&#xff08;主要是內存&#xff09;。Task&am…

java web 練習demo。生成簡單驗證碼前端是jsp

目錄結構 demo\ ├── WEB-INF\ │ └── weblogic.xml # WebLogic服務器配置文件 ├── demo.iml # IntelliJ IDEA項目配置文件 ├── lib\ # Java EE核心依賴庫 │ ├── javax.annotation.jar │ ├── javax.ejb.jar │ ├── javax.…

擁抱智能高效翻譯 ——8 款視頻翻譯工具深度測評

前陣子幫知識博主做跨境視頻翻譯&#xff0c;踩了不少坑&#xff1a;把 “內卷” 直譯成 “involution” 讓海外觀眾困惑&#xff0c;多語種版本趕工 3 天只出 2 種&#xff0c;還得手動核對 “碳中和”“非遺” 這類特色詞的譯法&#xff1b;用傳統工具譯完&#xff0c;視頻要…

[知識點記錄]SQLite 數據庫和MySQL 數據庫有什么區別?

核心區別&#xff1a;一個“內嵌”&#xff0c;一個“獨立”SQLite (你的個人筆記本)本質&#xff1a; 它是“無服務器”的&#xff0c;或者叫“內嵌式”數據庫。它不需要一個獨立的程序一直在后臺運行。你的應用程序&#xff08;比如Strapi&#xff09;直接就能讀寫它的數據庫…

【Spark Core】(二)RDD編程入門

目錄1 程序入口&#xff1a;SparkContext對象2 RDD的創建2.1 本地創建2.2 讀取文件創建3 RDD算子4 常用Transform算子4.1 map算子4.2 flatMap算子4.3 reduceBykey算子4.4 mapValues算子<實例> WordCount4.5 groupBy算子4.6 filter算子4.7 distinct算子4.8 union算子4.9 j…

java IDEA run/Debug異常:“jdk1.8injava.exe“ CreateProcess error=206, 文件名或擴展名太長

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#,Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發…

Java 函數編程之【過濾器filter()合并】【predicate(斷言)】與【謂詞邏輯】

Java函數式編程之【過濾器filter合并】【predicate&#xff08;斷言&#xff09;】與【謂詞邏輯】一、合并多個過濾器filter &#xff08;Lambda版本&#xff09;二、合并多個過濾器filter &#xff08;謂詞邏輯&#xff08;Predicate&#xff09;版本&#xff09;&#xff08;…

CentOS10安裝RabbitMQ

1.下載資源 &#xff08;1&#xff09;下載erlang-rpm 注意&#xff1a;按照圖片中的下載&#xff0c;用綠色三角形指向的是重點關注的。 網址&#xff1a; erlang-rpmhttps://github.com/rabbitmq/erlang-rpm/releases &#xff08;2&#xff09;下載rabbitmq-server 注…

JVM——八股文

1. JDK, JRE和JVM的關系JDK JRE Java開發工具JRE JVM Java核心類庫JDK供Java程序開發人員開發軟件&#xff0c;JRE供客戶使用&#xff0c;只需要JVM運行環境即可。JVM運行的是class字節碼&#xff0c;不僅能運行Java代碼&#xff0c;還能運行其他語言&#xff0c;只要語言能…

騎行把帶定期換,維樂 Skin Wrap 把帶煥新騎行

在公路騎行的裝備體系里&#xff0c;把帶是最易被忽視卻至關重要的“消耗品”。它是騎手手部與車身的直接連接&#xff0c;每一次轉向、變速、剎車&#xff0c;都需通過把帶傳遞力量與操控意圖&#xff1b;同時&#xff0c;它還承擔著吸汗、減震、保護車把的作用。可長期使用后…

LeetCode100-73矩陣置零

本文基于各個大佬的文章 上點關注下點贊&#xff0c;明天一定更燦爛&#xff01; 前言 Python基礎好像會了又好像沒會&#xff0c;所有我直接開始刷leetcode一邊抄樣例代碼一邊學習吧。本系列文章用來記錄學習中的思考&#xff0c;寫給自己看的&#xff0c;也歡迎大家在評論區指…

寧波市第八屆網絡安全大賽 -- Crypto -- WriteUp

寧波市第八屆網絡安全大賽 – Crypto – WriteUp Three-prime RSA task import gmpy2 from Crypto.Util.number import *from secret import flagp getPrime(512) q getPrime(512) r getPrime(512) n p * q * r random_num getPrime(28) D ((p q r) * random_num) % n …

大語言模型 (LLM) 與多模態大模型 (MLM)

文章目錄概述&#xff1a;從“模型”到“大”模型1、大語言模型 (Large Language Model, LLM)1.1 定義與概述關鍵特征&#xff1a;1.2 核心技術與架構Transformer架構自注意力機制 (Self-Attention)1.3 訓練過程1.4 工作原理2. 多模態大模型 (Multimodal Large Model, MLM)2.1 …

HTML應用指南:利用GET請求獲取全國招商銀行網點位置信息

招商銀行&#xff08;China Merchants Bank, CMB&#xff09;作為中國領先的股份制商業銀行&#xff0c;始終堅持“以客戶為中心”的服務理念&#xff0c;致力于為個人客戶、企業客戶及機構客戶提供專業、高效、便捷的綜合金融服務。依托“輕型銀行”戰略與“金融科技銀行”建設…