麻将ID构架
用一维数组PAICAPTION(143)来记录每张牌的ID和文字信息,数组内容为文字描述,下标用作ID(0-143,共144张牌)
1、胡牌判断基本构架
用一维数组来记录各个牌型的数量,例如
int PAI[38] = { 0,
1,1,1,0,1,1,1,0,0, // PAI[ 1- 9] 壹万~玖万的个数
0,
0,0,0,0,0,3,0,0,0, // PAI[11-19] 壹铜~玖铜的个数
0,
0,0,0,0,0,0,0,0,0, // PAI[21-29] 壹条~玖条的个数
0,
0,1,1,1,0,0,0 // PAI[31-37] 东南西北中发白的个数
};
2、手牌基本构架
用二维数组来记录,例如
SELFPAI(17,1) 注:每人手里最多能有18张牌
参数1:每张牌的ID,即在PAICAPTION数组中的下标
参数2:每张牌的状态,-1 =》无牌,1=》普通牌,2=》碰牌,3=》吃牌,4=》暗杠,5=》明杠
3、吃碰杠胡的临时数据构架
主要用来记录触发吃碰杠胡的临时数据,用动态数组记录就行,就不多啰嗦了。
有了这些基本构架,所有的牌和玩家手牌的状态就一目了然了,对于后期开发电脑的AI和游戏流程就方便多了。
标准胡牌判断算法
用胡牌判断基本构架,递归检查。一副成胡牌由刻子和顺子组成,每次递归时把刻子或顺子的牌数量减一,最后为0时即是胡牌型。(更多详细算法 棋牌源码架设 www.yasewl.com)
Public Function HU(arrPai) As Boolean ‘检查标准胡牌型
Dim i As Integer
If Remain(arrPai) = 0 Then HU = True: Exit Function
For i = 0 To UBound(arrPai)
If arrPai(i) > 0 Then Exit For
Next
If arrPai(i) = 4 Then
arrPai(i) = 0
If HU(arrPai) = True Then HU = True: Exit Function
arrPai(i) = 4
End If
If arrPai(i) >= 3 Then
arrPai(i) = arrPai(i) - 3
If HU(arrPai) = True Then HU = True: Exit Function
arrPai(i) = arrPai(i) + 3
End If
If Jiang = 0 And arrPai(i) >= 2 Then
Jiang = 1
arrPai(i) = arrPai(i) - 2
If HU(arrPai) = True Then HU = True: Exit Function
arrPai(i) = arrPai(i) + 2
Jiang = 0
End If
If i > 30 Then HU = False: Exit Function
If (i Mod 10 < 8) And (arrPai(i + 1) > 0) And (arrPai(i + 2) > 0) Then
arrPai(i) = arrPai(i) - 1
arrPai(i + 1) = arrPai(i + 1) - 1
arrPai(i + 2) = arrPai(i + 2) - 1
If HU(arrPai) = True Then HU = True: Exit Function
arrPai(i) = arrPai(i) + 1
arrPai(i + 1) = arrPai(i + 1) + 1
arrPai(i + 2) = arrPai(i + 2) + 1
End If
HU = False
End Function
七对、十三幺、全不靠胡牌型属于特例,单独写出算法即可。
吃、碰、杠的算法用胡牌判断基本构架和手牌基本构架也可轻松解决。