吴昊品游戏核心算法 Round 8(特别篇) —— 吴昊教你打麻将(牌型分析AI)
摘要 : 麻将游戏软件的开发 , 就其内核部分 , 大致可以分为自动发牌、自动智能出牌、吃碰杠的处理、听牌判断、胡牌判断、基于不同麻
将玩法规则的番数计算等几大部分。其中以自动智能出牌、听牌判断、胡牌判断等处理最为复杂。这里主要介绍胡牌时 , 手中成牌牌型的
计算机处理的算法设计思想。
关键词 : 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堆石子有n个 ...
- 吴昊品游戏核心算法 Round 16 ——吴昊教你玩口袋妖怪 第三弹 地洞谜题
这样的场景我们应该经常遇到的吧,哈哈! 口袋妖怪的地洞要算是最令人讨厌的了,因为,有些地洞是全黑的,你即使用了闪光灯(必选道具#03),你有时也只能用GBA外壳的荧光屏作为道具才能将整个地洞看清楚. ...
- 吴昊品游戏核心算法 Round 17 —— 吴昊教你玩拼图游戏 序
如图所示,此人就是<死亡笔记>中最终击败夜神月的尼亚(当然,他在击败夜神月的过程中,利用了梅洛的一些帮助),尼亚喜欢玩各种玩具,比如乐高啊,多米诺骨牌啊等等,当然,他最喜欢的仍然是拼图.他 ...
- 吴昊品游戏核心算法 Round 15 —— (转载)德州扑克中的心理战
在我的Round 15中的德州扑克的AI中,设计者曾经赋予了德州扑克一种不错的心理恐吓算法,具体地说,是如下的战术: 如果RR<0.8,那么95%选择弃牌,0%选择叫牌,5%选择加倍(这里加倍的 ...
- 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第四弹 拉帝亚斯?!拉帝欧斯?!...
作为讲述口袋妖怪的Round 16,这里,我会采用"夹叙夹议,夹议夹叙"的模式进行编排.也就是在议论一些口袋妖怪中的小游戏的核心算法的同时,叙述一下我对口袋妖怪的理解以及我与这一系 ...
- 吴昊品游戏核心算法 Round 18 —— 吴昊教你玩Zen Puzzle Garden
如果你认为无法因为玩一个电脑游戏而达到精神的顿悟,你可能是正确的.不过你完全可以试着解决一个禅宗花园发生的难题,从而达到静心的精神状态. 这个游戏是获得2003年独立游戏节提名的精品游戏,在注重游 ...
- 吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)...
如图所示,此即为日本动漫棋魂中的千年佐为,也就是SAI.众所周知,围棋的规则相比于中国象棋,国际象棋等等都简单许多,真是因为更简单的规则,才诞生 了更复杂的逻辑.目前的围棋AI还很不行,最NB的应该是 ...
- 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第九弹 冰系道馆
道馆之战!!!这一次,道馆由电系变为了冰系,和龙系的道馆不一样,冰系的道馆有冰系的规定.如图所示,一共有三层,上面一层总是比下面一层要复杂一些.在冰系道馆中,有如下的两个规则:(1)我们不会在冰面上划 ...
- 吴昊品游戏核心算法 Round 9 —— 正统黑白棋AI(博弈树)
黑白棋程式简史 在1980年代,电脑并不普及,在黑白棋界里,最强的仍然是棋手(人类). 到了1990年代初,电脑的速度以几何级数增长,写出来的黑白棋程式虽然仍然有点笨拙,但由于计算深度(电脑的速度快) ...
- 吴昊品游戏核心算法 Round 5 ——(转载)关于无禁手下先手必胜的证明
关于五子棋先手必胜的证明,用人工的方式过于复杂,其难度相当于证明四色定理的正确性或者是若儿当定理的正确性.但是,如果采用计算机来解决,则复杂程度 会降低许多.由于很难地毯式地枚举到所有可能的情形,这一 ...
最新文章
- pycharm第一个Python程序
- 一种JPG/PNG在线转EPS/PDF的方法
- java.awt.headless 模式(Linux, java.awt.headless and the DISPLAY environment variable)
- 计算机单片机英语书籍推荐,英语翻译近十几年来,单片机作为微计算机一个很重要的分支,应用广泛,发展迅速,已经对人类社会产生了深远的影响.本文介绍了基...
- 使用GUID作为数据库主键与INT作为主键的性能测试
- python configparser 空格_python的ConfigParser模块
- Unity实现物体生命值跟踪的方法
- POJ 3125 Printer Queue(队列,水题)
- 非参数统计的Python实现—— HL 检验
- Win11软件兼容性怎么样?
- stata中安装meta分析模块
- 各省农村人均受教育年限及村委会个数(2011-2019年)
- 身份证归属地数据包下载
- WPS怎么设置显示文章目录
- 论文翻译五:A New Method of Automatic Modulation Recognition Based on Dimension Reduction
- 微信授权二维码样式修改
- nvivo是什么,为什么要学习nvivo,如何学?
- 谷歌seo关键词怎么做?Google如何优化关键词
- 信息技术学考 这题不会做!!
- 友点 CMS V9.1 后台登录绕过 GetShell