欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript貪吃蛇的實現(xiàn)代碼

 更新時間:2021年09月07日 10:41:34   作者:777885  
這篇文章主要為大家詳細(xì)介紹了JavaScript貪吃蛇的實現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了JavaScript實現(xiàn)貪吃蛇的具體代碼,供大家參考,具體內(nèi)容如下

首先我們要確定貪吃蛇應(yīng)有的功能

1.通過鍵盤的上下左右控制蛇的移動方向

2.邊界判定,即蛇頭超出邊界則游戲結(jié)束

3.碰撞判定,即蛇頭和食物塊發(fā)生觸碰

4.吃到食物積分加1

具體實現(xiàn)

一.html代碼

<div class="container">
        <!--小蛇移動的操場-->
        <div id="playground">
            <!--小蛇-->
            <div id="snake"></div>
            <!--食物-->
            <div id="food"></div>
        </div>
        <!--記錄得分-->
        <div id="menu">
            <div>得分<span id="score"></span></div>
        </div>
</div>

二.css代碼

<style>
        * {
            padding: 0;
            margin: 0;
        }
 
        .container {
            width: 800px;
            height: 600px;
            margin: 0 auto;
        }
 
        #playground {
            width: 650px;
            height: 100%;
            background-color: cadetblue;
            float: left;
            position: relative;
        }
 
        #menu {
            width: 150px;
            height: 100%;
            background-color: darkcyan;
            float: left;
        }
 
        #snake {
            width: 20px;
            height: 20px;
            background-color: #d3e0d7;
            position: absolute;
            left: 0;
            top: 0;
        }
 
        #food {
            width: 20px;
            height: 20px;
            background-color: #027766;
            position: absolute;
        }
 
        .body {
            width: 20px;
            height: 20px;
            background-color: #178b9a;
            position: absolute;
            ;
            top: 0;
            left: 0;
        }
 
        #score {
            font-size: 30px;
            font-weight: bold;
            color: black;
        }
 
        #menu div {
            font-size: 20px;
            font-weight: bold;
            margin-left: 20px;
        }
 
        #hqx {
            width: 100px;
            height: 50px;
            margin: 0 auto;
 
        }
 
        #inp {
            border: 0;
            width: 100px;
            height: 50px;
            background-color: coral;
        }
</style>

三.開始實現(xiàn)具體功能

1.先獲取節(jié)點,設(shè)置全局變量

//獲取節(jié)點
        var snake = document.getElementById("snake");
        var food = document.getElementById("food");
        var playground = document.getElementById("playground");
        var score = document.getElementById('score');
        // var inp = document.getElementById('inp')
        /*設(shè)置全局變量*/
        var timer;
        var arr = []; //存放蛇的位置的數(shù)組
        var num = 0; //數(shù)組的長度
        var snakeBody; //每次吃調(diào)一個食物,增加的身體

2.設(shè)置按鍵事件,并判斷邊界碰撞,碰撞時游戲結(jié)束。這一塊代碼我遇到了一個問題,就是當(dāng)我用if(){return}跳出事件,會結(jié)束所有代碼,后面的代碼就不會執(zhí)行了,然后我換成了switch(){ case:     break;}就實現(xiàn)效果了

 //設(shè)置按鍵事件
        document.onkeydown = function (e) {
            var evt = window.evnet || e;
            switch (evt.keyCode) {
                case 37: //左
                    clearInterval(timer);
                    timer = window.setInterval(runLeft, 10); //向左移動的時間器
                    function runLeft() {
                        if (snake.offsetLeft > 0) {
                            snake.style.left = snake.offsetLeft - 1 + 'px'; //實現(xiàn)自己動
                            snake.style.top = snake.offsetTop + 'px'; //高度不變
                            arr.push([snake.offsetLeft, snake.offsetTop]); //每移動1px,就將位置存進數(shù)組中
                            num++; //相應(yīng)的數(shù)組長度加1
                        } else {
                            clearInterval(timer); //清除定時器
                            alert('you die') //彈出失敗信息
                            document.onkeydown = null //結(jié)束按鍵
                        }
                    }
                    break; //結(jié)束當(dāng)前按鍵
                case 38: //上
                    clearInterval(timer);
                    timer = window.setInterval(runTop, 10);
 
                    function runTop() {
                        if (snake.offsetTop > 0) {
                            snake.style.top = snake.offsetTop - 1 + 'px';
                            snake.style.left = snake.offsetLeft + 'px';
                            arr.push([snake.offsetLeft, snake.offsetTop]);
                            num++;
                        } else {
                            clearInterval(timer);
                            alert('you die')
                            document.onkeydown = null
                        }
                    }
                    break;
                case 39: //右
                    clearInterval(timer);
                    timer = window.setInterval(runRight, 10);
 
                    function runRight() {
                        if (snake.offsetLeft < 630) {
                            snake.style.left = snake.offsetLeft + 1 + 'px';
                            snake.style.top = snake.offsetTop + 'px';
                            arr.push([snake.offsetLeft, snake.offsetTop]);
                            num++;
                        } else {
                            clearInterval(timer);
                            alert('you die')
                            document.onkeydown = null
                        }
                    }
                    break;
                case 40: //下
                    clearInterval(timer);
                    timer = window.setInterval(runBottom, 10);
 
                    function runBottom() {
                        if (snake.offsetTop < 580) {
                            snake.style.top = snake.offsetTop + 1 + 'px';
                            snake.style.left = snake.offsetLeft + 'px';
                            arr.push([snake.offsetLeft, snake.offsetTop]);
                            num++;
                        } else {
                            clearInterval(timer);
                            alert('you die')
                            document.onkeydown = null
                        }
                    }
                    break;
 
}

3.封裝一個函數(shù),隨機生成食物位置,第一次粗心忘記加單位,看網(wǎng)頁沒效果,才知道忘記加單位了

function pos() {
                food.style.left = parseInt(Math.random() * 630) + 'px';
                food.style.top = parseInt(Math.random() * 580) + 'px';
            }

4.封裝一個碰撞判定函數(shù),使其碰撞時,食物消失,蛇的身體增加一塊。這里遇到一個定時器問題,第一次寫的時候,我的定時器清除標(biāo)識和之前的定時器標(biāo)識一致,導(dǎo)致蛇會上下左右抖動,經(jīng)過后面不停的修改,最終找到錯誤。

var timer1 = setInterval(eat, 10); //設(shè)置一個碰撞的時間器
            function eat() {
                snakeCrashFood(snake, food); //傳入?yún)?shù)
 
                function snakeCrashFood(obj1, obj2) {
                    var obj1Left = obj1.offsetLeft;
                    var obj1Width = obj1.offsetWidth + obj1.offsetLeft;
                    var obj1Top = obj1.offsetTop;
                    var obj1Height = obj1.offsetHeight + obj1.offsetTop;
                    var obj2Left = obj2.offsetLeft;
                    var obj2Width = obj2.offsetWidth + obj2.offsetLeft;
                    var obj2Top = obj2.offsetTop;
                    var obj2Height = obj2.offsetHeight + obj2.offsetTop;
                    if (!((obj1Width < obj2Left) || (obj2Width < obj1Left) || (obj1Height < obj2Top) || (
                            obj2Height < obj1Top))) {
                        snakeBody = document.createElement("div"); //生成新的div
                        snakeBody.setAttribute("class", "body"); //給新的div添加類名
                        playground.appendChild(snakeBody); //添加一節(jié)新的身體
                        pos(); //讓食物重新隨機出現(xiàn)
                        setInterval(follow, 10); //動態(tài)地改變新的身體的位置
                    }
                }
            }

5.設(shè)置蛇的身體跟隨,獲得蛇身體的數(shù)組,新的身體相對于上一個身體的第20個數(shù)組的位置。這里我遇到了一個數(shù)組越界問題。最開始初始num值為0,place=20,所以第一次身體的增加arr[num-place][0]前面的索引是從負(fù)數(shù)開始,在通過老師的指導(dǎo),增加一個判定,解決了這個問題。

function follow() {
                /*獲得增加的身體的數(shù)組*/
                var bodyNum = document.getElementsByClassName("body");
                score.innerHTML = bodyNum.length;
                var place = 0;
                /*數(shù)組每移動1px,新的身體的位置就是相對于前一個身體的第20個數(shù)組的位置,后面依次加等*/
                // console.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1")
                // console.log("arr   :  ==" + arr)
                // console.log("num : ==" + num)  //2
                for (var i = 0; i < bodyNum.length; i++) {
                    // console.log("bodyNum.length :  ==" + bodyNum.length)
                    place += 20;
                    // console.log("place :  ==" + place)//20
                    // console.log("num - place :  ==" + (num - place))//-18
                    // bodyNum[i].style.left = arr[num - place][0] + 'px';
                    // bodyNum[i].style.top = arr[num - place][1] + 'px';
                    if (num - place > 0) {
                        bodyNum[i].style.left = arr[num - place][0] + 'px';
                        bodyNum[i].style.top = arr[num - place][1] + 'px';
                    }
 
                }
                // console.log("num555 : ==" + num)
                // console.log("===========================================")
            }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springMVC + easyui + $.ajaxFileUpload實現(xiàn)文件上傳注意事項

    springMVC + easyui + $.ajaxFileUpload實現(xiàn)文件上傳注意事項

    在使用easyUI做前端樣式展示時,遇到了文件上傳的問題,而且是在彈出層中提交表單,想做到不刷新頁面,所以選擇了使用ajaxFileUpload插件。下面通過本文給大家分享springMVC + easyui + $.ajaxFileUpload實現(xiàn)文件上傳注意事項,需要的朋友參考下吧
    2017-04-04
  • Js判斷兩個數(shù)組是否相等的幾種常見場景

    Js判斷兩個數(shù)組是否相等的幾種常見場景

    無論是在開發(fā)中還是面試時,在js中判斷變量是否相等,都是一個比較常見的問題,這篇文章主要給大家介紹了關(guān)于Js判斷兩個數(shù)組是否相等的幾種常見場景,需要的朋友可以參考下
    2024-07-07
  • 前端使用crypto-js庫aes加解密詳細(xì)代碼示例

    前端使用crypto-js庫aes加解密詳細(xì)代碼示例

    在前端開發(fā)中數(shù)據(jù)的加密和解密是為了保障用戶隱私和數(shù)據(jù)的安全性而常見的任務(wù),這篇文章主要給大家介紹了關(guān)于前端使用crypto-js庫aes加解密的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 實例分析Array.from(arr)與[...arr]到底有何不同

    實例分析Array.from(arr)與[...arr]到底有何不同

    這篇文章通過實例主要給大家分析介紹了關(guān)于Array.from(arr)與[...arr]到底有何不同的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • javascript自定義startWith()和endWith()的兩種方法

    javascript自定義startWith()和endWith()的兩種方法

    js中自定義startWith()和endWith()方法有兩種,在本文將為大家詳細(xì)介紹下,感興趣的朋友不要錯過
    2013-11-11
  • JavaScript實現(xiàn)區(qū)塊鏈

    JavaScript實現(xiàn)區(qū)塊鏈

    很多朋友都聽說過比特幣和以太幣這樣的加密貨幣,但是只有極少數(shù)人懂得隱藏在它們背后的技術(shù),接下來通過本文給大家介紹用JavaScript來創(chuàng)建一個簡單的區(qū)塊鏈來演示它們的內(nèi)部究竟是如何工作的,感興趣的朋友一起看看吧
    2018-03-03
  • 三種Webpack打包方式(小結(jié))

    三種Webpack打包方式(小結(jié))

    這篇文章主要介紹了三種Webpack打包方式(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 分享7個殺手級JS小技巧

    分享7個殺手級JS小技巧

    這篇文章主要分享的是7個殺手級JS小技巧,主要分享的小技巧有數(shù)組亂序、復(fù)制到剪貼板、數(shù)組去重、檢測黑暗模式、滾動到頂部,下文章詳細(xì)代碼實現(xiàn),需要的小伙伴可以參考一下
    2022-02-02
  • 基于javascript實現(xiàn)日歷功能原理及代碼實例

    基于javascript實現(xiàn)日歷功能原理及代碼實例

    這篇文章主要介紹了基于javascript實現(xiàn)日歷效果原理及代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • js冒泡法和數(shù)組轉(zhuǎn)換成字符串示例代碼

    js冒泡法和數(shù)組轉(zhuǎn)換成字符串示例代碼

    將數(shù)組轉(zhuǎn)換成字符串的方法有很多,想必大家也不會陌生,下面為大家講解下js冒泡法的使用,感興趣的朋友可以參考下
    2013-08-08

最新評論