简易麻雀算法python模型
时间: 2023-12-07 20:05:29 浏览: 146
麻雀搜索算法(Sparrow Search Algorithm,python简洁明了,含详细解释)
5星 · 资源好评率100%
以下是一个简单的麻将算法 python 模型,实现了麻将的牌型判断和基本的胡牌规则:
```python
class Mahjong:
def __init__(self, hand):
self.hand = sorted(hand)
def is_valid(self):
"""判断手牌是否合法"""
if len(self.hand) % 3 != 2:
return False
for i in range(len(self.hand) - 1):
if self.hand[i] == self.hand[i + 1]:
return False
if not self.is_tiles_valid():
return False
return True
def is_tiles_valid(self):
"""判断牌的种类和数目是否合法"""
tiles = {}
for tile in self.hand:
if tile not in tiles:
tiles[tile] = 0
tiles[tile] += 1
for tile in tiles:
if tiles[tile] > 4:
return False
if tile // 10 > 3:
return False
return True
def can_win(self):
"""判断是否可以胡牌"""
for i in range(len(self.hand)):
if i < len(self.hand) - 1 and self.hand[i] == self.hand[i + 1]:
copied_hand = self.hand.copy()
del copied_hand[i:i + 2]
if self.is_win(copied_hand):
return True
return False
def is_win(self, hand):
"""判断手牌是否为胡牌状态"""
if len(hand) == 0:
return True
if len(hand) % 3 != 0:
return False
# 判断是否有雀头
for i in range(len(hand) - 1):
if hand[i] == hand[i + 1]:
copied_hand = hand.copy()
del copied_hand[i:i + 2]
if self.is_valid_sets(copied_hand):
return True
# 判断是否有顺子
for i in range(len(hand) - 2):
if hand[i] + 1 in hand and hand[i] + 2 in hand:
copied_hand = hand.copy()
copied_hand.remove(hand[i])
copied_hand.remove(hand[i] + 1)
copied_hand.remove(hand[i] + 2)
if self.is_valid_sets(copied_hand):
return True
# 判断是否有刻子
for i in range(len(hand) - 2):
if hand[i] == hand[i + 1] and hand[i] == hand[i + 2]:
copied_hand = hand.copy()
del copied_hand[i:i + 3]
if self.is_valid_sets(copied_hand):
return True
# 没有合法的顺子、刻子和雀头,无法胡牌
return False
def is_valid_sets(self, hand):
"""判断是否合法的顺子和刻子"""
if len(hand) == 0:
return True
if len(hand) % 3 != 0:
return False
# 判断是否有顺子
for i in range(len(hand) - 2):
if hand[i] + 1 in hand and hand[i] + 2 in hand:
copied_hand = hand.copy()
copied_hand.remove(hand[i])
copied_hand.remove(hand[i] + 1)
copied_hand.remove(hand[i] + 2)
if self.is_valid_sets(copied_hand):
return True
# 判断是否有刻子
for i in range(len(hand) - 2):
if hand[i] == hand[i + 1] and hand[i] == hand[i + 2]:
copied_hand = hand.copy()
del copied_hand[i:i + 3]
if self.is_valid_sets(copied_hand):
return True
# 没有合法的顺子和刻子
return False
```
使用方法:
```python
hand = [11, 12, 13, 14, 15, 17, 17] # 一万、二万、三万、四万、五万、七万、七万
mahjong = Mahjong(hand)
if mahjong.is_valid():
if mahjong.can_win():
print("可以胡牌!")
else:
print("不能胡牌。")
else:
print("不合法的手牌。")
```
其中手牌中的牌用整数表示,一万到九万为 11 到 19,一条到九条为 21 到 29,一筒到九筒为 31 到 39,东南西北中发白为 41 到 47。
阅读全文