Unity3D麻将开发的通用算法

文章转载于:http://blog.csdn.net/ichiryuu/article/details/77967065

正常的麻将胡牌方式为满足N * ABC + M *DDD +EE 的形式,及存在一个对子(EE),剩余牌均能组成顺子(ABC)或者刻子(DDD)。

很容易发现必须满足size%3 == 2的形式才可以去计算胡牌。


数据结构的选取:

麻将有万、饼、条三类各九种,另外还有东西南北中,春夏秋冬。

种类不是很多,一个字节表示就可以了,前四位代表类型,后四位代表值,东西南北中,春夏秋冬可以集中到一种类型中去。


普通麻将的计算方式:

    1.首先找出所有包含一对的情形,移除对子(注意去重),记下剩余牌的所有集合为Tn;

    2.针对每个Tn中的数组尝试移除一个顺子,成功转到2,失败到3。

    3.针对每个Tn中的数组尝试移除一个刻子(DDD),成功转到2。

    4.若当前的数组的数量变为0,则表示,当前的方案可以胡牌。

2,3,4可以作为一个check_3n(检测是否满足N * ABC + M *DDD)的函数,递归调用即可。


针对有癞子的麻将(百搭):

最简单的办法是尝试将癞子牌变为所有牌来进行尝试,不过如果手中有多张癞子牌的话计算量就相当大了,比如3张,则需要计算牌的种类的3次方次,虽然中途可以通过剪枝减少部分计算量,但还是太慢了。

针对这种情况我们可以在计算出癞子的数量,如果出现找出顺子或刻子失败,我们则可以用癞子去补,如果失败了,那么当前的方案就不通过。

    1.同样找出所有包含一对的情形,移除对子,移除的时候需要注意更新癞子的数量这里需要注意的是对子是怎么产生的:

            原有的对子

            一个癞子和一普通的组成的对子

            一对癞子

    2.针对每个数组尝试移除一个顺子,成功转到2,如果失败尝试用癞子去补,癞子也不够,转到3。

    3.针对每个数组尝试移除一个刻子(DDD),成功转到2,如果失败尝试用癞子去补,癞子也不够,当前的方案就不通过。

    4.若当前的数组的数量变为0,则表示,当前的方案可以胡牌。


算法理解之后就不难了 , 下面开始详细的阐述了.

1. 将麻将抽象为数字

  数字 {01 ~ 09} 表示  {1 ~ 9} 筒

  数字 {11 ~ 19} 表示  {1 ~ 9} 条

  数字 {21 ~ 29} 表示  {1 ~ 9} 万

  数字 {31 33 35 37 } 表示 { 东 南 西 北 }

  数字 {41 43 45} 表示 {中 發 白}

  数字10 20 30 32 34 36 40 42 44 46 空出来不代表任何麻将牌 这样设计的好处就是使得能够形成顺子的牌在用数字表示出来的时候刚好也是连着的 , 而不能够形成顺子的牌,在用数字表示的时候并不是顺子 . 便于以后使用代码进行判断

2. 算法的核心流程

  玩过麻将的都知道麻将玩家手上一般有两种牌 一种是手牌 一种是已经碰牌或者吃牌或者杠牌之后已经明了的牌 . 现在以玩家A为例 , 把牌分的细一点

  a. 玩家A的手牌  (数量1 + 3*n n < N , n < 4  )

  b. 其他玩家打出来的牌 (数量 1)

  c. 玩家A从牌面上取出来的牌 (数量 1)

  d. 玩家A吃碰杠的牌 (3*n + 4*m) 

  能否胡牌主要是看手牌a 和b/c 的组合能否形成一对加n条顺子和m条克子 . 能则能胡 反则不能.

  如上图 用数字表示为 {1,1,2,2,2,3,4,11,12,12,13,13,14,1} 前13张牌为手牌,最后一张二条为玩家A从牌面上取出的牌 


OK, 现在只需要先取出一对将,然后判断剩下的牌能否全部形成顺子或者克子,现在对牌面按照相对应的数字进行从小到大的排序 . 现在从剩余的牌中最左边的牌开始 , 如果只有一张这样的牌那么这张牌A就只能当作顺子的开头 ; 如果有两张这样的牌 , 因为已经有了一对将而这两张也不能组成克子 , 所以这两张只能当作两个顺子的开头 ; 如果有三张这样的牌 , 可以组成克子 , 但是如果让他组成顺子则要求为 AAABBBCCC 与后面的三张也能组成克子 所以组成顺子或者克子本质是相同的 但是组成克子AAA的通用性要高于组成顺子AAABBBCCC 所以当有三个及以上这样牌的时候优先组成克子AAA ; 如果有四张这样的牌,要能胡牌则需要 AAAABBBBCCCC 或者 AAAABC ,对于是先组一个顺子还是一个克子都会回到上述的情况 . 

(这里没有对七对等各类大胡作出判断)


步骤一:从上述数组中找到一对做"将",并从数组中移除 ,

这里共有4对牌所以要分成4种情况

  1. {1,1}(将牌) , {1,2,2,2,3,4,11,12,12,13,13,14}(余牌)

  2. {2,2}(将牌) , {1,1,1,2,3,4,11,12,12,13,13,14}(余牌)

  3. {12,12}(将牌) , {1,1,1,2,2,2,3,4,11,13,13,14}(余牌)

  4. {13,13}(将牌) , {1,1,1,2,2,2,3,4,11,12,12,14}(余牌)

  依次进行步骤二的检查 检查完最后一种情况而没有返回 "能胡牌" 则返回 不能胡牌

步骤二:余牌数量为0 则返回 "能胡牌" 否则进入下一步 .

步骤三:判断余牌前三张是否相同 相同-> 步骤四 ; 不同 -> 步骤五.

步骤四:移除余牌中的前三张牌 , 返回步骤二.

步骤五:若余牌中第一个数为N , 则判断是否有N + 1 与 N + 2 同时存在与余牌中 , 有将N , n+1 , n+2 从余牌中移除并返回 步骤二 , 否则返回步骤一


演示如下

  1. {1,1}(将牌) , {1,2,2,2,3,4,11,12,12,13,13,14}(余牌)

    步骤二 >> 步骤三 >> 步骤五 == {2,2,4,11,12,12,13,13,14}(余牌) >>

        步骤二 >> 步骤三 >> 步骤五 >> 步骤一

  2. {2,2}(将牌) , {1,1,1,2,3,4,11,12,12,13,13,14}(余牌)

    步骤二 >> 步骤三 >> 步骤四 ==  {2,3,4,11,12,12,13,13,14}(余牌) >> 

    步骤二 >> 步骤三 >> 步骤五 == {11,12,12,13,13,14}(余牌) >> 

    步骤二 >> 步骤三 >> 步骤五 == {12,13,14}(余牌) >> 

    步骤二 >> 步骤三 >> 步骤五 == {}(余牌) >> 

    步骤二   "能胡牌"


代码如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 18,787评论 1 19
  • 一、实验目的 学习使用 weka 中的常用分类器,完成数据分类任务。 二、实验内容 了解 weka 中 explo...
    yigoh阅读 8,418评论 5 4
  • 陪著你回家,陪著你叫爸媽,想是你在哪,家就在哪。 陪著你們用餐,我是想,你們吃得高興就好了,不枉我餐餐到點就趕緊做...
    简小易阅读 397评论 0 0
  • 2018/1/10 我的巧克力小姐 身边男孩很多,我自己希望生个女儿,没能如愿,终究成了男生宿舍的宿管员。还好,我...
    李小未520阅读 122评论 0 0
  • 只要你站在我的身边,我的眼里会看不到全世界……知道我和你不会有结果,我还是扑了火为一线可能的幸福执着。在地铁上单曲...
    浅草樱落阅读 511评论 2 0