html+css+js 實現一個貪吃蛇小游戲

目錄

游戲簡介

游戲功能與特點

如何玩轉貪吃蛇

游戲設計與實現

HTML結構

JavaScript核心實現

代碼結構:

效果

關于“其他游戲”


游戲簡介

貪吃蛇是一款經典的單人小游戲,玩家通過控制蛇的移動,吃掉食物來增加長度,避免撞到墻壁或自身,挑戰最高分數。本文將詳細介紹該貪吃蛇小游戲的功能、玩法以及代碼實現。

游戲功能與特點

  • 動態網格系統:根據選中的模式調整網格大小和游戲區域。
  • 可選模式:提供20x20、30x30、40x40、50x50四種網格模式,適應不同難度需求。
  • 難度調節:支持六檔難度,從0.5秒到0.05秒不等,速度快則難度高。
  • score計分系統:吃掉食物得10分,實時顯示當前得分。
  • 游戲重啟:游戲結束后顯示最終分數,玩家可重新開始挑戰。

如何玩轉貪吃蛇

  1. 游戲目標
    控制蛇向食物(紅方塊)移動,每次吃掉食物蛇會變長,得分增加,避免碰到邊界或自己。

  2. 基本操作

    • 方向控制:上下左右箭頭鍵或W、A、S、D鍵。
    • 開始游戲:點擊“開始游戲”按鈕啟動。
  3. 注意事項

    • 避免讓蛇頭撞到墻壁。
    • 確保蛇不與自身碰撞。

游戲設計與實現

HTML結構
<!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="css/greedy_snake.css">  
</head>  
<body>  <!-- 導航、游戲容器等DOM元素 -->  <script src="js/greedy_snake.js"></script>  
</body>  
</html>  
JavaScript核心實現
  1. 參數初始化

    let gridSize = 20; // 網格大小  
    let snake = []; // 蛇的身體數組  
    let food = {}; // 食物位置  
    let dx = 0; // 橫向移動單位  
    let dy = 0; // 縱向移動單位  
    let score = 0; // 當前分數  
    let gameSpeed = 1000; // 默認移動速度  
    let isGameRunning = false; // 游戲運行狀態  
  2. 主要函數

    initGame():初始化游戲參數、蛇的起始位置和食物。
    draw():繪制游戲界面,包括食物和蛇的各個段。
    update():更新蛇的位置,檢查是否吃到食物或發生碰撞。
    gameLoop():游戲主循環,控制繪制和更新的頻率。
    generateFood():隨機生成食物,確保不在蛇身上。
    isCollision():檢查蛇頭是否碰到邊界或自身。
  3. 事件監聽

document.addEventListener('keydown', (event) => {  // 根據鍵盤輸入調整蛇的方向  const key = event.key.toLowerCase();  switch (key) {  case 'arrowup':  case 'w':  if (dy !== 1) { dx = 0; dy = -1; }  break;  // 其他方向類似處理  }  
});  
代碼結構:

greedy_snake.html:

<!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="css/greedy_snake.css">  
</head>  
<body>  <nav class="navbar">  <ul>  <li><a href="/index.html">首頁</a></li>  <li><a href="/greedy_snake.html">貪吃蛇</a></li>  <li><a href="/other.html">其他游戲</a></li>  </ul>  </nav>  <div class="game-container">  <div class="settings">  <div class="select-mode">  <label for="mode">模式:</label>  <select id="mode">  <option value="20">20x20</option>  <option value="30" selected>30x30</option>  <option value="40">40x40</option>  <option value="50">50x50</option>  </select>  </div>  <div class="select-difficulty">  <label for="difficulty">難度:</label>  <select id="difficulty">  <!-- 默認為0.6秒/次 --><option value="1">1(0.5秒/次)</option>  <option value="2">2(0.4秒/次)</option>  <option value="3" selected>3(0.3秒/次)</option>  <option value="4">4(0.2秒/次)</option>  <option value="5">5(0.1秒/次)</option>  <option value="6">6(0.0.5秒/次)</option>  </select>  </div>  <button id="generate">開始游戲</button>  </div>  <div id="result" class="result"></div>  <canvas id="gameCanvas" class="game-canvas"></canvas>   </div>  <script src="js/greedy_snake.js"></script>  
</body>  
</html>  

greedy_sanke.js:

const canvas = document.getElementById('gameCanvas');  
const ctx = canvas.getContext('2d');  // 設置Canvas大小  
canvas.width = 800;  
canvas.height = 400;  // 游戲參數  
let gridSize = 20; // 網格大小  
let snake = []; // 蛇的身體數組  
let food = {}; // 食物位置  
let dx = 0; // 橫向移動單位  
let dy = 0; // 縱向移動單位  
let score = 0; // 當前分數  
let gameSpeed = 1000; // 默認移動速度
let isGameRunning = false; // 游戲運行狀態  // 初始化游戲  
function initGame() {  
}  // 初始化蛇的位置  
function initSnake() {  
}  // 生成食物  
function generateFood() { 
}  // 繪制游戲界面  
function draw() {  
}  // 更新蛇的位置  
function update() {  
}  // 檢查碰撞  
function isCollision() {  
}  // 游戲主循環  
function gameLoop() { 
}  // 開始游戲  
function startGame() {  
}  // 游戲結束  
function gameOver() {  
}  // 監聽鍵盤事件  
document.addEventListener('keydown', (event) => {  
});  // 初始化游戲  
initGame();  
draw();  // 監聽開始按鈕點擊事件  
document.getElementById('generate').addEventListener('click', startGame);  

greedy_snake.css:

body {font-family: Arial, sans-serif;background-color: #f2f2f2;margin: 0;padding: 0;
}.navbar {background-color: #4CAF50; /* 導航欄背景色 */overflow: hidden;
}.navbar ul {list-style-type: none; /* 去掉默認的列表樣式 */padding: 0;margin: 0;display: flex; /* 使用 Flexbox 布局 */justify-content: center; /* 居中對齊 */
}.navbar li {float: left;
}.navbar li a {display: block;color: white; /* 鏈接顏色 */text-align: center;    padding: 14px 20px; /* 內邊距 */text-decoration: none; /* 去掉下劃線 */
}.navbar li a:hover {background-color: #3e8e41; /* 懸停效果 */
}.game-container {max-width: 80%;max-height: 80%;margin: 20px auto;text-align: center;overflow: auto;background-color: #fff; /* 游戲容器背景色 */border-radius: 10px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);padding: 20px; /* 內邊距 */
}.game-canvas {  max-width: 80%;  height: 600px;max-height: 80%;  border: 2px solid #333;  background-color: #fff;  
} .settings {margin: 20px;
}.select-mode, .select-difficulty {margin: 10px 0;
}.select-mode, .select-difficulty {  margin-bottom: 10px;  padding: 5px;  display: inline-block;  
}  .select-mode label, .select-difficulty label {  display: inline-block;  width: 50px;  
}  select {  padding: 5px;  border: 1px solid #ccc;  border-radius: 4px;  
}  button {  padding: 8px 16px;  background-color: #4CAF50;  color: white;  border: none;  border-radius: 4px;  cursor: pointer;  
}  button:hover {  background-color: #45a049;  
}  /* 自定義滾動條樣式 */
::-webkit-scrollbar {width: 8px;height: 8px;
}::-webkit-scrollbar-track {background: #f1f1f1;
}::-webkit-scrollbar-thumb {background: #888;border-radius: 4px;
}::-webkit-scrollbar-thumb:hover {background: #555;
}

效果

關于“其他游戲”

通過iframe展示的3個鏈接的小游戲,點擊選中的小游戲,游戲區域會自動展示該游戲界面.

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

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

相關文章

GLSL(OpenGL 著色器語言)基礎語法

GLSL&#xff08;OpenGL 著色器語言&#xff09;基礎語法 GLSL&#xff08;OpenGL Shading Language&#xff09;是 OpenGL 計算著色器的語言&#xff0c;語法類似于 C 語言&#xff0c;但提供了針對 GPU 的特殊功能&#xff0c;如向量運算和矩陣運算。 著色器的開頭總是要聲明…

ngx_http_core_merge_srv_conf

定義在 src\http\ngx_http_core_module.c static char * ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) {ngx_http_core_srv_conf_t *prev parent;ngx_http_core_srv_conf_t *conf child;ngx_str_t name;ngx_http_server_name_t…

uni-app:firstUI框架的選擇器Select改造,添加一個搜索的插槽

<fui-select :show"showSiteType" :options"siteTypeList" textKey"dict_label" title"請選擇站點類型" confirm"chooseSiteType" close"onCloseSiteType"><template v-slot:search><view><…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件,如何配置route路由

Debian/Ubuntu的networking的/etc/network/interfaces配置文件,如何配置route路由 在 Debian/Ubuntu 系統中&#xff0c;通過 /etc/network/interfaces 配置文件配置路由&#xff08;靜態路由或默認路由&#xff09;可以通過以下方式實現。以下是詳細配置方法及示例&#xff1…

天梯賽 L2-024 部落

一個并查集題目&#xff0c;難點就在于統計總人數&#xff0c;使用map即可&#xff0c;還有需要注意的是編號不一定是小于N的&#xff0c;小于10000的&#xff0c;需要注意。 #include<bits/stdc.h> using namespace std; const int N 10010; int fa[N]; int find(int …

uniapp 微信小程序 使用ucharts

文章目錄 前言一、組件功能概述二、代碼結構分析2.1 模板結構 總結 前言 本文介紹一個基于 Vue 框架的小程序圖表組件開發方案。該組件通過 uCharts 庫實現折線圖的繪制&#xff0c;并支持滾動、縮放、觸摸提示等交互功能。文章將從代碼結構、核心方法、交互實現和樣式設計等方…

Axure項目實戰:智慧運輸平臺后臺管理端-承運商管理(中繼器篩選)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! 課程主題:智慧運輸平臺后臺管理端 主要內容:承運商管理 應用場景:條件篩選、增刪改查操作、臺賬制作 案例展示: 正文內容: 承運商管理模塊主要解決平臺對承運商的管理,包括新增承運商作,審核承運商申請,修…

[論文筆記] Deepseek技術報告解讀: MLAMTP

1. RMSNorm 歸一化層 class RMSNorm(nn.Module):def __init__(self, dim: int, eps: float = 1e-8):super().__init__()self.eps = epsself.weight = nn.Parameter(torch.ones(dim)) # 可學習的縮放參數def _norm(self, x: torch.Tensor):return x * torch.rsqrt(x.pow(2).me…

八款內網電腦監控軟件:探尋適配企業需求的數字化監管方案組合

數字化辦公的時代背景下&#xff0c;企業管理面臨著前所未有的挑戰。如何實現對員工辦公行為的高效管理&#xff0c;確保網絡資源的合理利用&#xff0c;成為眾多企業決策者和高級管理人員亟待解決的重要問題。內網電腦監控軟件作為一種有效的管理工具&#xff0c;應運而生。本…

Flutter求助貼

報錯信息&#xff1a;The Dart VM Service was not discovered after 30 seconds. This is taking much longer than expected... 基本情況&#xff1a; 硬件&#xff1a;mac(15.3.1)&#xff0c;iPad(iOS 16.6),iPhone 16 pro(iOS 18.4) 項目環境 flutter&#xff1a;3.16…

React(九)React Hooks

初識Hook 我們到底為什么需要hook那? 函數組件類組件存在問題 函數組件存在的問題&#xff1a; import React, { PureComponent } from reactfunction HelloWorld2(props) {let message"Hello world"// 函數式組件存在的缺陷&#xff1a;// 1.修改message之后&a…

數據清洗的具體內容

&#xff08;一&#xff09;ETL介紹 “ETL&#xff0c;是英文Extract-Transform-Load的縮寫&#xff0c;用來描述將數據從來源端經過抽取&#xff08;Extract&#xff09;、轉換&#xff08;Transform&#xff09;、加載&#xff08;Load&#xff09;至目的端的過程。ETL一詞較…

【動手學深度學習】#7 現代卷積神經網絡

主要參考學習資料&#xff1a; 《動手學深度學習》阿斯頓張 等 著 【動手學深度學習 PyTorch版】嗶哩嗶哩跟李牧學AI 概述 硬件性能和大數據的發展為深度卷積神經網絡&#xff08;AlexNet&#xff09;的實現提供了條件。VGG首次將塊的思想用于搭建網絡。NiN將多層感知機應用在…

Jenkins + CICD流程一鍵自動部署Vue前端項目(保姆級)

git倉庫地址&#xff1a;參考以下代碼完成,或者采用自己的代碼。 南澤/cicd-test 拉取項目代碼到本地 使用云服務器或虛擬機采用docker部署jenkins 安裝docker過程省略 采用docker部署jenkins&#xff0c;注意這里的命令&#xff0c;一定要映射docker路徑&#xff0c;否則無…

使用 libevent 處理 TCP 粘包問題(基于 Content-Length 或雙 \r\n)

在基于 libevent 的 TCP 服務器開發中,處理消息邊界是常見需求。以下是兩種主流分包方案的完整實現: 一、基于 Content-Length 的分包方案 1.1 數據結構設計 typedef struct {struct bufferevent *bev;int content_length; // 當前消息的預期長度int received_bytes; //…

酶動力學預測工具CataPro安裝教程

簡介&#xff1a;預測酶動力學參數是酶發現和酶工程中的一項重要任務。在此&#xff0c;研究人員基于蛋白質語言模型、小分子語言模型和分子指紋&#xff0c;提出了一種名為 CataPro 的新酶動力學參數預測算法。該研究從 BRENDA 和 SABIO-RK 數據庫中收集了最新的轉化率&#x…

項目實戰:基于Spring WebFlux與LangChain4j實現大語言模型流式輸出

一、背景 在大語言模型&#xff08;LLM&#xff09;應用場景中&#xff0c;GPT-4等模型的響應生成往往需要數秒至數十秒的等待時間。傳統同步請求會導致用戶面對空白頁面等待&#xff0c;體驗較差。本文通過Spring WebFlux響應式編程與SSE服務器推送技術&#xff0c;實現類似打…

Go語言入門經典:數組與切片詳解

Go語言入門經典&#xff1a;數組與切片詳解 數組和切片是Go語言中兩種重要的數據結構。數組是一種固定長度的集合&#xff0c;而切片則是一種靈活的動態集合。本章將詳細講解數組和切片的定義、初始化、訪問元素、動態操作等內容&#xff0c;幫助讀者全面掌握這兩種數據結構。…

uniapp中如何用iconfont來管理圖標集成到我們開發的項目中

我們在開發不管小程序還是APP的過程中都會用到圖標這個東西,那么iconfont提供了對應的功能,怎么才能方便的集成到我們的小程序或者APP項目中,目標是方便調用并且方便管理。 首先注冊ICONFONT賬號 www.iconfont.cn中去注冊即可選擇我們需要的圖標如下 我們搜索我們需要的圖…

從實用的角度聊聊Linux下文本編輯器VIM

本文從實用的角度聊聊Vim的常用命令。何為實用&#xff1f;我舉個不實用的例子大家就明白了&#xff0c;用vim寫代碼。;) “vim是從 vi 發展出來的一個文本編輯器。代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富&#xff0c;在程序員中被廣泛使用&#xff0c;和Emacs并列成…