成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[ 邏輯鍛煉] 用 JavaScript 做一個(gè)小游戲 ——2048 (初級(jí)版)

lidashuang / 2513人閱讀

摘要:前言前段時(shí)間發(fā)現(xiàn)網(wǎng)上有很多收費(fèi)或公開課都有教用做小游戲的,然后自己就也想動(dòng)手做一個(gè),做這個(gè)小游戲主要是為了鍛煉自己的邏輯能力,也算是對(duì)之前一些學(xué)習(xí)的總結(jié)吧注實(shí)現(xiàn)方法完全是自己邊玩邊想的,所有些亂還請(qǐng)見諒另外配色方案是在某個(gè)游戲截屏,然后用吸

前言

前段時(shí)間發(fā)現(xiàn)網(wǎng)上有很多收費(fèi)或公開課都有教用 js 做 2048 小游戲的,然后自己就也想動(dòng)手做一個(gè),做這個(gè)小游戲主要是為了鍛煉自己的邏輯能力,也算是對(duì)之前一些學(xué)習(xí)的總結(jié)吧

注:

實(shí)現(xiàn)方法完全是自己邊玩 2048 邊想的,所有些亂還請(qǐng)見諒

另外配色方案是在某個(gè) 2048 游戲截屏,然后用 ps 吸取的,非本人原創(chuàng)

代碼中有很多都可以使用數(shù)組相關(guān)的方法來(lái)代替,這里是為了自己理解數(shù)組方法是什么原理

由于時(shí)間關(guān)系本次不做詳解

游戲邏輯

隨機(jī)位置生成數(shù)字 2 或 4

按方向鍵,有挨著的相同的數(shù)字就合并成新的數(shù)字

按方向鍵,數(shù)字會(huì)移動(dòng)到對(duì)應(yīng)方向的最邊上(按左,數(shù)字全部移動(dòng)到左邊)

每次按方向鍵,合并完成后,會(huì)在沒有數(shù)字的隨機(jī)位置都會(huì)生成新的數(shù)字 2 或 4

當(dāng)前分?jǐn)?shù)等于當(dāng)前所有數(shù)字相加

當(dāng)有數(shù)字達(dá)到 2048 游戲結(jié)束

項(xiàng)目相關(guān)

這個(gè)版本是用原生 ES6 寫的,只實(shí)現(xiàn)了游戲邏輯中的 1,2,3,4;
第一版地址:https://github.com/yhtx1997/S...

之后是打算用 vue 重新寫一遍,并且完善下,因?yàn)殚L(zhǎng)時(shí)間用原生,導(dǎo)致 vue 有些生疏,借此機(jī)會(huì)重新溫習(xí)下

項(xiàng)目代碼 采用二維數(shù)組進(jìn)行數(shù)據(jù)的管理,默認(rèn)全部為零
let arr = [
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]
];
隨機(jī)創(chuàng)建數(shù)字
let s = 0;
let create = () => {
    let x = Math.floor(Math.random() * 4);
    let y = Math.floor(Math.random() * 4);

    // console.log(s)
    if (s > 100) {
        s = 0;
        return;
    }
    if (arr[x][y] == 0) {
        if (Math.floor(Math.random() * 10) % 2 == 0) {
            arr[x][y] = 2;
        } else {
            arr[x][y] = 4;
        }
        s = 0;
        return;
    } else {
        s++;
        return create();
    }
}
渲染頁(yè)面
let updateHtml = () => {
    //獲取元素
    let warp = document.getElementById("warp");
    let html = "";
    //將數(shù)據(jù)轉(zhuǎn)換為 HTML 
    for (let i = 0; i < arr.length; i++) {
        for (let j = 0; j < arr[i].length; j++) {
            html += `
${arr[i][j]==0?"":arr[i][j]}
`; } } //將 數(shù)據(jù)轉(zhuǎn)換的 HTML 渲染到頁(yè)面 warp.innerHTML = html; }
事件監(jiān)聽
window.onkeydown = (e) => {
    switch (e.keyCode) {
        case 37:
            // ←
            console.log("←");
            arr = new move(arr).moveLeft();
            create(); //隨機(jī)位置新建
            updateHtml(); //更新數(shù)據(jù)到頁(yè)面
            break;
        case 38:
            // ↑
            console.log("↑");
            arr = new move(arr).moveUp();
            create(); //隨機(jī)位置新建
            updateHtml(); //更新數(shù)據(jù)到頁(yè)面
            break;
        case 39:
            // →
            console.log("→");
            arr = new move(arr).moveRight();
            create(); //隨機(jī)位置新建
            updateHtml(); //更新數(shù)據(jù)到頁(yè)面
            break;
        case 40:
            // ↓
            console.log("↓");
            arr = new move(arr).moveDown();
            create(); //隨機(jī)位置新建
            updateHtml(); //更新數(shù)據(jù)到頁(yè)面
            break;
    }
}
具體處理函數(shù) 先提取非零數(shù)字
export default function ClearZero (arr){//去零
    let clearZero = [[],[],[],[]];
    for (let i = 0; i < 4; i++) {
        for (let j = 0; j < 4; j++) {
            if (arr[i][j] != 0) {
                clearZero[i].push(arr[i][j])
            }
        }
    }
    return clearZero;
}
將挨著的相等數(shù)字分組并相加

分組

import Deduplication from "./deduplication";//將相鄰且相同的數(shù)字相加

export default class Grouping{//將相鄰的相同數(shù)字分組
    constructor(clearZero){
        this.clearZero = clearZero;
    }
    left(){
        let newarr = [[],[],[],[]];
        for (let j = 0; j < this.clearZero.length; j++) {
            let grouping = [];
            let i = 0;
            //將重復(fù)的 分到一組
            while (i < this.clearZero[j].length) {
                if (this.clearZero[j][i] == this.clearZero[j][i + 1]) {
                    grouping.push([this.clearZero[j][i], this.clearZero[j][i + 1]]);
                    i += 2;
                } else {
                    grouping.push(this.clearZero[j][i]);
                    i++;
                }
            }
            //去重復(fù)
            newarr[j] = Deduplication(grouping);
        }
        return newarr;
    }
    right(){
        let newarr = [[],[],[],[]];
        for (let i = 0; i < this.clearZero.length; i++) {
            let grouping = [];
            let j = this.clearZero[i].length - 1;
            //將重復(fù)的 分到一組
            while (j >= 0) {
                if (this.clearZero[i][j] == this.clearZero[i][j - 1]) {
                    grouping.unshift([this.clearZero[i][j], this.clearZero[i][j - 1]]);
                    j -= 2;
                } else {
                    grouping.unshift(this.clearZero[i][j]);
                    j--;
                }
            }
            //將重復(fù)的進(jìn)行計(jì)算
            newarr[i] = Deduplication(grouping);

        }
        return newarr;
    }


}

相加

export default function Deduplication (grouping){//將相鄰且相同的數(shù)字相加
    for (let i = 0; i < grouping.length; i++) {
        if (typeof grouping[i] == "object") {
    
            grouping[i] = grouping[i][0] + grouping[i][1];
        }
    }
    return grouping;
}
添加占位用的零
export default function AddZero (newarr,w){//加零
    for (let i = 0; i < newarr.length; i++) {
        while (newarr[i].length != 4) {
            if(w == "l"){
                newarr[i].push(0);
            }else if(w == "r"){

                newarr[i].unshift(0);
            }
        }
    }
    return newarr;
}
上下的處理

將 Y 軸的處理轉(zhuǎn)換成 X 軸的處理

export default function turn(arr) {//將數(shù)組轉(zhuǎn)一下
    let clearZero = [[],[],[],[]];
    for (let i = 0; i < 4; i++) {
        for (let j = 0; j < 4; j++) {
            clearZero[i][j] = arr[j][i]
        }
    }
    return clearZero;
}

等處理完成后再調(diào)用上邊的函數(shù),將 X 軸的處理結(jié)果轉(zhuǎn)換回 Y 軸的表現(xiàn)方式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101085.html

相關(guān)文章

  • [ 邏輯鍛煉] JavaScript 一個(gè)游戲 ——2048 (詳解

    前言 這次使用了 vue 來(lái)編寫 2048,主要目的是溫習(xí)一下 vue。 但是好像沒有用到太多 vue 的東西,==! 估計(jì)可能習(xí)慣了不用框架吧 之前由于時(shí)間關(guān)系沒有對(duì)實(shí)現(xiàn)過(guò)程詳細(xì)講解,本次會(huì)詳細(xì)講解下比較繞的函數(shù) 由于篇幅問(wèn)題簡(jiǎn)單的函數(shù)就不做詳解了 代碼地址: https://github.com/yhtx1997/S... 實(shí)現(xiàn)功能 數(shù)字合并 當(dāng)前總分計(jì)算 沒有可移動(dòng)的數(shù)字時(shí)不進(jìn)行任何...

    gxyz 評(píng)論0 收藏0
  • 前端特效【第04期】|果汁混合效果-下

    摘要:往期回顧在上一期的前端特效里,我們已經(jīng)把果汁混合的效果里面的圓形菜單做好了,如果你錯(cuò)過(guò)了上篇文章今天我們要討論的是杯子里面的液體生成問(wèn)題先來(lái)回顧下咱們的果汁混合效果吧果汁混合效果,掃描下方二維碼就看到啦我們接著上期的內(nèi)容來(lái)繼續(xù)往下講吧,本期 往期回顧 在上一期的【前端特效】?里,我們已經(jīng)把果汁混合的效果里面的圓形菜單做好了,如果你錯(cuò)過(guò)了上篇文章今天我們要討論的是杯子里面的液體生成問(wèn)題 ...

    宋華 評(píng)論0 收藏0
  • 曾探:愛JavaScript再多,它也只是生活的一部分

    摘要:拿足球比賽的例子來(lái)說(shuō),我們的目標(biāo)只是進(jìn)球,下底傳中這種模式僅僅是達(dá)到進(jìn)球目標(biāo)的一種手段。但在這種動(dòng)態(tài)解釋型語(yǔ)言中,給對(duì)象動(dòng)態(tài)添加職責(zé)是再簡(jiǎn)單不過(guò)的事情。這就造成了語(yǔ)言的裝飾者模式不再關(guān)注于給對(duì)象動(dòng)態(tài)添加職責(zé),而是關(guān)注于給函數(shù)動(dòng)態(tài)添加職責(zé)。 非商業(yè)轉(zhuǎn)載請(qǐng)注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/199456 曾探...

    cyqian 評(píng)論0 收藏0
  • 微信應(yīng)號(hào)(小程序)資源匯總(1010更新)

    摘要:微信應(yīng)用號(hào)小程序資源匯總。每天不定期整理和收集微信小程序相關(guān)資源,方便查閱和學(xué)習(xí),歡迎大家提交新的資源,完善和補(bǔ)充。 wechat-weapp-resource 微信應(yīng)用號(hào)(小程序)資源匯總。 每天不定期整理和收集微信小程序相關(guān)資源,方便查閱和學(xué)習(xí),歡迎大家提交新的資源,完善和補(bǔ)充。 showImg(https://segmentfault.com/img/remote/1460000...

    趙春朋 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

lidashuang

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<