摘要 : 麻将游戏软件的开发 , 就其内核部分 , 大致可以分为自动发牌、自动智能出牌、吃碰杠的处理、听牌判断、胡牌判断、基于不同麻

将玩法规则的番数计算等几大部分。其中以自动智能出牌、听牌判断、胡牌判断等处理最为复杂。这里主要介绍胡牌时 , 手中成牌牌型的

计算机处理的算法设计思想。

关键词 : AI; 成牌牌型 ; VB6.0

中图分类号 : TP 311

文献标识码 : A

文章编号 : 1009- 3044(2007)11- 21292- 01

1 引言

麻将的胡牌 , 一般接触过麻将的人都知道。但牌型复杂时 , 究

竟胡哪几张牌 , 可能并不是每一个人短时间内都能作出正确的判

断。用计算机来处理 , 也相当复杂。个人手中虽然只有 13 张牌 ( 针

对 13 张牌的玩法 ) , 但因牌局变化无常 , 从概率论的角度来看 , 一

个人两次拿到同样牌局的概率非常之低。可见此问题的复杂且无

规律 , 那计算机能解决吗 ? 答案是肯定的。哪如何解决 ? 又该从哪

儿开始着手呢 ?

麻将的牌局虽然复杂且变化无常 , 但构成手中的 13 张牌也

就只有两类 : 数牌(1)、字牌(2)。

胡牌的牌型 , 也只可能是由此 2 类中的 1- 2 类组成 , 并且 , 其

每一类必须是成牌牌型(3)。如此理解后可知 , 要分析胡牌 , 首先要

分析最基本的单类牌的成牌牌型。根据麻将的胡牌机理 , 数牌与

字牌是属不同的类型 , 它们的成牌牌型分析要分别处理。

2 数牌的成牌牌型分析

数牌中虽包括“条”、“筒”、“万”, 但同属一类 , 对它们的成牌

牌型分析方法是一样的 , 下面以“条”为例来分析。

(9)12 张牌的成牌牌型有 : 可 分 解 成 [3]和 [9]、[6]和 [6]组 合 等 ,

具体分析略。

3 数牌成牌牌型的计算机分析处理

计算机分析处理问题时 , 关系到数据结构的知识。在此便是

麻将在计算机中的存储形式 , 分两类 : 一是便于程序处理的具体

代表单张麻将的符号 , 如用 Mi( i=1,2,…,9) 代表“条”1 到 9; 二是便

于软件界面显示的具体单张麻将图形。这里只说程序的内在处

理 , 对于“条”, 这里采取的是常见的数组 , 用 cardm(14)来存储 , 其

中 , 前 13 位存放手中可能有的“条”牌 , 第 14 位用于存放统计得

到的手中“条”的总张数。如表(1)所示。

表 1

对于“条”数目为 2、3、5、6、8、9、11、12 的成牌牌型分析 , 则分

别构造函数来处理。下面以“条”数目为 2、3、5 处理算法为例来分

析 , 其它略。开发工具采用 VB6.0。

3.1 两张牌的成牌牌型分析

对于“条”而言 , 任何一次胡牌时 , 手中条的数量只能是 : 0、2、

Function SCard2 (card ())

' 形 参 数 组 card ()用 于 接 收 cardm

3、5、6、8、9、11、12、14 中的任一数目 , 其它数目的“条”均不能构成

成牌牌型。所以对于“条”的成牌牌型分析 , 只限于数目为 2、3、5、

6、8、9、11、12 的分析 , 至于数目是 14 时 , 这里不作分析 , 因手中只

有 13 张牌 , 13 张牌是听牌牌型 , 要听的牌便是第 14 张牌 ( 自摸的

或别人出的牌 ) 。另这里分析的成牌牌型是分析听牌牌型的基础。

(1)1 张牌的牌型 , A 型 , 用[1]表示。

(2)2 张牌的成牌牌型 , 只能是 AA(4)型 , 用 [2]表 示 , 定 为 基 本

成牌牌型。

(3)3 张牌的成牌牌型 , 只能是 AAA(4)或 ABC(4)型 , 用[3]表示 ,

也定为基本成牌牌型。

(4)5 张 牌 的 成 牌 牌 型 有 : AAABB、AABBB、AAABC、AABCD、

ABCCC、ABCDD 等可以分解成[2][3]或[3][2]基本成牌牌型的组合 ;

还有如 ABBBC 不能分解成基本成牌牌型的牌型 , 称之为特殊成

牌牌型。

(14)传来的值

x21 = Right(card(1),1): x22 = Right(card(2),1)

If x21 = x22 Then ' AA 成牌牌型

temp = 1

End If

scard2 = temp

End Function

3.2 三张牌的成牌牌型牌型分析

Function SCard3(card())

x31 = Val(Right(card(1),1)): x32 = Val(Right(card(2),1)): x33 =

Val(Right(card(3),1))

If x31 = x32 And Then

temp = 1 ' AAA 成牌牌型

End If

(5)

6 张 牌 的 成 牌 牌 型 有 : AAABBB、ABCCDE、ABCDEF、

If x33 - x32 = 1 And x32 = x33 = 1 Then

AAAABC 等可以分解成[3][3] 的基本成牌牌型 ; 还有如 ABBCCD、

AABBCC、ABBBBC 的特殊成牌牌型。

(6)8 张牌的成牌牌型有 : 可分解成[2]和[6]、[3]和 [5]、[2]和两个

[3]组合等 , 具体分析略。

(7)9 张牌的成牌牌型有 : 可分解成[3]和[6]、三个[3]组合等 , 具

体分析略。

(8)11 张牌的成牌牌型有 : 可分解 成 [2]和 [9]、[3]和 [8]组 合 等 ,

具体分析略。

temp = 1 ' ABC 成牌牌型

End If

scard3 = temp

End Function

3.3 5 张牌的成牌牌型牌型分析

Function SCard5(card())

……

cd51 = scard2(card51) ' 数组 card51()内存放 5 张条中前 2 张

begin

if(clk' event and clk=' 1' )then

if(ml="100")then

ml<="000";clockml<=not clockml;

else ml<=ml+1;

end if;

cp<=clockml;

end if;

end process;

u1:decoder port map(data_in,countz,countzz,data,csad,csd);

u2:datachange port map(cp,data,data_out,countz,countzz);

address_out<=countzz;

end pcm_arc;

4 结束语

PCM 采 编 器 的 仿 真 波 形 如 图 2 所 示 , 系 统 输 入 为 clk、da-

ta_in, 输出为 data_out、address_out、csd、csad, 由图 2 可以看出 , 系

(上接第 1292 页)

cd52 = scard3(card52)' 数组 card52()内存放 5 张条中后 3 张

If cd51 = 1 And cd52 = 1 Then  ' [2][3]组合成牌牌型分析

temp = 1

End If

'  [1][3][1]特殊成牌牌型 ABBBC

If (x51 - x52 = - 1) And (x52 = x53) And (x53 = x54) And (x54

- x55 = - 1) Then

temp = 1

End If

scard5 = temp

End Function

在上面的分析中 , 对于基本成牌牌型如[2]、[3], 构造函数来判

断 , 是成牌牌型返回 1 值 ; 当牌的张数大于等于 5 时 , 对可以分解

成成牌牌型组合的 , 可直接调用已分析得到的函数来判断 ; 对于

如 ABBBC 等特殊成牌牌型 , 目前采用枚举法。但这里的枚举 , 不

是一一列举 , 而是针对特殊成牌牌型的某一类列举。在上面(3)中

对 ABBBC 一类特殊成牌牌型的分析 , 就可用于处理 : 筒 23334、万

78889 等同属这一类的。

4 字牌的成牌牌型分析

字牌的成牌牌型分析有两种方法 : 一是考虑具体的“字”是什

么字 , 分东、南、西、北等。二是依此类牌的特殊性 , 只需考虑是否

是同字便可知道其是否构成成牌牌型。所以采用方法二 , 可使之

较数牌的成牌牌型分析更简单。这里不再具体分析。

5 字牌成牌牌型的计算机分析处理

对字牌成牌牌型的计算机分析处理 , 下面只对 2、3 张字牌的

成牌牌型判断算法作简要说明 , 其它多张牌时的判断分析 , 同前

面数牌的成牌牌型的计算机分析处理类似。不再赘述。

5.1 判断 2 张字牌是否构成成牌牌型

Function SCardZ2(grdx)

If z2(grdx) = 1 Then

temp = 1

End If

scardz2 = temp

End Function

5.2 判断 3 张字牌是否构成成牌牌型

Function SCardZ3(grdx)

If z3(grdx) = 1 Then

temp = 1

End If

scardz3 = temp

End Function

其中函数 z2()、z3()是用来判断连续的两张、三张字牌是否同字 , 是同字返回 1 值 ; 参数 grdx 是手中某个字牌的起始位置 , 如在

图 1 中 grdx 就等于 11; 数组 grd()存放个人手中的 13 张牌。

6 总结

(1) 单类牌的成牌牌型分析处理是后期听牌、胡牌判断的基

础。如图 1 中听牌的结果显示是“条”1、4、7, 它 就 是 基 于 对 另 外

“筒”456、“万”55、“字”中中中是否构成成牌牌型判断的基础上。

(2)单类牌的成牌牌型分析 , 是按牌的张数从少到多 , 逐步分

析。这符合软件工程中“从小到大”、“从简到繁”的设计思想。另

外 , 从前面的论述中也看到了 , 当牌的张数大于等于 5 时 , 其分析

中直接调用了之前已分析出的结果。这既实现了代码重用 , 提高

了编程的效率 , 又降低了牌数多时的分析难度。

(3)关于重复分析问题。如对 9 张“条”的处理可用 3 个[3]、[3]

与[6] 的两种组合来分析。对“条”111123456 的处理用上述两种组

合分析都可以。如果两种组合都用来分析 , 就出现了重复分析 ; 对

“条 ”123455667、122334777 的 处 理 则 只 能 用 [3]与 [6]的 组 合 来 分

析。实际分析时究竟采取哪中组合呢 ? 处理办法 , 采取更进一步的

细化分析。实际上 , 如果 9 张“条”构成成牌牌型 , 那么其头或尾 3

张牌必是成牌牌型[3]。所以对 9 张“条”是否构成成牌牌型的判断

处理 , 可以只用 [3]与 [6] 的组合来分析 , 这样就能避免重复 分 析 ,

从而提高程序的运行效率。但个别的情况下 , 有限的重复目前还

没有找到更好的解决方法。

图 1

注释 : (1)数牌 : 指条、筒、万。(2)字牌 : 指东、南、西、北、中、发、

白。(3)成牌牌型 : 指构成胡牌时的基本牌姿 , 如胡牌时手中有 2 张

条 , 则此 2 张条只能是条 AA, 那 么 条 AA 就 称 之 为 成 牌 牌 型 ; 如

胡牌时手中有 3 张条 , 则此 3 张条只能是条 AAA 或条 ABC, 那么

条 AAA、条 ABC 就称之为成牌牌型。 (4)牌型说明 : ①AA: 是指两

张同样的牌 , 如条 11、筒 22、万 33、字东东等。②AAA: 是指三张同

样的牌 , 如条 111、筒 222、万 333、字东东东等。③ABC: 是指三张

连续的牌 , 如条 123、筒 234、万 345 等。

参考文献 :

[1] 傅清详 , 王小东 , 等 . 算法与数据结构 [M]. 电子工业出版

社, 2006.12.

[2] 杨 文 龙 , 古 天 龙 , 等 . 软 件 工 程 [M]. 电 子 工 业 出 版 社 ,

2006.12.

[3] 齐锋, 等. Visual Basic 6.x 程序设计[M]. 中国铁道出版社 ,

2002.9.

转载于:https://www.cnblogs.com/tuanzang/archive/2013/02/27/2935820.html

吴昊品游戏核心算法 Round 8(特别篇) —— 吴昊教你打麻将(牌型分析AI)相关推荐

  1. 吴昊品游戏核心算法(新年特别篇)——另类取石子游戏(斐波那契博弈)

    吴昊继续,我再也不想搬一堆石头放在这里了,取而代之的是<编程之美>中的关于游戏章节的一个插图,这本书中也有对<取石子游戏>的较为完备的讨论. 这次的游戏是神马? 1堆石子有n个 ...

  2. 吴昊品游戏核心算法 Round 16 ——吴昊教你玩口袋妖怪 第三弹 地洞谜题

    这样的场景我们应该经常遇到的吧,哈哈! 口袋妖怪的地洞要算是最令人讨厌的了,因为,有些地洞是全黑的,你即使用了闪光灯(必选道具#03),你有时也只能用GBA外壳的荧光屏作为道具才能将整个地洞看清楚. ...

  3. 吴昊品游戏核心算法 Round 17 —— 吴昊教你玩拼图游戏 序

    如图所示,此人就是<死亡笔记>中最终击败夜神月的尼亚(当然,他在击败夜神月的过程中,利用了梅洛的一些帮助),尼亚喜欢玩各种玩具,比如乐高啊,多米诺骨牌啊等等,当然,他最喜欢的仍然是拼图.他 ...

  4. 吴昊品游戏核心算法 Round 15 —— (转载)德州扑克中的心理战

    在我的Round 15中的德州扑克的AI中,设计者曾经赋予了德州扑克一种不错的心理恐吓算法,具体地说,是如下的战术: 如果RR<0.8,那么95%选择弃牌,0%选择叫牌,5%选择加倍(这里加倍的 ...

  5. 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第四弹 拉帝亚斯?!拉帝欧斯?!...

    作为讲述口袋妖怪的Round 16,这里,我会采用"夹叙夹议,夹议夹叙"的模式进行编排.也就是在议论一些口袋妖怪中的小游戏的核心算法的同时,叙述一下我对口袋妖怪的理解以及我与这一系 ...

  6. 吴昊品游戏核心算法 Round 18 —— 吴昊教你玩Zen Puzzle Garden

    如果你认为无法因为玩一个电脑游戏而达到精神的顿悟,你可能是正确的.不过你完全可以试着解决一个禅宗花园发生的难题,从而达到静心的精神状态.   这个游戏是获得2003年独立游戏节提名的精品游戏,在注重游 ...

  7. 吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)...

    如图所示,此即为日本动漫棋魂中的千年佐为,也就是SAI.众所周知,围棋的规则相比于中国象棋,国际象棋等等都简单许多,真是因为更简单的规则,才诞生 了更复杂的逻辑.目前的围棋AI还很不行,最NB的应该是 ...

  8. 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第九弹 冰系道馆

    道馆之战!!!这一次,道馆由电系变为了冰系,和龙系的道馆不一样,冰系的道馆有冰系的规定.如图所示,一共有三层,上面一层总是比下面一层要复杂一些.在冰系道馆中,有如下的两个规则:(1)我们不会在冰面上划 ...

  9. 吴昊品游戏核心算法 Round 9 —— 正统黑白棋AI(博弈树)

    黑白棋程式简史 在1980年代,电脑并不普及,在黑白棋界里,最强的仍然是棋手(人类). 到了1990年代初,电脑的速度以几何级数增长,写出来的黑白棋程式虽然仍然有点笨拙,但由于计算深度(电脑的速度快) ...

  10. 吴昊品游戏核心算法 Round 5 ——(转载)关于无禁手下先手必胜的证明

    关于五子棋先手必胜的证明,用人工的方式过于复杂,其难度相当于证明四色定理的正确性或者是若儿当定理的正确性.但是,如果采用计算机来解决,则复杂程度 会降低许多.由于很难地毯式地枚举到所有可能的情形,这一 ...

最新文章

  1. pycharm第一个Python程序
  2. 一种JPG/PNG在线转EPS/PDF的方法
  3. java.awt.headless 模式(Linux, java.awt.headless and the DISPLAY environment variable)
  4. 计算机单片机英语书籍推荐,英语翻译近十几年来,单片机作为微计算机一个很重要的分支,应用广泛,发展迅速,已经对人类社会产生了深远的影响.本文介绍了基...
  5. 使用GUID作为数据库主键与INT作为主键的性能测试
  6. python configparser 空格_python的ConfigParser模块
  7. Unity实现物体生命值跟踪的方法
  8. POJ 3125 Printer Queue(队列,水题)
  9. 非参数统计的Python实现—— HL 检验
  10. Win11软件兼容性怎么样?
  11. stata中安装meta分析模块
  12. 各省农村人均受教育年限及村委会个数(2011-2019年)
  13. 身份证归属地数据包下载
  14. WPS怎么设置显示文章目录
  15. 论文翻译五:A New Method of Automatic Modulation Recognition Based on Dimension Reduction
  16. 微信授权二维码样式修改
  17. nvivo是什么,为什么要学习nvivo,如何学?
  18. 谷歌seo关键词怎么做?Google如何优化关键词
  19. 信息技术学考 这题不会做!!
  20. 友点 CMS V9.1 后台登录绕过 GetShell

热门文章

  1. 设为主页代码及添加到收藏夹代码大全
  2. 网络的高可用性(一)
  3. 怎么删除计算机多余的启动项,怎么删除Win7多余的开机启动项
  4. 计算机定时关机教程,Win7系统电脑设置定时关机和取消定时关机的教程
  5. 【20CSPS提高组】函数调用
  6. 一步一步理解CPU芯片漏洞:Meltdown与Spectre
  7. python爬取 东方财富/天天基金网 基金排行数据
  8. 发起一款国产开源CRM系统,有想共同参与的进来哈,己发出SVN库
  9. a标签使用方法和跳转方式
  10. 模仿apple中国大陆官方