JS貪吃蛇小游戲

来源:https://www.cnblogs.com/TheGCC/archive/2018/04/22/8905872.html
-Advertisement-
Play Games

效果圖展示: 具體實現代碼如下: (1)html部分 (2)main.css文件代碼 註意:具體圖片可以自行改動 (3)game.js文件代碼 1 /* 全局變數 */ 2 3 var WIDTH = 24; 4 var HEIGHT = 24; 5 var len ;//蛇的長度 6 var sp ...


效果圖展示:

 

具體實現代碼如下:

(1)html部分

 1 !DOCTYPE html>
 2 <html>
 3     <head>
 4     <meta charset="utf-8" />
 5     <title>貪吃蛇</title>
 6     <link rel="stylesheet" type="text/css" href="main.css">
 7     </head>
 8     <body onselectstart="return false">
 9         <h1 id="alerts">貪吃蛇</h1>
10          <div id="help">
11             <span style="float:left">當前得分:<strong id="nowscore">0</strong></span>
12             <span style="float:right">最高分:<strong id="score">0</strong></span>
13          </div>
14         <div id="map"></div>     
15         <input type="button" id="btnStart" value="開始游戲" />
16         <script type="text/javascript" src="gamejs.js"></script>
17     </body>
18 </html>

(2)main.css文件代碼

 1 * {margin:0; padding:0}
 2 body {
 3   background:white;
 4   -moz-user-select:none;
 5   text-align:center; 
 6   font-size:12px;
 7   }
 8 
 9 table{
10   margin:30px auto 10px auto;
11   overflow:hidden;
12   box-shadow:0px 0px 30px #4EFE93;
13   border:10px solid yellowgreen;
14   border-image: url(border.png);
15   border-image-slice:10;
16   border-image-width:10px;
17   border-image-outset:0;
18   border-image-repeat:repeat;
19   }
20 td {
21   width:20px; 
22   height:20px;
23   border:1px solid white;
24   background:white;
25   }
26 .cover {background:url(body1.png);}
27 .food {
28     background:url(food.png);
29     background-repeat:no-repeat;    
30      }
31 
32 
33 #nowscore{
34   font-size:20px;
35   font-weight: 800;
36   color:blue;
37 }
38 #score{
39   font-size:20px;
40   font-weight: 800;
41   color:red;
42 }
43 #alerts{
44   margin-top:50px;
45   color:brown;
46   font-size:30px;
47   font-weight: 800;
48   }
49 #help {
50   width:420px;
51   margin:0 auto;
52   line-height:17px;
53   color:green;
54   }
55 #help span {
56   float:left;
57   font-size:15px;
58   font-weight: 800;
59   margin-right:10px}
60 #help .box {
61   width:15px;
62   height:15px;
63   margin-right:5px;
64   border:1px solid white;}
65 #btnStart {
66   clear:both; 
67   width:100px;
68   height:30px;
69   margin-top:10px;
70   padding:0; 
71   background:#4EFE93;
72   color:green; 
73   border:1px solid #fff; 
74   border-bottom-color:#000;
75   border-right-color:#000;
76   border-radius:15px;
77   cursor:pointer}

註意:具體圖片可以自行改動

(3)game.js文件代碼

  1 /* 全局變數      */
  2 
  3 var WIDTH = 24; 
  4 var    HEIGHT = 24; 
  5 var len ;//蛇的長度
  6 var    speed; //爬行速度
  7 var    gridElems = multiArray(WIDTH,HEIGHT); //地圖坐標,table對應的數組
  8 var    carrier; //蛇標誌二維數組
  9 var    snake; //蛇每節的坐標點
 10 var    btnStart; 
 11 var    snakeTimer;//蛇行走計時器
 12 var    directkey; // 鍵盤按鍵類型
 13 
 14 /*  其中gridElems和snake,carrier三個數組是完成表格和數組映射的關鍵   */
 15 
 16 window.onload = function(){
 17     //info = document.getElementById("alerts");
 18     btnStart = document.getElementById("btnStart");
 19     initGrid(); 
 20     document.onkeydown = attachEvents; //鍵盤事件獲取,跨瀏覽器事件處理
 21     btnStart.onclick = function (e) {
 22         start(); 
 23         btnStart.setAttribute("disabled",true);
 24         btnStart.style.color = "gray";
 25     }
 26 }
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 //開始游戲
 39 function start() {
 40     len = 3;
 41     speed = 10;
 42     directkey = 39;
 43     carrier = multiArray(WIDTH,HEIGHT);
 44     snake = new Array();
 45     clear();
 46     initSnake(); //蛇初始化
 47     addObject("food");
 48     walk();
 49     
 50 }
 51 
 52 
 53 //創建地圖,DOM節點創建增加
 54 function initGrid() {
 55     var body = document.getElementsByTagName("body")[0];
 56     var table = document.createElement("table");
 57     var    tbody = document.createElement("tbody");
 58     for(var j = 0; j < HEIGHT; j++) {  
 59         var col = document.createElement("tr");  
 60         for(var i = 0; i < WIDTH; i++) {  
 61             var row = document.createElement("td");
 62             gridElems[i][j] = col.appendChild(row); //完成表格和二維數組的映射 
 63         }
 64         tbody.appendChild(col);  
 65     }
 66     table.appendChild(tbody);
 67     document.getElementById("map").appendChild(table);//向div中添加創建好的表格
 68 }
 69 
 70 
 71 //一開始創建蛇
 72 function initSnake() {
 73     var pointer = randomPointer(len-1, len-1, WIDTH/2);
 74     for(var i = 0; i < len; i++) {
 75         var x = pointer[0] - i;//產生三個相連的表格
 76         var    y = pointer[1];
 77         snake.push([x,y]);//採用數組壓棧方法(js數組自帶方法)將產生的蛇坐標壓入坐標數組中
 78         carrier[x][y] = "cover";
 79     }
 80 }
 81 
 82 
 83 //添加鍵盤事件,防止瀏覽器不相容
 84 function attachEvents(e) {
 85     e = e || event;
 86     directkey = Math.abs(e.keyCode - directkey) != 2 && e.keyCode > 36 && e.keyCode < 41 ? e.keyCode : directkey; //非方向鍵、反向無效
 87     return false;
 88 }
 89 
 90 //設置間隔計時器,使蛇運動
 91 function walk() {
 92     if(snakeTimer) window.clearInterval(snakeTimer);
 93     snakeTimer = window.setInterval(step, Math.floor(3000/speed));//3000/speed呈現速度效果
 94 }
 95 
 96 //核心部分
 97 function step() {
 98     //獲取目標點
 99     var headX = snake[0][0];//從坐標數組中獲取蛇頭坐標
100     var    headY = snake[0][1];
101     switch(directkey) { //進行按鍵位判斷,蛇轉向
102         case 37: headX -= 1; break;
103         case 38: headY -= 1; break;
104         case 39: headX += 1; break
105         case 40: headY += 1; break;
106     }
107     //死亡檢測
108     if(headX >= WIDTH || headX < 0 || headY >= HEIGHT || headY < 0  || carrier[headX][headY] == "cover" ) {
109         alert("辣雞高城,你掛了!");
110         if((document.getElementById("score").innerHTML)*1 < len) 
111             {document.getElementById("score").innerHTML=len;}//最高分信息
112         btnStart.removeAttribute("disabled");//釋放“開始游戲”按鈕
113         btnStart.style.color = "#000";//釋放“開始游戲”按鈕
114         window.clearInterval(snakeTimer);//清屏
115         return;
116     }
117     //加速,吃到食物後提速
118     if(len % 4 == 0 && speed < 60 && carrier[headX][headY] == "food") {
119         speed += 5;
120         walk();    
121     }    
122     if(carrier[headX][headY] != "food") {
123         var lastX = snake[snake.length-1][0];//提取蛇的尾部坐標
124         var    lastY = snake[snake.length-1][1];//提取蛇的尾部坐標
125         carrier[lastX][lastY] = false;//蛇尾移動
126         gridElems[lastX][lastY].className = "";//制空單元格背景色
127         snake.pop();//刪除蛇尾坐標
128     } 
129     else {
130         carrier[headX][headY] = false;//記錄蛇頭和食物重疊,碰撞處,碰撞後:蛇尾不減,false標誌重疊
131         
132         addObject("food");//添加新的食物;
133     }
134     snake.unshift([headX,headY]);//將食物作為新的蛇頭坐標壓入蛇坐標數組,unshift函數為頭壓入數據,snake長度增加1
135     carrier[headX][headY] = "cover";//cover代表為蛇身,此時將標誌false改為正常caver
136     gridElems[headX][headY].className = "cover";//給移動後的蛇身修改相應的表格單元格顏色
137     len = snake.length;
138     document.getElementById('nowscore').innerHTML = len;
139 }
140 
141 //添加物品
142 function addObject(name) {
143     var p = randomPointer();
144     carrier[p[0]][p[1]] = name;
145     gridElems[p[0]][p[1]].className = name;//封裝投放食物函數
146 }
147 
148 //產生指定範圍隨機點,食物和蛇的初始值產生
149 function randomPointer(startX,startY,endX,endY) {
150     startX = startX || 0;
151     startY = startY || 0;
152     endX = endX || WIDTH;
153     endY = endY || HEIGHT;
154     var p = [];
155     var    x = Math.floor(Math.random()*(endX - startX)) + startX;//控制產生數據在WIDTH即表格橫向範圍內
156     var    y = Math.floor(Math.random()*(endY - startY)) + startY;//控制產生數據在HEIGHT即表格縱向範圍內
157     if(carrier[x][y]) //如果產生數據和蛇身重覆了,則遞歸再次產生
158     {return randomPointer(startX,startY,endX,endY);}
159     p[0] = x;
160     p[1] = y;
161     return p;//返回一個一維數組,僅兩個數(坐標),傳至坐標數組
162 }
163 
164 //產生隨機整數
165 function randowNum(start,end) {
166     return Math.floor(Math.random()*(end - start)) + start;
167 }
168 
169 //創建二維數組
170 function multiArray(m,n) {
171     var arr =  new Array(n);
172     for(var i=0; i<m; i++) 
173         arr[i] = new Array(m);//數組套數組
174     return arr;
175 }
176 
177 //清除畫面,游戲開始時和死亡後刷新使用
178 function clear() {
179     for(var y = 0; y < gridElems.length; y++) {
180         for(var x = 0; x < gridElems[y].length; x++) {
181             gridElems[x][y].className = "";
182         }
183     }
184 }
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文摘自:https://www.cnblogs.com/moqiutao/archive/2015/12/23/5070463.html 總節: 1) 定義字體標準格式: 2)字體轉換網址: http://www.freefontconverter.com/https://everythingfo ...
  • 最近因為工作關係,一直在做node.js的開發,學習了koa框架,orm框架sequelize,以及swagger文檔的配置。但是,最近因為swagger文檔使用了es6的修飾器那麼個東西(在java中被稱作註解),所以,node.js無法編譯項目,所以就需要使用babel對es6進行轉換。因為這篇 ...
  • <!DOCTYPE html><html xmlns="http://www.w3.org/1999/html"><head lang="en"> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="../css/r ...
  • var聲明變數的作用域限制在其聲明位置的上下文中 let 聲明的變數只在其聲明的塊或子塊中可用,var的作用域是整個封閉函數 在 ECMAScript 2015 中,let綁定不受變數提升的約束,這意味著let聲明不會被提升到當前執行上下文的頂部。 在塊中的變數初始化之前,引用它將會導致 Refer ...
  • 正則的一些基礎知識 創建正則 通過構造函數 const pattern = new RegExp(pattern,modifiers) pattern: 匹配的字元串形式,可以有變數 modifiers: 匹配的模式,g(全局),i(忽略大小寫),u(多行) 字面量的形式: const patter ...
  • 最近在學習react,然後遇到react中css該怎麼寫這個問題,上知乎上看了好多大牛都說styled-components好用是大勢所趨。 但我自己用了感覺體驗卻很差,我在這裡說說我為啥覺得styled-components不好用。 1.既然用了styled-components,那除了引用全局的 ...
  • HTML內容元素中圖片元素 使用img元素:src屬性:圖片路徑。 alt屬性:圖片無法顯示的時候使用替代文本,title屬性:滑鼠懸停時顯示文本內容。 在同一張圖片上點擊不同的位置鏈接到不同的頁面上 使用map,和area元素(map是area的父元素) 加上id或者name是為瞭解決相容性。 s ...
  • 路由的作用是分隔應用為不同的區塊,每個區塊基於匹配當前URL的規則。 路由可以分為服務端與客戶端兩種,服務端以Express.js為例: 服務端接收請求並路由至一個控制器(controller),控制器執行指定的操作(action)。 客戶端的路由在概念上與服務端相似,其好處是不需要每次URL地址變 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...