|
|
|
@ -0,0 +1,85 @@
|
|
|
|
|
import random
|
|
|
|
|
from collections import Counter
|
|
|
|
|
|
|
|
|
|
# 初始化扑克牌,生成52张牌,不包括大小王
|
|
|
|
|
suits = ['H', 'D', 'S', 'C'] # Hearts, Diamonds, Spades, Clubs
|
|
|
|
|
values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
|
|
|
|
|
deck = [v + s for s in suits for v in values]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 牌型判断函数
|
|
|
|
|
def is_bomb(cards):
|
|
|
|
|
# 判断是否为豹子(炸弹),三张点相同的牌
|
|
|
|
|
return cards[0][:-1] == cards[1][:-1] == cards[2][:-1]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_straight_flush(cards):
|
|
|
|
|
# 判断是否为顺金(同花顺),花色相同的顺子
|
|
|
|
|
return is_flush(cards) and is_straight(cards)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_flush(cards):
|
|
|
|
|
# 判断是否为金花(色皮),花色相同,非顺子
|
|
|
|
|
return cards[0][-1] == cards[1][-1] == cards[2][-1]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_straight(cards):
|
|
|
|
|
# 判断是否为顺子(拖拉机),花色不同的顺子
|
|
|
|
|
values = sorted(['23456789TJQKA'.index(c[:-1]) if c[:-1] != '10' else 8 for c in cards])
|
|
|
|
|
return values == list(range(values[0], values[0] + 3))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_pair(cards):
|
|
|
|
|
# 判断是否为对子,两张点数相同的牌
|
|
|
|
|
values = [c[:-1] for c in cards]
|
|
|
|
|
return len(set(values)) == 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_special(cards):
|
|
|
|
|
# 判断是否为特殊牌型,花色不同的235
|
|
|
|
|
values = sorted(['23456789TJQKA'.index(c[:-1]) if c[:-1] != '10' else 8 for c in cards])
|
|
|
|
|
suits = set(c[-1] for c in cards)
|
|
|
|
|
return values == [0, 1, 2] and len(suits) == 3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_hand_type(cards):
|
|
|
|
|
# 获取牌型的类型
|
|
|
|
|
if is_special(cards):
|
|
|
|
|
return '特殊'
|
|
|
|
|
if is_bomb(cards):
|
|
|
|
|
return '豹子'
|
|
|
|
|
if is_straight_flush(cards):
|
|
|
|
|
return '顺金'
|
|
|
|
|
if is_flush(cards):
|
|
|
|
|
return '金花'
|
|
|
|
|
if is_straight(cards):
|
|
|
|
|
return '顺子'
|
|
|
|
|
if is_pair(cards):
|
|
|
|
|
return '对子'
|
|
|
|
|
return '单张' # 三张牌不组成任何类型的牌,单张
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 模拟游戏并统计结果
|
|
|
|
|
results = Counter()
|
|
|
|
|
|
|
|
|
|
# 模拟10000次游戏
|
|
|
|
|
for _ in range(10000):
|
|
|
|
|
# 洗牌
|
|
|
|
|
random.shuffle(deck)
|
|
|
|
|
# 发牌,每位玩家3张牌
|
|
|
|
|
player1 = deck[:3]
|
|
|
|
|
player2 = deck[3:6]
|
|
|
|
|
|
|
|
|
|
# 统计每位玩家的牌型
|
|
|
|
|
results[get_hand_type(player1)] += 1
|
|
|
|
|
results[get_hand_type(player2)] += 1
|
|
|
|
|
|
|
|
|
|
# 计算概率
|
|
|
|
|
total_hands = 20000 # 两个玩家,每人10000次
|
|
|
|
|
probabilities = {hand: count / total_hands for hand, count in results.items()}
|
|
|
|
|
|
|
|
|
|
# 输出结果
|
|
|
|
|
for hand, prob in probabilities.items():
|
|
|
|
|
print(f"{hand}: {prob:.4f}")
|
|
|
|
|
|
|
|
|
|
|