溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么實現(xiàn)網(wǎng)頁版別踩白塊游戲

發(fā)布時間:2020-09-14 14:47:03 來源:億速云 閱讀:121 作者:小新 欄目:web開發(fā)

這篇文章主要介紹怎么實現(xiàn)網(wǎng)頁版別踩白塊游戲,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

自己最近一直想做個小項目,但是自己代碼水平太爛了,做不了大系統(tǒng),索性利用畢生所學(xué)寫個小游戲,哈哈哈
別踩白塊這個游戲相信很多人都在手機(jī)上玩過,今天我們就來做一個網(wǎng)頁版的,先上一張游戲效果圖:

怎么實現(xiàn)網(wǎng)頁版別踩白塊游戲

不同于移動端采用手指觸碰,網(wǎng)頁版需要我們用鼠標(biāo)點擊黑塊,黑塊才會消失。刷新頁面即可以開始游戲,這個小游戲最重要的部分代碼,初學(xué)者也能很快看懂。YES~

在開始之前,讓我們簡單分析下整個游戲的流程:一定的速度下移,點擊黑塊,黑塊消失,新的黑塊在普通游戲玩家眼中,應(yīng)該是游戲開始,黑塊以塊不斷向下移動,若黑塊觸底則游戲結(jié)束;而以我們來說,可以將每一個黑塊和白塊抽象成一個個的數(shù)據(jù)結(jié)構(gòu),黑塊的消失和出現(xiàn)其實就是 數(shù)據(jù)結(jié)構(gòu)的創(chuàng)造和銷毀,我們來看一張游戲的流程圖,對于要編寫的功能有一個大概的了解:

怎么實現(xiàn)網(wǎng)頁版別踩白塊游戲

頁面布局

可以用 div+css 布局來實現(xiàn)別踩白塊的靜態(tài)效果展示,直接上 HTML 代碼,我來簡要說下 HTML 思路,將主界面分解成一個4×4的大矩形格子,每一個方塊代表其中一個小的矩形格,其中每一行的四個白塊中有一個黑塊,每一行中黑塊位于那一列是隨機(jī)生成的,但是我們這里現(xiàn)在是靜態(tài)頁面就自己確定了,然后通過 css 控制樣式。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>別踩白塊</title>
    <style type="text/css">
    </style>
</head>
<body>
    <div id="main">
        <div id="con">
            <div class="row">
                <div class="cell"></div>/*白塊*/
                <div class="cell black"></div>/*黑塊*/
                <div class="cell"></div>
                <div class="cell"></div>
            </div>
            <div class="row">
                <div class="cell"></div>
                <div class="cell black"></div>
                <div class="cell"></div>
                <div class="cell"></div>
            </div>
            <div class="row">
                <div class="cell"></div>
                <div class="cell"></div>
                <div class="cell black"></div>
                <div class="cell"></div>
            </div>
            <div class="row">
                <div class="cell black"></div>
                <div class="cell"></div>
                <div class="cell"></div>
                <div class="cell"></div>
            </div>
        </div>
    </div>
</body>
<script>
</script>
</html>

游戲初始化

根據(jù)前面的 HTML 部分我們可以知道,每個 <div class=”cell”> 就代表一個白塊,<div class=”cell black”> 就代表一個黑塊,每點擊一個黑塊消失其實是刪除了一個 <div class=”row”> ,然后從上面添加一個新的 <div class=”row”> 。所以我們首先要通過 js 來控制 <div class=”row”> 的創(chuàng)造和生成(記得刪除在編寫靜態(tài)頁面時候指定生成的4個 div.row)。具體方法如下:

//創(chuàng)建div, 參數(shù)className是其類名
    function creatediv(className){
        var div = document.createElement('div');
        div.className = className;
        return div;
    }

    // 創(chuàng)造一個<div class="row">并且有四個子節(jié)點<div class="cell">
    function createrow(){
        var con = $('con');
        var row = creatediv('row'); //創(chuàng)建div className=row
        var arr = creatcell(); //定義div cell的類名,其中一個為cell black

        con.appendChild(row); // 添加row為con的子節(jié)點

        for(var i = 0; i < 4; i++){
            row.appendChild(creatediv(arr[i])); //添加row的子節(jié)點 cell
        }

        if(con.firstChild == null){
            con.appendChild(row);
        }else{
            con.insertBefore(row, con.firstChild);
        }
    }

    //刪除div#con的子節(jié)點中最后那個<div class="row">    
    function delrow(){
            var con = $('con');
            if(con.childNodes.length == 6) {
                   con.removeChild(con.lastChild);
               }
        }    

    //創(chuàng)建一個類名的數(shù)組,其中一個為cell black, 其余為cell
    function creatcell(){
        var temp = ['cell', 'cell', 'cell', 'cell',];
        var i = Math.floor(Math.random()*4);//隨機(jī)生成黑塊的位置
        temp[i] = 'cell black';
        return temp;
    }

讓黑塊動起來

在可以通過 js 來創(chuàng)造和銷毀 div 后,我們就要讓黑塊動起來,這個時候我們就用到了之前css提到的設(shè)定 <div id=”con”> 隱藏了一行的 <div id=”row”>,我們通過 js 的 DOM 操作使其向下方移動,并設(shè)置定時器每30毫秒移動一次,這樣就實現(xiàn)了黑塊的平滑移動,在黑塊移動的同時,我們要判斷黑塊是否已經(jīng)觸底,觸底則游戲失敗,停止調(diào)用 move(),觸底后調(diào)用函數(shù) fail() 游戲失敗,具體方法如下:

//使黑塊向下移動    
    function move(){
        var con = $('con');
        var top = parseInt(window.getComputedStyle(con, null)['top']);

        if(speed + top > 0){
            top = 0;
        }else{
            top += speed;
        }            
        con.style.top = top + 'px';

        if(top == 0){
            createrow();
            con.style.top = '-100px';
            delrow();
        }else if(top == (-100 + speed)){
            var rows = con.childNodes;
            if((rows.length == 5) && (rows[rows.length-1].pass !== 1) ){
                fail();
            }
        }
    }

    function fail(){
            clearInterval(clock);
            confirm('你的最終得分為 ' + parseInt($('score').innerHTML) );
        }
點擊黑塊事件

讓黑塊動起來之后呢,就要考慮用戶有沒有點擊到黑塊,用戶若點擊到黑塊我們要讓所在那一行消失,那么就需要一個 judge 方法,具體如下:

//判斷用戶是否點擊到了黑塊,
function judge(ev){
    if (ev.target.className.indexOf('black') != -1) {
        ev.target.className = 'cell';
        ev.target.parentNode.pass = 1; //定義屬性pass,表明此行row的黑塊已經(jīng)被點擊
        score();
    }
}

這一步,幾個核心的功能點都已經(jīng)實現(xiàn)了,剩下來的就是將這些方法組合起來,組成完整的邏輯關(guān)系。

完整代碼

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>別踩白塊</title>
    <style type="text/css">
        #score{
            text-align: center;}

        h3 {
            text-align: center;    }

        div{
            margin: 0 auto;
            width: 100px;
            height: 100px;}

        #main {
            width: 400px;
            height: 400px;
            background: white;
            border: 2px solid gray;
            margin: 0 auto;
            position: relative;
            overflow: hidden;}

        #con {
            width: 100%;
            height: 400px;
            position: relative;
            top: -100px;
            border-collapse:collapse;}

        .row{
            height: 100px;
            width: 100%;}

        .cell{
            height: 100px;
            width: 100px;
            float: left;}

        .black {
            background: black;}
    </style>
</head>
<body>

    <h3>score</h3>
    <h3 id="score">0</h3>
    <div id="main">
        <div id="con"></div>
    </div>
</body>
<script>
    var clock = null;
    var state = 0;
    var speed = 4;

        /*
        *    初始化 init
        */
        function init(){
            for(var i=0; i<4; i++){
                createrow();
            }

            // 添加onclick事件
            $('main').onclick = function(ev){
                judge(ev);
            }

            // 定時器 每30毫秒調(diào)用一次move()
                clock = window.setInterval('move()', 30);
        }

        // 判斷是否點擊黑塊
        function judge(ev){
            if (ev.target.className.indexOf('black') != -1) {
                ev.target.className = 'cell';
                ev.target.parentNode.pass = 1; //定義屬性pass,表明此行row的黑塊已經(jīng)被點擊
                score();
            }
        }

        // 游戲結(jié)束
        function fail(){
            clearInterval(clock);
            confirm('你的最終得分為 ' + parseInt($('score').innerHTML) );
        }

        // 創(chuàng)建div, className是其類名
        function creatediv(className){
            var div = document.createElement('div');
            div.className = className;
            return div;
        }

        // 創(chuàng)造一個<div class="row">并且有四個子節(jié)點<div class="cell">
        function createrow(){
            var con = $('con');
            var row = creatediv('row'); //創(chuàng)建div className=row
            var arr = creatcell(); //定義div cell的類名,其中一個為cell black

            con.appendChild(row); // 添加row為con的子節(jié)點

            for(var i = 0; i < 4; i++){
                row.appendChild(creatediv(arr[i])); //添加row的子節(jié)點 cell
            }

            if(con.firstChild == null){
                con.appendChild(row);
            }else{
                con.insertBefore(row, con.firstChild);
            }
        }

        // 根據(jù)id來get DOM元素
        function $(id) {
            return document.getElementById(id);
        }

        // 創(chuàng)建一個類名的數(shù)組,其中一個為cell black, 其余為cell
        function creatcell(){
            var temp = ['cell', 'cell', 'cell', 'cell',];
            var i = Math.floor(Math.random()*4);
            temp[i] = 'cell black';
            return temp;
        }

        //讓黑塊動起來
        function move(){
            var con = $('con');
            var top = parseInt(window.getComputedStyle(con, null)['top']);

            if(speed + top > 0){
                top = 0;
            }else{
                top += speed;
            }            
            con.style.top = top + 'px';

            if(top == 0){
                createrow();
                con.style.top = '-100px';
                delrow();
            }else if(top == (-100 + speed)){
                var rows = con.childNodes;
                if((rows.length == 5) && (rows[rows.length-1].pass !== 1) ){
                    fail();
                }
            }
        }

        // 加速函數(shù)
        function speedup(){
            speed += 2;
            if(speed == 20){
                alert('你超神了');
            }
        }

        //刪除某行
        function delrow(){
            var con = $('con');
            if(con.childNodes.length == 6) {
                   con.removeChild(con.lastChild);
               }
        }    

        // 記分
        function score(){
            var newscore = parseInt($('score').innerHTML) + 1;
            $('score').innerHTML = newscore;
            if(newscore % 10 == 0){
                speedup();
            }
        }

    init();
</script>
</html>

以上是怎么實現(xiàn)網(wǎng)頁版別踩白塊游戲的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI