麻將排序算法分享

【原創(chuàng)博文专酗,轉載請注明出處尤蛮!】
在分析麻將的排序算法之前我們先大致了解一下麻將玩法中的一些專業(yè)名詞以及其國際化代稱??疏叨。麻將的專有詞匯表。
有了上面這些詞匯基礎降淮,我們開始今天的分享主題----->麻將排序。我將會從兩個方面入手:

①:全部桌牌的排序(例如一副麻將144張牌按規(guī)則排序)搏讶。
②:玩家的手牌排序佳鳖。

首先說明的是①相對②要容易很多,我們先分析①窍蓝。

不同地方的玩法腋颠,實際需要的總牌數(shù)不一樣,我們暫且按144張這種吓笙,反正大同小異淑玫,對我們的算法思路沒有影響。所謂的“規(guī)則”面睛,無非就是先將麻將按照牌的大類(也就是“花色”)排序絮蒿,例如“萬牌”、“條牌”叁鉴、“筒牌”土涝、“箭牌”......,從玩法的專業(yè)詞匯中幌墓,我們知道一副麻將有下面7大類牌:
1. 'CHARACTER',(萬牌)
2. 'BAMBOO',(條牌)
3. 'DOT',(筒牌)
4. 'WIND',(東南西北風牌)
5. 'DRAGON',(紅 發(fā) 白板)
6. 'FLOWER',(梅蘭竹菊)
7. 'SEASON',(春夏秋冬)
大類排序好以后再對大類里面的牌按照一定順序排序(如萬字牌按 “一萬”但壮、“二萬”......“九萬”)。接下來我們就開始對整副牌排序啦常侣,完成開頭提到的任務①蜡饵。

Step One:

將大類規(guī)則按順序存入數(shù)組_defaultRules中??:

_defaultRules : [
                'CHARACTER',
                'BAMBOO',
                'DOT',
                'WIND',
                'DRAGON',
                'FLOWER',
                'SEASON',
            ],
Step Two:

小類所有的牌按順序存入小類數(shù)組管理器中,提供getDot()胳施、 getCharacter()溯祸、getBamboo()、getWind()、getDragon()焦辅、 getSeason()博杖、 getFlower()七個API。

        getDot(){
            var arr = [
                'DOT_1',
                'DOT_2',
                'DOT_3',
                'DOT_4',
                'DOT_5',
                'DOT_6',
                'DOT_7',
                'DOT_8',
                'DOT_9'
            ];
            return arr;
        },

        getCharacter(){
......
        },

        getBamboo(){
......
        },

        getWind(){
......
        },

        getDragon(){
          ......
        },

 getSeason(){
            var arr = [
                'SEASON_SPRING',
                'SEASON_SUMMER',
                'SEASON_AUTUMN',
                'SEASON_WINTER'
            ];
            return arr;
        },

        getFlower(){
            var arr = [
                'FLOWER_PLUM',
                'FLOWER_ORCHID',
                'FLOWER_BAMBOO',
                'FLOWER_CHRYSANTHEMUM'
            ];
            return arr;
        },

完成上面??操作后筷登,我們聲明定義一個空數(shù)組_allMjWithRule :[]剃根,然后將上面七個API的結果依次存入_allMjWithRule中,嗯仆抵,這樣一副牌(共有42種不同的牌)就按照_defaultRules中的規(guī)則依次盛放在_allMjWithRule數(shù)組中跟继。[具體實現(xiàn)如下所示??]

/**
         * 
         * @param {排序規(guī)則的數(shù)組} ruleArr 
         */
        getAllMjWithRules(ruleArr = this._defaultRules){

            this._allMjWithRule = [];

            if (ruleArr instanceof Array) {
               
                ruleArr.forEach(element => {
                    switch (element) {
                        case 'CHARACTER':{
                            this.getCharacter().forEach(element => {
                                this._allMjWithRule.push(element);
                            });
                        }
                            break;

                        case 'BAMBOO':{
                           
                            this.getBamboo().forEach(element => {
                                this._allMjWithRule.push(element);
                            });
                        }
                            break;

                        case 'DOT':{
                           
                            this.getDot().forEach(element => {
                                this._allMjWithRule.push(element);
                            });
                        }
                            break;

                        case 'WIND':{
                          
                            this.getWind().forEach(element => {
                                this._allMjWithRule.push(element);
                            });
                        }
                            break;

                        case 'DRAGON':{
                        
                            this.getDragon().forEach(element => {
                                this._allMjWithRule.push(element);
                            });
                        }
                            break;

                        case 'FLOWER':{
                          
                            this.getFlower().forEach(element => {
                                this._allMjWithRule.push(element);
                            });
                        }
                             break;

                        case 'SEASON':{
                           
                            this.getSeason().forEach(element => {
                                this._allMjWithRule.push(element);
                            });
                        }
                            break;

                        default:
                            break;
                    }

                });

                return this._allMjWithRule;

            }else{
                console.log('傳入的排序規(guī)則錯誤');
                return;
            }
            
        },

排好序的牌結果如下??:

Simulator: JS: CHARACTER_1,CHARACTER_2,CHARACTER_3,CHARACTER_4,CHARACTER_5,CHARACTER_6,CHARACTER_7,CHARACTER_8,CHARACTER_9,BAMBOO_1,BAMBOO_2,BAMBOO_3,BAMBOO_4,BAMBOO_5,BAMBOO_6,BAMBOO_7,BAMBOO_8,BAMBOO_9,DOT_1,DOT_2,DOT_3,DOT_4,DOT_5,DOT_6,DOT_7,DOT_8,DOT_9,WIND_EAST,WIND_SOUTH,WIND_WEST,WIND_NORTH,DRAGON_RED,DRAGON_GREEN,DRAGON_WHITE,FLOWER_PLUM,FLOWER_ORCHID,FLOWER_BAMBOO,FLOWER_CHRYSANTHEMUM,SEASON_SPRING,SEASON_SUMMER,SEASON_AUTUMN,SEASON_WINTER

嗯,上面??講到任務①不難镣丑。簡單地組裝一下就好了舔糖,畢竟是一副完整的牌嘛,每張牌都在莺匠,對號入座罷了金吗。但是針對任務②如何處理呢?一般手牌視麻將玩法而定趣竣,我所知道的“沈家門”和“定阂∶恚”的手牌有14張,那么可能是“ BAMBOO_9”遥缕、“ BAMBOO_5”卫袒、“ DOT_8”、“ CHARACTER_4”单匣、“ BAMBOO_1”夕凝、“ WIND_WEST”、“ DRAGON_RED”...可以有重復的牌户秤,并且某些大類的牌可能沒有码秉,即便有的話也不連貫??,是吧鸡号,怎么排序呢转砖??鲸伴?
其實我們任務①所做的工作也是為任務②做鋪墊的府蔗!任務①我們已經(jīng)將所有的牌排好序了,這樣我們知道“ BAMBOO_9”汞窗、“ BAMBOO_5”姓赤、“ DOT_8”、“ CHARACTER_4”杉辙、“ BAMBOO_1”模捂、“ WIND_WEST”、“ DRAGON_RED”...這些毫無規(guī)律的牌蜘矢,每一張在_allMjWithRule中的位置了吧狂男?那簡單了,我們將手牌依次去_allMjWithRule數(shù)組中映射出自己的位置并設置為自己的localId品腹,代碼如下所示:tempModelArr指的是自己的手牌對象(如:name岖食、serverId、LocalId…)數(shù)組舞吭,

 tempModelArr.forEach(element => {
                
                for (const key in this._allMjWithRule) {
    
                    //如果未排序的手牌與已經(jīng)排好序的全部牌相同泡垃,則設置未排序手牌的本地id(這個id后面重新設置)
                    if (element.name === this._allMjWithRule[key]) {
                        element.localId = key;
                    }
                }
            });

這樣,我們將映射完成后的手牌對象放入一個數(shù)組中羡鸥,根據(jù)localId的大小進行排序蔑穴,嘿嘿惧浴,是不是就完成了存和?

tempModelArr.sort(function(a,b){
                return a.localId - b.localId;
            });

上面就是我最近在游戲開發(fā)中處理的麻將排序算法的分享。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末衷旅,一起剝皮案震驚了整個濱河市捐腿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柿顶,老刑警劉巖茄袖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘁锯,居然都是意外死亡宪祥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門猪钮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來品山,“玉大人,你說我怎么就攤上這事烤低≈饨唬” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵扑馁,是天一觀的道長涯呻。 經(jīng)常有香客問我,道長腻要,這世上最難降的妖魔是什么复罐? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮雄家,結果婚禮上效诅,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好乱投,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布咽笼。 她就那樣靜靜地躺著,像睡著了一般戚炫。 火紅的嫁衣襯著肌膚如雪剑刑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天双肤,我揣著相機與錄音施掏,去河邊找鬼。 笑死茅糜,一個胖子當著我的面吹牛七芭,可吹牛的內容都是我干的。 我是一名探鬼主播蔑赘,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼抖苦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了米死?” 一聲冷哼從身側響起锌历,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峦筒,沒想到半個月后究西,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡物喷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年卤材,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峦失。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡扇丛,死狀恐怖,靈堂內的尸體忽然破棺而出尉辑,到底是詐尸還是另有隱情帆精,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布隧魄,位于F島的核電站卓练,受9級特大地震影響,放射性物質發(fā)生泄漏购啄。R本人自食惡果不足惜襟企,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狮含。 院中可真熱鬧顽悼,春花似錦曼振、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至府蛇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屿愚,已是汗流浹背汇跨。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妆距,地道東北人穷遂。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像娱据,于是被迫代替她去往敵國和親蚪黑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容

  • 冒泡排序 冒泡排序相對來說是較為簡單的一種排序中剩,它的思想就是在每一次循環(huán)中比較相鄰的兩個數(shù)忌穿,通過交換的方式,將最小...
    陌上疏影涼閱讀 588評論 0 3
  • 概述:排序有內部排序和外部排序结啼,內部排序是數(shù)據(jù)記錄在內存中進行排序掠剑,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評論 0 15
  • 概述 排序有內部排序和外部排序郊愧,內部排序是數(shù)據(jù)記錄在內存中進行排序朴译,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,191評論 0 52
  • 概述 排序有內部排序和外部排序属铁,內部排序是數(shù)據(jù)記錄在內存中進行排序眠寿,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    閑云清煙閱讀 758評論 0 6
  • 故事發(fā)生在今天的早餐時,餐桌旁例嘱。 早餐坟乾,媽媽準備了水果盤,切了豆愛吃的西瓜蝶防、哈密瓜和紅棗甚侣。 豆吃得有滋有味,一邊用...
    鄔子閱讀 265評論 0 1