设计一个麻将胡牌的算法
时间: 2023-10-28 19:05:48 浏览: 129
麻将胡牌算法一般采用递归回溯的方法,以下是一个简单的实现:
1. 对手中的牌进行排序,方便后续的计算。
2. 将排好序的牌以一个列表的形式存储,每张牌用一个数字表示。
3. 定义一个递归函数,用来判断当前的牌是否可以胡牌。该函数需要传入以下参数:当前牌型列表、已经组成的刻子和顺子列表、当前判断的牌、当前牌的张数、是否已经有将牌。
4. 在递归函数中,首先判断当前牌是否可以组成刻子或者顺子,如果可以,则将当前牌加入刻子或顺子列表,并继续递归判断剩下的牌是否可以胡牌。
5. 如果当前牌无法组成刻子或顺子,则判断是否可以作为将牌。如果已经有将牌,则将当前牌加入刻子或顺子列表,继续递归判断剩下的牌是否可以胡牌。
6. 如果当前牌无法组成刻子、顺子或将牌,则说明无法胡牌,回溯到上一层继续判断。
7. 当所有的牌都被判断过后,如果已经有将牌,则说明可以胡牌,返回 True,否则返回 False。
代码实现如下:
```
def is_hu(pai_list, kezi_list=[], shunzi_list=[], jiang=None):
if not pai_list:
return jiang is not None
for i in range(len(pai_list)):
if i < len(pai_list) - 2 and pai_list[i] == pai_list[i+1] == pai_list[i+2]:
# 组成刻子
new_kezi_list = kezi_list + [pai_list[i], pai_list[i+1], pai_list[i+2]]
if is_hu(pai_list[:i] + pai_list[i+3:], new_kezi_list, shunzi_list, jiang):
return True
if i < len(pai_list) - 2 and pai_list[i]+1 in pai_list and pai_list[i]+2 in pai_list:
# 组成顺子
new_shunzi_list = shunzi_list + [pai_list[i], pai_list[i]+1, pai_list[i]+2]
if is_hu(pai_list[:i] + pai_list[i+1:], kezi_list, new_shunzi_list, jiang):
return True
if jiang is None and pai_list[i] == pai_list[i+1]:
# 作为将牌
new_jiang = pai_list[i]
if is_hu(pai_list[:i] + pai_list[i+2:], kezi_list, shunzi_list, new_jiang):
return True
return False
```
调用实例:
```
pai_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 1]
pai_list.sort()
print(is_hu(pai_list)) # True
```
阅读全文