首页 > 范文大全 > 正文

麻将游戏软件的听牌牌型分析

开篇:润墨网以专业的文秘视角,为您筛选了一篇麻将游戏软件的听牌牌型分析范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:麻将游戏软件的开发,就其内核部分,大致可以分为自动发牌、自动智能出牌、吃碰杠的处理、听牌判断、胡牌判断、基于不同麻将玩法规则的番数计算等几大部分。其中以自动智能出牌、听牌判断、胡牌判断等处理最为复杂。这里主要介绍听牌牌型的算法设计思想。

关键词:麻将游戏;听牌牌型;成牌牌型;VB6.0

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)11-2602-03

麻将的牌局虽然复杂且变化无常,但构成手中的13张牌也就只有两类:数牌⑴、字牌⑵。听牌的牌型,也只可能是由此2类中的1-2类组成,并且,其中一类或一部分必须得是成牌牌型,另一类或其一部分才能构成听牌牌型⑶。如此理解后可知,要分析听牌,首先要分析最基本的单类牌的听牌牌型。根据麻将的胡牌机理,数牌与字牌是属不同的类型,它们的听牌牌型分析要分别处理。

1 数牌的听牌牌型分析

数牌中虽包括条、筒、万牌,但同属一类,对它们的听牌牌型分析方法是一样的,下面以条为例来分析。

对于条而言,任何一次听牌时,手中条的数量只可能是:0、1、2、4、5、7、8、10、11、13中的任一数目,其它数目的条均不能构成听牌牌型。所以对于条的听牌牌型分析,只限于数目为1、2、4、5、7、8、10、11、13的分析。

1) 1张牌的听牌牌型:A型,用[1]表示,定为基本听牌牌型。

2) 2张牌的听牌牌型:只能是AA⑷、AB、AC型,用[2]表示,定为基本听牌牌型。

3) 4张牌的听牌牌型有:①ABCD、ABCF、AAAB等可分解成左或右三张是成牌牌型,听右或左[1]的,用[3]和[1]的组合表示(其中:[3]表示3张牌是成牌牌型,[1]表示1张牌是听牌牌型,称它是[3]和[1]的组合型);②AABB、AABC 、AAAB等可分解成左或右二张是成牌牌型,听右或左[2]的,称它是[2]和[2]的组合型;③ABBC型,不能用成牌牌型+基本听牌牌型[1]、[2]来分解的,称之为特殊听牌牌型。

4) 5张牌的听牌牌型有:①AAABB、AABCD等 [3]和[2]组合型;②ABBBC、ABBCC、AABCC等特殊听牌牌型。

5) 7张牌的听牌牌型有:①[2]和[5]、[3]和[4]、[5]和[2]、[6]和[1]的组合型;②AABBBCC等特殊听牌牌型。

6) 8张牌的听牌牌型有:①[6]和[2]、[3]和[5]的组合型;②AABBBCCC等特殊听牌牌型。

7) 10张牌的听牌牌型有:[2]和[8]、[3]和[7]、[6]和[4]等组合型。

8) 11张牌的听牌牌型有:[2]和[9]、[3]和[8]、[5]和[6]等组合型。

9) 13张牌的听牌牌型有:[2]和[11]、[3]和[10]、[5]和[8]等组合型。

2 数牌听牌牌型的计算机分析处理

计算机分析处理问题时,关系到数据结构的知识。在此便是麻将在计算机中的存储形式,分两类:一是便于程序处理的具体代表单张麻将的符号,如用Mi(i=1,2,……,9)代表条1到9;二是便于软件界面显示的具体单张麻将图形。这里只说程序的内在处理,对于条,这里采取的是常见的数组,用CARDm(14)来存储,其中,前13位存放手中可能有的条牌,第14位用于存放统计得到的手中条的总张数。如表1所示。

对于条数目为1、2、4、5、7、8、10、11、13的听牌牌型分析,则分别构造过程来处理。下面以条数目为2、4处理算法为例来分析,其它略。开发工具采用VB6.0。

1) 两张牌的听牌牌型分析

Public Sub Listen2(card( ))

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

If x21 = x22 Then 'AA型的听牌

Call ListenCardInsert(Left(card(2), 1) + Trim(Str(x21)))

End If

…… 'BC型的听牌分析略。

If x22 - x21 = 2 Then 'AC听B型

Call ListenCardInsert(Left(card(2), 1) + Trim(Str(x22 - 1)))

End If

End Sub

2) 四张牌的听牌牌型,这里只对ACCC型分析,其余略。

Public Sub Listen4(card())

……

If scard3( card4133 )=1 then '后3张牌构成成牌牌型,则听第1张牌

Call ListenCardInsert(A) '把第1张牌插入存放听牌的数组

End If

If scard2( card4221)=1 then'后2张牌构成成牌牌型,则听前2张牌

Call Listen2(card4222) '调用设计好听2张牌的过程Linsten2( )

End if

……

End Sub

其中:数组card4133()存放4张牌中的后3张牌,数组card4221()存放4张牌中的后2张牌,数组card4222()存放4张牌中的前2张牌。

在上面的分析中:①对于基本听牌牌型如[1]、[2],构造过程来处理,把听的牌插入专门存放听牌的数组中。②当牌的张数大于等于4时,对可以分解成成牌牌型+听牌牌型的,调用已分析出的函数和过程来处理;对ABBC等特殊听牌牌型,采用枚举法。但这里的枚举,不是一一列举,而是针对特殊听牌牌型的某一类列举。在上文对ABBC一类特殊听牌牌型的处理,也可用于分析:筒2334、万7889等等同属这一类的听牌。

3 字牌的听牌牌型分析

字牌的听牌牌型分析有两种方法:一是考虑具体的“字”是什么字,分东、南、西、北等。二是只考虑 “字”牌在手中13张牌中的具置。此类牌因其特殊性,经实践证明此方法是可行的。采用方法二,可使之较数牌的听牌牌型分析更为简单。这里不再具体分析。

4 字牌听牌牌型的计算机分析处理

对字牌听牌牌型的计算机处理,下面只对2、4张字牌的听牌牌型判断算法作说明,其余不再赘述。

1) 判断字牌中连续的两张是否相同,即是否构成成牌牌型

Sub ListenCardZ2(grdx)

If z2(grdx) = 1 Then'也可以写成If ScardZ2(grdx) = 1 then

Call ListenCardInsert(grd(grdx))

End If

End Sub

2) 判断2张字牌是否构听成牌牌型

Sub ListenCardZ4(grdx)

If ScardZ3(grdx) = 1 Then

Call ListenCardInsert(grd(grdx + 3))

End If

If ScardZ2(grdx) = 1 And ScardZ2(grdx + 2) = 1 Then

Call ListenCardInsert(grd(grdx))

Call ListenCardInsert(grd(grdx + 2))

End If

If ScardZ3(grdx + 1) = 1 Then

Call ListenCardInsert(grd(grdx))

End If

End Sub

其中:函数ScardZ3()及其参数grdx、数组grd( )的含义参看文献[4]。

5 总结

1) 单类牌的听牌牌型分析处理是胡牌的基础。处理原则:①对基本听牌牌型直接处理;②当牌数目大于等于4时,采用分解法。分解的依据是找出其中的成牌牌型,再对余下的牌进行“听”的处理;③对特殊牌型,采用枚举法。根据本游戏的设计和近一个多月来的测试,最坏的情况下,枚举的数目还没有超过3次的,如此看来此设计还是可行的。请参看图1。

2) 单类牌的听牌牌型分析过程,按软件工程中“从大到小”、“从繁到简”的设计思想。另外,从前面的论述中也看到了,当牌的张数大于等于4时,其分析中直接调用了之前已分析出的结果。这既实现了代码重用,提高了编程的效率,又降低了牌数多时的分析难度。

3) 关于重复分析涉及到的问题。①重复听的同一张牌试图再次插入听牌数组的解决办法:在过程ListenCardInsert( )中,加入检测控制,当向听牌数组中插入听的牌之前,先检测听牌数组中是否为空和是否有与要插入的牌相同的,如果为空或没有相同的牌时才插入,否则不做插入的处理。②麻将中同一张牌有且只有4张,但因重复分析导致听出了同张牌的第5张牌。这是因手中已有4张同牌,但没有必要采取“杠”,才出现的情况。测试中,目前只有在7张牌时才发现一次,形如条2222333、2223333,原系统多听出了2、3。这也属于特殊听牌牌型,作特别处理。③在设计中,尽最大可能避免重复分析,但个别的情况下,有限的重复目前还没有找到更好的解决方法。

4) 因本系统还没有公开发行Beta版,可能还有未知的情况没考虑到,如下只供参考。

注释:

⑴ 数牌:指条、筒、万。

⑵ 字牌:指东、南、西、北、中、发、白。

⑶ 听牌牌型:指构成听牌的基本牌姿。如手中有2张条,则此2张条只能是条AA、AB、AC,那么条AA、AB、AC就称之为听牌牌型。

⑷ 牌型说明:

①AA:是指两张同样的牌型,如条11、筒22、万33、字东东等。

②AB:是指两张连续的牌型,如条12、筒23、万34等。

③AC:是指两张不连续但只相隔一张的牌型,如条13、筒24、万35等。

④AD:是指两张不连续但相隔两张或两张以上的牌型,如条14、筒26、万37等。

参考文献:

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

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

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

[4] 苏小虎. AI在游戏软件开发中的应用[J].电脑知识技术,2007(11):1292,1319.