一种麻将类游戏中胡牌的控制方法及系统与流程

文档序号:16146587发布日期:2018-12-05 16:30阅读:997来源:国知局

本发明涉及棋牌类娱乐装置技术领域,特别涉及一种麻将类游戏中胡牌的控制方法及系统。

背景技术

传统的麻将游戏一般由四位玩家在桌面上完成摸牌、出牌等动作,对于是否胡牌的判定也是玩家人为作出的判断。随着电脑及网络技术的发展,基于互联网的麻将类游戏系统随之出现,其包括服务器和多个用户终端。用户终端可以是桌面端,也可以是移动端,玩家通过联网的用户终端登录麻将游戏,由计算机自动实现发牌、胡牌等动作。

现有关于麻将胡牌判断的控制方法基本采用递归法实现,现有技术采用递归法进行胡牌判定的流程示意图参见图1。其中,关于麻将中使用的用语“顺”是指三个类型相同数字连续的牌,比如一万两万三万;“坎”是指三个类型相同且数字相同的牌,比如一万一万一万;“酱”是指一对类型相同且数字相同的牌,比如一万一万。一般来说,满足四个顺或者坎,再用一对做酱,即判断为胡牌。由图1可以看出,递归法实现流程复杂,由递归导致的内存开销和cpu消耗会随着递归深度和牌的张数而急剧提升。当多人同时在线游戏时,占据cpu和内存资源都非常可观。游戏玩家即使胡牌,但等待时间过长,甚至会出现卡死的情况,大大降低了麻将游戏的竞技性和趣味性。



技术实现要素:

本发明考虑到上述现有技术的缺点,且本发明的目的在于提供一种快速高效实现麻将胡牌的控制方法及系统,解决了现有胡牌判断方法计算繁琐,内存及cpu消耗大等问题,尤其是大量用户同时在线情况下可能出现性能瓶颈的问题。本发明大大节省了内存和cpu资源,游戏玩家可以更充分地体会游戏比赛的乐趣,而不会因等待时间过久而感到烦躁或厌倦。

为达到上述目的及其他相关目的,本发明提供如下技术方案:

一种麻将游戏中胡牌的控制方法,包括判断每个子组的胡牌张数,接着,对每一子组分别进行胡牌判定,其特征在于,构建字典,把单一子组的所有可胡的牌型编成字典,根据牌型在字典里面搜索有无对应的记录来判断是否可胡牌,根据各子组的判断结果判断整个手牌是否可胡。

作为本发明的一种优选方案,其特征在于通常胡牌字典的构建。

作为本发明的一种优选方案,其特征在于赖子胡牌字典的构建,赖子可为n个,n=1,2,3,4,5,6,7,8。

作为本发明的一种优选方案,其特征在于胡牌字典的构建,包括胡牌空间遍历,通过循环遍历整个胡牌的牌型,将牌按照有无酱牌的情况,分别确定出牌的张数和对应的胡法种数。

作为本发明的一种优选方案,其特征在于胡牌字典的构建,还包括样本过滤,对样本空间中同一张牌超过四张的样本予以剔除。

作为本发明的一种优选方案,其特征在于胡牌字典的构建,包括将样本加入字典,将符合的胡牌的牌型,与所构建字典中标识牌型的唯一值以键值对的方式加入字典。

作为本发明的一种优选方案,其特征在于构建素数组成的数组,计算样本素数积作为标识牌型的唯一值。

作为本发明的一种优选方案,其特征在于将一到九张牌定义为一个素数数组{2,3,5,7,11,13,17,19,23},将这个键值对集合整体作为一个值以及牌的张数作为一个复合键值对形成如下嵌套映射结构:

map<牌张数,map<样本素数积,样本排序后字符>>这种形式的数据结构。

作为本发明的一种优选方案,其特征在于赖子胡牌字典构建,以通常胡牌字典为基础,扣除任意n张作为赖子牌替换的牌分别构成n个复合键值对形成如下嵌套映射结构:

mapn<扣除赖子后牌张数,map<扣除赖子后样本素数积,赖子替换的牌排序后的字符串>>命名为mapn,其中n=1,2,3,4,5,6,7,8。

作为本发明的一种优选方案,其特征在于当所有四个子组都可胡牌,并有且仅有任意一子组包含酱,可判定为胡牌。

本发明还提供一种麻将胡牌的控制系统,包括处理器和存储器,存储器用于如前所述构建的字典,处理器用于执行如前所述的控制方法。

本发明还提供一种麻将游戏系统,包括服务器端和客户端,如前所述的胡牌控制系统可以加载到服务器端,或者客户端,客户端包括桌面端或者移动设备端或者手机端。

附图说明

图1为现有技术采用递归法进行胡牌判定的流程示意图。

图2为本发明的胡牌控制方法的流程示意图。

具体实施方式

下面结合附图2对本发明做进一步说明。

(实施例一)

麻将一般分为条,万,筒,字牌(东南西北,中,发,白),花牌(春夏秋冬梅兰菊竹,用作加码)等,各地玩法不一,但是一般作为手牌的,只有条,万,筒,风牌,中,发,白,而且条万筒允许顺,而其他都只能为坎(也有地方称刻,就是指三张一样的牌)。

对麻将胡牌的判定可以分解为对玩家手中最多14张牌中(吃杠碰掉的不纳入计算)条,万,筒,字牌四组牌的胡牌判定(这里暂时不考虑七对,十三幺,烂牌等特殊胡法的判定),所涉及的胡牌方式为普通胡牌的判定,即每个子组都要满足胡牌的条件,且这四个子组必须有且仅有一个子组包含一对酱牌。

麻将的胡牌控制方法一般包括:

首先,判断每个子组的胡牌张数。

胡牌时候手中牌是2,5,8,11,14张数,拆分为条,万,筒,字四组子牌(每组子牌这里称之为子组,具体为万牌、条牌、筒牌、风牌),对于其中的任意一子组的张数是有数量限制的,考虑到有无酱牌的影响,可分为两种情况:

(1)子组有酱牌的情况,每个子组的牌数只可能为0,2,5,8,11,13;

(2)子组无酱牌的情况,每个子组的牌数只可能为0,3,6,9,12。

整体的胡牌判定就变为在手牌所包含的四组子牌中,有且仅有任意一子组包含酱,且所有四个子组都可胡牌(如果该子组的牌数为零,判断为可胡)。

接着,任一子组胡牌的判定。

考虑到字牌判定有无酱牌的可胡较简单,这里先考虑条,万,筒胡牌的判定。

对于万牌、条牌、筒牌任一子组来说,有九张不同的牌(一到九),不管是否有酱牌,在牌的张数固定的情况下,所有可能的胡法也是可数的,这里简单分析如下,

(1)有酱牌的情况,张数和对应的胡法种数对应为,

2张:9种

5张:135种

8张:996种

11张:情况较复杂,计算得出是4475种

14张:情况更复杂,计算得出是13259种

(2)无酱牌的情况,张数和对应的胡法种数对应为,

3张:16种

6张:127种

9张:情况复杂些,计算得出是627种

12张:情况更复杂些,计算得出是2098种

对于字牌胡牌的判断,由于字牌一般为7张(东南西北中发白),其不存在顺的可能,所以分为有无酱牌可能的胡法分析如下,

(1)有酱牌的情况,张数和对应的胡法种数对应为,

2张:7种

5张:42种

8张:105种

11张:140种

14张:105种

(2)无酱牌的情况,张数和对应的胡法种数对应为,

3张:7种

6张:21种

9张:35种

12张:35种

综上分析,总的可胡牌种数为20000种左右的。

本发明的胡牌控制方法在于,把单一子组的所有可胡的牌型编成字典,相应胡牌判定变为根据牌型在字典里面搜索有无对应的记录。众所周知,基于纯内存的哈希集合检索速度是非常快的。采用2ghzcpu,8g内存的主流性能笔记本进行10000次检索速度在8ms以内,选用相同性能的计算机分别采用递归法和本发明的字典查找法进行10000次检索测试,后者将速度提升了10000倍。综合以上对各子组的判定结果,就可以在一个非常短的时间内获得是否胡牌的结果,避免任何多余的操作,胡牌判断的基本步骤参见图2。

以此为基础,听牌的判断和赖子胡法的算法如下:

在胡牌字典的基础之上,去掉作为赖子的牌,建立新的赖子胡牌字典,以类似的算法进行匹配。

实施例一,提供一种麻将胡牌的控制方法,具体步骤包括:

步骤s1,字典构建,具体可分为以下几种情况,

1.1、通常胡牌字典构建

1.1.1、胡牌空间遍历

将一到九的牌定义为1-9;

正常的胡牌单元有111,222,~999坎,123,234,~789顺17种不同的牌型;

酱牌有11,22~99的9种不同的牌型;

循环遍历整个胡牌的牌型,依照以下几种情况进行分类:

酱牌的情况,张数和对应的胡法种数对应如下,

2张:一重酱牌空间遍历

5张:一重酱牌空间遍历,一重胡牌单元遍历

8张:一重酱牌空间遍历,二重胡牌单元遍历

11张:一重酱牌空间遍历,三重胡牌单元遍历

14张:一重酱牌空间遍历,四重胡牌单元遍历

无酱牌的情况,张数和对应的胡法种数对应如下,

3张:一重胡牌单元遍历

6张:二重胡牌单元遍历

9张:三重胡牌单元遍历

12张:四重胡牌单元遍历

1.1.2、样本过滤

对样本空间中同一张牌超过四张的样本予以剔除,比如333,123,345,55组成的样本予以排除,因为包含5个为3的牌,这与一副麻将只有四块相同的牌是不符合的。

1.1.3、样本加入字典

为了加速和方便比对,将符合的胡牌的牌型,和根据如下素数数组计算得出的标识牌型的唯一值以键值对的方式加入字典。

将一到九张牌定义为一个素数数组{2,3,5,7,11,13,17,19,23},这样任意一个组合才能对应唯一的一个素数积。

将这个键值对集合整体作为一个值和牌的张数作为一个复合键值对形成如下嵌套映射结构:

map<牌张数,map<样本素数积,样本排序后字符>>这种形式的数据结构。

以5张牌的胡牌样本33322为例,构建一个素数组成的数组,根据标识牌的数字作为数组的下标取值相乘,3对应是素数5,2对应的素数为3,

该牌组样本排序后的字符串为22333,对应的样本素数积作为唯一值为3*3*5*5*5=1125

形成的复合键值对对应的映射结构:

map<5,map<1125,22333>>。

其中,map提供了一个更通用的元素存储方法。map集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值,键值成对出现称之为键值对。

1.1.4、性能数据

对于正常胡牌字典的构建,采用java作为编程语言时候2ghzcpu,8g内存的主流性能笔记本的情况下费时在1秒以内。

1.2、赖子胡牌字典构建

以通常胡牌字典为基础构建赖子胡牌字典,赖子可以为1个,2个……8个,最多选8个。

以4个赖子为例构建赖子胡牌字典,扣除1,2,3,4张赖子牌分别构成四个复合键值对:

map1<扣除赖子后牌张数,map<扣除赖子后样本素数积,赖子替换的牌排序后的字符串>>命名为map1

map2<扣除赖子后牌张数,map<扣除赖子后样本素数积,赖子替换的牌排序后的字符串>>命名为map2

map3<扣除赖子后牌张数,map<扣除赖子后样本素数积,赖子替换的牌排序后的字符串>>命名为map3

map4<扣除赖子后牌张数,map<扣除赖子后样本素数积,赖子替换的牌排序后的字符串>>命名为map4

分别代表匹配1,2,3,4个赖子的时候能胡牌的集合。

1.2.1、

循环遍历步骤1.1构建的胡牌样本空间

1.2.2、

对于胡牌样本空间的每个样本进行如下处理构建map1,map2,map3,map4,

1.2.2.1、map1的构建,

一重循环遍历1.2.1中样本剔除一张牌后生成的新的样本空间,并将剔除的牌作为赖子替换的牌排序后的字符串构建新的map1样本加入到map1,如果遇到相同的扣除赖子后样本素数积,则对应的赖子替换的牌排序后的字符串进行拼接作为新的字符串。

比如,胡牌样本22333,那么扣除一张牌的样本空间为2333和2233的集合。

map<扣除赖子后样本素数积,赖子替换的牌排序后的字符串>分别为

map1entry1<3*5*5*5,2>,map1entry2<3*3*5*5,3>

这会和另外的胡牌样本22233中扣除一张牌的样本空间2223和2233的集合中map1entry3<3*3*3*5,3>map1entry4<3*3*5*5,2>有重复,map中key值必须唯一,这样map1entry2和map1entry4就可以合并为mapentry4<3*3*5*5,“2,3”>,用以标识在扣除赖子样本素数积为3*3*5*5的情况下,一张赖子替换牌2和3均可胡牌,也可以认为在存在2233这样的牌型时候,可以胡2和3,所以map1数组可以作为正常胡牌时候判断听牌之用。

1.2.2.2、map2的构建,

类似1.2.2.1,只是因为要剔除两张牌,所以需要两重遍历剔除一张牌后的样本空间达到遍历扣除两张牌的目的,同时,赖子替换的牌排序后的字符串也和1.2.2.1不一样,会是以两张牌为单位,其他处理和1.2.2.1相同。

比如针对同样的样本空间22333,扣除两张牌的样本空间为333,223,233,加入到map2的样本为map2entry1<5*5*5,”22”>map2entry2<3*3*5,”33”>

map1entry<3*5*5,”23”>,这个样本会和其他的样本共享key值,所以均会被合并,这里不再一一赘述。

1.2.2.3、map3的构建,同1.2.2.2,

两重改为三重,赖子替换的牌排序后的字符串以三个为单位。

1.2.2.4、map4的构建,同1.2.2.2,

两重改为四重,赖子替换的牌排序后的字符串以四个为单位。

步骤s2,子组赖子分配,

分组赖子分配是指赖子在各子组间的分配以达到胡牌的目的。如果只玩通常麻将玩法,其中设置赖子数量为0即可。

例如,对于万22条33的子组组合的情况下,赖子编入万牌或条牌均可。

具体分为:酱牌和非酱牌的胡牌要求的张数不一样,只能有一个酱,

四个子组都可能包含酱,这里需要遍历这四种可能;

2.1、遍历四个子组包含酱的组合

2.2、确定是某个子组包含酱牌后

各子组需要额外的赖子数目是可以确定的,比如万牌子组不是酱,那么它的数量必须满足在这几个数0,3,6,9,12之间,如果他的数量是7张,那么,至少需要2张赖子才能满足胡牌可能,如果他是6张,则不需要赖子或者需要三张赖子,合计四个子组需要的赖子牌张数和已有的赖子个数进行比较,如果相等,再逐一判断每个子组在匹配对应的赖子后是否能胡牌见2.3,如果不等,有一种赖子数大于需要超过三张的情况下,也是可能的,这种情况下如果有一个子组无法胡牌,可以把多余的三个赖子分配到这个子组进行判断见2.3,满足四个子组都能胡牌的,即可判定胡牌,否则为不能胡牌。

2.3、判断某个子组是否胡牌;

先根据分配的赖子个数判断到哪里寻找对应;

如果分配的赖子数为0,根据该子组牌张数和素数积到胡牌样本空间里面查看有无对应,有,则该子组可以胡牌,无,则不能胡牌;

如果分配的赖子数为1,2,3,4,则分别根据步骤1.2中描述的map1,map2,map3,map4中查找对应数量和素数积的对应,如果有,该子组可以胡牌,如果没有,则该子组不能胡牌。步骤s3,根据步骤2.3的各子组的判断结果判断整个手牌是否可胡,只有在四个子组都能胡牌的情况下,才能判定胡牌。

实施例一还提供一种麻将胡牌的控制系统,包括处理器和存储器,存储器用于如前所述构建的字典,处理器用于执行如前所述的控制方法。

实施例一还提供一种麻将游戏系统,包括服务器端和客户端,如前所述的胡牌控制系统可以加载到服务器端,或者客户端,客户端包括桌面端或者移动设备端或者手机端。

(实施例二)

下面描述的第二实施例,可以将本发明的胡牌控制方法或系统用于中国传统的长牌类纸牌游戏,例如花牌(又名“上大人”),具体包括判断每个子组的胡牌张数,接着,对每一子组分别进行胡牌判定,其特征在于,构建字典,把单一子组的所有可胡的牌型编成字典,根据牌型在字典里面搜索有无对应的记录来判断是否可胡牌,根据各子组的判断结果判断整个手牌是否可胡如前所述构建的字典。

(实施例三)

下面描述的第三实施例,可以将本发明的胡牌控制方法或系统用于扑克类纸牌游戏,按纸牌四种花色分为四个子组,比大小可设定分值,通过构建字典,把单一子组的所有牌型编成字典,根据牌型在字典里面搜索有无对应的记录来判断是否可胜出。

上述实施例仅示例性说明本发明的原理及其效果,并非限制本发明。任何熟悉此技术的技术人员皆可在不违背本发明精神及范畴下,对上述实施例进行修饰或改变。所属领域技术人员在未脱离本发明精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1