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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...