聽說剛學完JavaScript的你,找不到demo來練手?

聽說剛學完JavaScript的你,找不到demo來練手?

前言:

這是本蒟蒻這周的web作業,開始覺得選貪吃蛇可能會有點小難,但是自己看了看網站的一些視頻後,發現似乎還是挺有意思的,於是打算分享出來,希望對剛學完JavaScript基礎知識,正愁沒有demo來練手的小夥伴有些許幫助。

文件資源:

資源位置
因爲比較簡單,所以沒有設置c幣,只希望大佬留個贊再走唄;

demo的簡單介紹:

前言中也提了句,這是一個web版的低配版貪吃蛇單機小遊戲
(看到前面那麼多前綴,就知道,這真的只是一個demo,因爲實在是太低配了)
這是的蛇頭,食物、身體都是通過div實現,所以就比較簡單了。
這裏的JavaScript用的是jquery框架,因爲還是可以稍微少點代碼量(哈哈哈)

佈局:

效果圖:

既然選好目標後,我們首先當然是得確定佈局:
在這裏插入圖片描述
這是最終需要的效果圖。

具體實現:

那麼怎麼實現呢:
1.地圖:
身體,食物都要大小一致,我們還是比較容易想到用table標籤,但是table下面不能創建div,這是我們需要注意的。所以我們需要另外開一個div表示真正的地圖:這樣就可以在地圖開生成食物和蛇頭了。
但是我們會發現table標籤和真正表示地圖的div不能重合,於是我們可以用絕對定位,使其重合

2.得分顯示區域:
直接用一個div下面封裝一個span標籤即可,方便之後修改它的值

3.改變速度按鈕區域:
直接用四個buton標籤即可

4.遊戲說明區域:
一個p標籤即可

於是html文件和css文件就出來了:
這裏對於table的創建,就別一個個cv…
vscode下直接table>tr20>td40按回車即可,
其他操作可以看下面博客:
https://www.cnblogs.com/summit7ca/p/6944215.html

html文件:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>貪吃蛇</title>
    <link type="text/css" rel="stylesheet" href="index.css"/>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script src="index.js" type="text/javascript"></script>
</head>

<body>
    <!-- 地圖500*1000  每個單元格爲25*25 (20行,40列)-->
    <table>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
    </table>
    <!-- 真正的地圖 因爲table裏面不能加div-->
    <div id="map"></div>
    <div id="scoreDiv">
        Score:<span id="score">0</span>
    </div>
    <div id="buttonGroup">
        <button id="quickBtn"></button>
        <button id="midBtn"></button>
        <button id="slowBtn"></button>
        <button id="restart">重新開始</button>
    </div>
    <p>
        遊戲說明:<br>
        紅色方塊表示:蛇頭,藍色方塊表示:食物,黃色方塊表示:身體。<br>
        通過鍵盤的上、下、左、右鍵來移動貪吃蛇
    </p>
</body>

</html>

css文件:

命名需要爲:index.css,而且需要和html在同一目錄下,不然html無法調用
(這是講給像我一樣的蒟蒻的,大佬勿噴)

* {
    margin: 0;
    padding: 0;
}

#scoreDiv {
    font-size: 30px;
}

#map {
    width: 1000px;
    height: 500px;
    background-color: black;
}

table {
    border: 0;
    position: absolute;
    left: 0;
    top: 0;
}

td {
    width: 25px;
    height: 25px;
}
button{
    width: 25px;
    height: 25px;
}
#restart{
    background-color: red;
    width:100px;
    height: 25px;
}
p{
    font-size:20px;
}

相關功能實現:

1.產生蛇頭、食物div

我們可以對這個操作用一函數封裝。

//刷新頁面時,不僅要產生地圖,而且還要產生 蛇頭 和 一個食物
    //封裝一個方法,用於創建div元素 放入地圖
    function createDiv(color) {
        var div = document.createElement("div");   //創建一個div節點
        div.style.width = "25px";
        div.style.height = "25px";
        div.style.position="absolute";  //爲了改變位置,並不獨立成行 
        //位置是隨機的     使用js隨機數
        //Math.random() 產生一個[0,1)的隨機數
        div.style.left=parseInt(Math.random()*10)*25+"px";
        div.style.top=parseInt(Math.random()*10)*25+"px";
        div.style.backgroundColor=color;
        $("#map").append(div);       //JQuery操作
        
        //返回創建出的div
        return div;
    }
  • 這裏需要傳入一個color是因爲,我們對於後面的身體操作有用
  • 其中每次遊戲蛇頭和食物都是隨機的,於是我們得用到Math.random()這個函數產生隨機數。

2.使用定時器讓蛇頭動起來

我們可以對我們新產生的div的value值,表示方向,然後對於遊戲開始時對蛇頭設置一個默認的移動方向,通過對div的位置,來實現蛇頭的移動,具體見代碼:

//判斷當前蛇頭的移動方向
        switch(headNode.value){
            case "左":
                headNode.style.left=parseInt(headNode.style.left)-25+"px";
                break;
            case "右":
                headNode.style.left=parseInt(headNode.style.left)+25+"px";
                break;
            case "上":
                headNode.style.top=parseInt(headNode.style.top)-25+"px";
                break;
            case "下":
                headNode.style.top=parseInt(headNode.style.top)+25+"px";
                break;
        }

3.通過鍵盤的上下左右鍵,實現蛇頭的移動

  • 我們首先得知道鍵值,左:37,右:39,上:38,下:40
  • 調用document的keydown方法,獲取當前按下的鍵值
//通過鍵盤的按鍵,來改變蛇頭的移動方向
    //不同的鍵值對應不同的鍵
    $(document).keydown(function(e){      //e表示事件對象
        //console.log(e.keyCode);
        switch(e.keyCode){
            case 37:
                headNode.value="左"
                break;
            case 39:
                headNode.value="右"
                break;
            case 38:
                headNode.value="上"
                break;
            case 40:
                headNode.value="下"
                break;
        }
    })

4.定義兩個數組

-分別存身體和整個蛇,在後面蛇的移動有需要

//放所有身體的數組
    var bodyarr=[];
    //放整個蛇的數組
    var nodes=[];

5.碰撞檢測:以改變食物的位置

  • 碰撞檢測:即div元素重合(蛇頭和食物)
  • 吃到食物,身體加一
//碰撞檢測       即:兩個元素重合
        //吃到食物,身體加一
        if(headNode.style.left==foodNode.style.left&&headNode.style.top==foodNode.style.top){
            var bodyNode=createDiv("yellow");
            var lastNode;      
            if(bodyarr.length>0){
                lastNode=bodyarr[bodyarr.length-1];
            }
            else{
                lastNode=headNode;
            }

            switch(lastNode.value){
                case "左":
                    bodyNode.style.left=parseInt(lastNode.style.left)+25+"px";
                    bodyNode.style.top=lastNode.style.top;
                    break;
                case "右":
                    bodyNode.style.left=parseInt(lastNode.style.left)-25+"px";
                    bodyNode.style.top=lastNode.style.top;
                    break;
                case "上":
                    bodyNode.style.top=parseInt(lastNode.style.top)+25+"px";
                    bodyNode.style.left=lastNode.style.left;
                    break;
                case "下":
                    bodyNode.style.top=parseInt(lastNode.style.top)-25+"px";
                    bodyNode.style.left=lastNode.style.left;
                    break;
            }
            bodyNode.value=lastNode.value;
            bodyarr.push(bodyNode);
            nodes.push(bodyNode);

6.身體隨之移動:

  • 身體隨前一塊移動
  • 需要逆序遍歷身體數組,正序的話會出錯,仔細想一想會發現:第一塊身體移動方向等於蛇頭移動方向,第二塊等於第一塊,以此類推,所有的身體移動方向都是蛇頭移動方向了
//身體移動
        if(bodyarr.length>0){
            //身體跟隨前一塊移動  ,逆序遍歷
            for(var i=bodyarr.length-1;i>=0;i--){
                switch(bodyarr[i].value){
                    case "左":
                        bodyarr[i].style.left=parseInt(bodyarr[i].style.left)-25+"px";
                        break;
                    case "右":
                        bodyarr[i].style.left=parseInt(bodyarr[i].style.left)+25+"px";
                        break;
                    case "上":
                        bodyarr[i].style.top=parseInt(bodyarr[i].style.top)-25+"px";
                        break;
                    case "下":
                        bodyarr[i].style.top=parseInt(bodyarr[i].style.top)+25+"px";
                        break;
                }
                if(i==0){
                    bodyarr[i].value=headNode.value;
                }
                else{
                    bodyarr[i].value=bodyarr[i-1].value;
                }
            }
        }

7.遊戲結束

  • 撞牆
  • 吃到身體
//離開地圖,撞牆
        if(parseInt(headNode.style.left)<0||parseInt(headNode.style.left)>975
        ||parseInt(headNode.style.top)<0||parseInt(headNode.style.top)>475){
            clearInterval(t);
            alert("撞牆了,Game Over!");
        }

        //吃到自己的身體
        if(bodyarr.length>0){
            for(var i=0;i<bodyarr.length;i++){
                if(bodyarr[i].style.left==headNode.style.left&&bodyarr[i].style.top==headNode.style.top){
                    clearInterval(t); 
                    alert("咬到身體了,Game Over!");
                    break;
                }
            }
        }

8.防止更新的食物位置與身體重合

//更新食物位置,防止食物與蛇重合
            var x=parseInt(Math.random()*10)*25;
            var y=parseInt(Math.random()*10)*25;
            for(var i=0;i<nodes.length;i++){
                if(parseInt(nodes[i].style.left)==x&&parseInt(nodes[i].style.top)==y){
                    x=parseInt(Math.random()*10)*25;
                    y=parseInt(Math.random()*10)*25;
                    i=-1;
                }
            }
            foodNode.style.left=x+"px";
            foodNode.style.top=y+"px";

9.得分增加

直接改變span標籤的值即可(每吃一個+10)

//得分增加
            $("#score").text(parseInt($("#score").text())+10);

10.對按鈕實現相關功能

//對按鈕實現相關功能
    $("#quickBtn").click(function(){
        t=setInterval(move,100);
    })

    $("#midBtn").click(function(){
        t=setInterval(move,500);
    })

    $("#slowBtn").click(function(){
        t=setInterval(move,2000);
    })

    $("#restart").click(function(){
        location.reload();
    })

於是基本上這個demo所有功能都實現了

js文件:

同樣需要注意下命名:

$(function () {
    //放所有身體的數組
    var bodyarr=[];
    //放整個蛇的數組
    var nodes=[];
    //蛇移動的速度,默認爲中速
    var t=setInterval(move,500);

    //刷新頁面時,不僅要產生地圖,而且還要產生 蛇頭 和 一個食物
    //封裝一個方法,用於創建div元素 放入地圖
    function createDiv(color) {
        var div = document.createElement("div");   //創建一個div節點
        div.style.width = "25px";
        div.style.height = "25px";
        div.style.position="absolute";  //爲了改變位置,並不獨立成行 
        //位置是隨機的     使用js隨機數
        //Math.random() 產生一個[0,1)的隨機數
        div.style.left=parseInt(Math.random()*10)*25+"px";
        div.style.top=parseInt(Math.random()*10)*25+"px";
        div.style.backgroundColor=color;
        $("#map").append(div);
        
        //返回創建出的div
        return div;
    }
    //蛇頭的移動方向 ,假設默認移動方向向左
    //四個方向 左 右 上 下
    var headNode=createDiv("red");  //創建一個蛇頭
    nodes.push(headNode);
    headNode.value="右";

    var foodNode=createDiv("blue");  //創建一個食物 


    function move(){

        //身體移動
        if(bodyarr.length>0){
            //身體跟隨前一塊移動  ,逆序遍歷
            for(var i=bodyarr.length-1;i>=0;i--){
                switch(bodyarr[i].value){
                    case "左":
                        bodyarr[i].style.left=parseInt(bodyarr[i].style.left)-25+"px";
                        break;
                    case "右":
                        bodyarr[i].style.left=parseInt(bodyarr[i].style.left)+25+"px";
                        break;
                    case "上":
                        bodyarr[i].style.top=parseInt(bodyarr[i].style.top)-25+"px";
                        break;
                    case "下":
                        bodyarr[i].style.top=parseInt(bodyarr[i].style.top)+25+"px";
                        break;
                }
                if(i==0){
                    bodyarr[i].value=headNode.value;
                }
                else{
                    bodyarr[i].value=bodyarr[i-1].value;
                }
            }
        }

        //判斷當前蛇頭的移動方向
        switch(headNode.value){
            case "左":
                headNode.style.left=parseInt(headNode.style.left)-25+"px";
                break;
            case "右":
                headNode.style.left=parseInt(headNode.style.left)+25+"px";
                break;
            case "上":
                headNode.style.top=parseInt(headNode.style.top)-25+"px";
                break;
            case "下":
                headNode.style.top=parseInt(headNode.style.top)+25+"px";
                break;
        }

        //離開地圖,撞牆
        if(parseInt(headNode.style.left)<0||parseInt(headNode.style.left)>975
        ||parseInt(headNode.style.top)<0||parseInt(headNode.style.top)>475){
            clearInterval(t);
            alert("撞牆了,Game Over!");
        }

        //吃到自己的身體
        if(bodyarr.length>0){
            for(var i=0;i<bodyarr.length;i++){
                if(bodyarr[i].style.left==headNode.style.left&&bodyarr[i].style.top==headNode.style.top){
                    clearInterval(t); 
                    alert("咬到身體了,Game Over!");
                    break;
                }
            }
        }

        //碰撞檢測       即:兩個元素重合
        //吃到食物,身體加一
        if(headNode.style.left==foodNode.style.left&&headNode.style.top==foodNode.style.top){
            var bodyNode=createDiv("yellow");
            var lastNode;      
            if(bodyarr.length>0){
                lastNode=bodyarr[bodyarr.length-1];
            }
            else{
                lastNode=headNode;
            }

            switch(lastNode.value){
                case "左":
                    bodyNode.style.left=parseInt(lastNode.style.left)+25+"px";
                    bodyNode.style.top=lastNode.style.top;
                    break;
                case "右":
                    bodyNode.style.left=parseInt(lastNode.style.left)-25+"px";
                    bodyNode.style.top=lastNode.style.top;
                    break;
                case "上":
                    bodyNode.style.top=parseInt(lastNode.style.top)+25+"px";
                    bodyNode.style.left=lastNode.style.left;
                    break;
                case "下":
                    bodyNode.style.top=parseInt(lastNode.style.top)-25+"px";
                    bodyNode.style.left=lastNode.style.left;
                    break;
            }
            bodyNode.value=lastNode.value;
            bodyarr.push(bodyNode);
            nodes.push(bodyNode);

            //得分增加
            $("#score").text(parseInt($("#score").text())+10);

            //更新食物位置,防止食物與蛇重合
            var x=parseInt(Math.random()*10)*25;
            var y=parseInt(Math.random()*10)*25;
            for(var i=0;i<nodes.length;i++){
                if(parseInt(nodes[i].style.left)==x&&parseInt(nodes[i].style.top)==y){
                    x=parseInt(Math.random()*10)*25;
                    y=parseInt(Math.random()*10)*25;
                    i=-1;
                }
            }
            foodNode.style.left=x+"px";
            foodNode.style.top=y+"px";
        }
    }

    //通過鍵盤的按鍵,來改變蛇頭的移動方向
    //不同的鍵值對應不同的鍵
    $(document).keydown(function(e){      //e表示事件對象
        //console.log(e.keyCode);
        switch(e.keyCode){
            case 37:
                headNode.value="左"
                break;
            case 39:
                headNode.value="右"
                break;
            case 38:
                headNode.value="上"
                break;
            case 40:
                headNode.value="下"
                break;
        }
    })


    //對按鈕實現相關功能
    $("#quickBtn").click(function(){
        t=setInterval(move,100);
    })

    $("#midBtn").click(function(){
        t=setInterval(move,500);
    })

    $("#slowBtn").click(function(){
        t=setInterval(move,2000);
    })

    $("#restart").click(function(){
        location.reload();
    })

})

大佬不妨留個贊再走唄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章