js 簡單的推箱子小遊戲步驟解析–大家都玩過的

OBKoro1發表於2019-02-21

前言

推箱子小遊戲大家肯定都玩過,之所以寫這篇文章,是覺得這個小遊戲足夠簡單好理解,大家看完文章之後,自己也能花上半天功夫敲出一個推箱子小遊戲來,如果喜歡的話可以點波贊,或者關注一下,希望本文可以幫到大家。

本文首發於我的個人blog:obkoro1.com

demo:推箱子小遊戲

步驟解析:

本文程式碼已經放在了github上面了,裡面也進行了很詳細的程式碼註釋,可以copy下來,在本地執行一下看看

1. 渲染地圖

  1. html結構:

    js 簡單的推箱子小遊戲步驟解析–大家都玩過的
     html結構十分簡單,只要弄一堆div,來放置地圖的class就可以了,我這裡初始化了12*9個div,地圖裡最多九行高度。   
     這些div都是同樣大小,地圖渲染出來區別的只是顏色的不同。
    複製程式碼
  2. 地圖函式:

    var box=$(`.box div`); //地圖使用的div集合
    function create(){ //建立地圖函式
    box.each(function(index){ //index的數量是固定的,是box div下面div的數量
         // 每次建立地圖初始化div
        box.eq(index).removeClass();
    });
    box.each(function(index,element){ //迴圈整個div的數量 二維陣列裡數量不夠的 預設為空白
    //level為關卡數 根據關卡渲染地圖 builder為二維陣列,為地圖關卡
        if(builder[level][index]){ //過濾0
            box.eq(index).addClass(`type`+builder[level][index]);
        }
    });
    box.eq(origin[level]).addClass("pusher"); //推箱人 皮卡丘位置
    }
    
    //第一關的地圖長這樣(下面只是栗子,不是程式碼),0代表不可抵達區域,1代表目標(要被推到的地方),
    //2代表普通路徑(可以走的),3代表牆,4代表箱子
    [0,0,0,0,3,3,3,0,0,0,0,0,
    0,0,0,0,3,1,3,0,0,0,0,0,
    0,0,0,0,3,2,3,3,3,3,0,0,
    0,0,3,3,3,4,2,4,1,3,0,0,
    0,0,3,1,2,4,2,3,3,3,0,0,
    0,0,3,3,3,3,4,3,0,0,0,0,
    0,0,0,0,0,3,1,3,0,0,0,0,
    0,0,0,0,0,3,3,3,0,0,0,0] 
    複製程式碼

2. 捕獲鍵盤事件,判斷是否可以移動

使用$(document).keydown()jqery事件,捕獲鍵盤事件。

  1. 捕獲鍵盤事件,上下左右以及wsad。

    $(document).keydown(function (e) {
     var key=e.which;
     switch(key){
     //col 的值為12,上下移動要12個div為一個週期
     //方向鍵上或者w
     case 87:
     case 38:
         move(-col);//判斷移動函式
     break;
     //方向鍵下或者s
     case 83:
     case 40:
        move(col);
     break;
     //方向鍵左或者a
     case 65:
     case 37:
         move(-1);
     break;
     //方向鍵右或者d
     case 68:
     case 39:
         move(1);
     break;
     }
    setTimeout(win,500); //按鍵之後調判斷是否過關
    });
    複製程式碼
  2. 判斷是否可以移動。

分為兩個判斷條件:一個是推箱子,一個是不推箱子 自然移動,否則不移動皮卡丘。

    function move(step){ //是否移動判斷
         // 分為兩個判斷條件一個是推箱子,一個是不推箱子 自然移動。 否則不移動皮卡丘
         //step 上下是12個div一個週期,左右是1個div positin是皮卡丘的原來位置
        var pikaqiu1=box.eq(position);//皮卡丘現在的地方
        var pikaqiu2=box.eq(position+step);//皮卡丘要去的下一個地方
        var pushBox=box.eq(position+step*2);//箱子要去的下一個地方
        if(!pikaqiu2.hasClass(`type4`)&&( pikaqiu2.hasClass(`type1`)||pikaqiu2.hasClass(`type2`))){ //自然移動
            //判斷:如果下一個div的class不包含type4(箱子),並且 下一個div含有type1(目標位置),或者type2(普通路徑)
            //這一步和下一步判斷是否有type4的原因是普通路徑會變成有type4的路徑,這時候就會出現問題
            pikaqiu1.removeClass("pusher"); //移除當前皮卡丘
            pikaqiu2.addClass("pusher");//移動皮卡丘到下一個位置
            position=position+step;//增加position值
        }
        else if((pikaqiu2.hasClass(`type4`))&&(!pushBox.hasClass(`type4`))&&(pushBox.hasClass(`type1`)|| pushBox.hasClass(`type2`)) ) {
            //推箱子    
            //如果下一個div的class包含type4(箱子)並且 不包含重疊type4(箱子) 並且 包含class type1(目標位置)或者 包含type2(空路)
           pikaqiu2.removeClass(`type4`);//移除當前箱子
            pikaqiu1.removeClass("pusher");//移除當前皮卡丘
            pushBox.addClass(`type4`);//移動箱子到下一個位置
            pikaqiu2.addClass("pusher").addClass("type2");//
            //本來是type4 移除之後,這裡沒有class了,要變成普通路徑
            position=position+step;//增加position值 
        }
    }    
複製程式碼

3.勝利判斷:

每次移動都要呼叫這個勝利判斷。

function win(){ //勝利條件判斷
    if($(".type1.type4").length===goal){ //推的箱子與關卡設定通過箱子的數量對比
        if(level<9) {
            alert("666,挑戰下一關吧--OBKoro1");
            level++; //關卡+1
            goal = goalList[level];
            position = origin[level];
            create();
        }else {
            alert("厲害啊 大佬 通關了都");
        }
    }
}
複製程式碼

程式碼地址demo地址

結語

本文到這裡就結束了,喜歡的話,趕緊自己去敲一個出來,希望本文可以幫助大家發散思維。

最後:如需轉載,請放上原文連結並署名。碼字不易,感謝支援!本人寫文章本著交流記錄的心態,寫的不好之處,不撕逼,但是歡迎指點。然後就是希望看完的朋友點個喜歡,也可以關注一下我。
個人blog and 掘金個人主頁

以上2018.1.7

相關文章