草稿:十三支 python 程式
本草稿尚未提交审核
提交前,请先查阅维基百科不是什么,以免犯下常见错误。 要让草稿被接受,需要至少满足以下要求:
我们强烈不鼓励您创建与您自己、您所在的组织、其对手或其产品相关的条目。如果您仍要这么做,请申报利益冲突。 注意:若您提交之后,本模板出现在页面最下方,表示您已成功提交。
如何改善您的草稿
本草稿由Nashlin0811(贡献·日志)于5个月前最后编辑。 |
十三支的 python 程式
章节标题
[编辑]import random
- 做一副扑克牌 和 洗牌
def shuffle():
suits = ['♠', '♥', '♦', '♣'] ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] deck = [[rank, suit] for suit in suits for rank in ranks] random.shuffle(deck)
return deck
- 根据玩家数量发牌
def deal_to(num_players):
global deck
- 这边deck设全域变数 后面才不会变
hands = [] for _ in range(num_players): player_hand = deck[:5]
- 每人拿前五张
deck = deck[5:]
- 拿完去掉牌组前五张
hands.append(player_hand) return hands
- 每位玩家的手牌排序
def sort(hands, player_names):
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] for hand in hands: hand.sort(key=lambda x: ranks.index(x[0]))
return hands
- 将花色和数字结合
def transform_format(array):
global num_players b = [] for i in array: a = [] for j in i: a.append(j[0] + j[1]) b.append(a) return b
- 找有没有pair 每次拿一张和它后面的牌比较
def countPairs(ranks):
count = 0 for i in range(len(ranks)): for j in range(i + 1, len(ranks)): if ranks[i] == ranks[j]: count += 1 return count
- 找有没有顺子 前-后=1就有顺序 反之没有
def checkStraight(ranks):
for i in range(1, len(ranks)): if ranks[i] - ranks[i - 1] != 1: return False return True
- 找其他组合
def findPokerHand(hands):
ranks = [] suits = [] possibleRanks = []
for card in hands:
- 检查牌的第一个字元是否为 '1',因为 '10' 是由两个字组成的,如果是 '10',则将前两个字符作为牌的值,否则将第一个字作为牌的值
if card[0] == '1': rank = CARD_RANKS_ID[card[0:2]] ranks.append(rank) suits.append(card[2]) else: rank = CARD_RANKS_ID[card[0]] ranks.append(rank) suits.append(card[1])
- 将 ranks 列表排序后存入 sortedRanks 中,然后将 sortedRanks 转换成集合 handUniqueRanks
sortedRanks = sorted(ranks) handUniqueRanks = set(sortedRanks)
- 检查是否有其他组合,数字对应下面的组合可能
# 例如:同花就對應下面6和9組合的可能 if suits.count(suits[0]) == 5: if checkStraight(sortedRanks): possibleRanks.append(9) else: possibleRanks.append(6) elif checkStraight(sortedRanks): possibleRanks.append(5) # 鐵支 elif sortedRanks.count(sortedRanks[0]) == 4 or sortedRanks.count(sortedRanks[1]) == 4: possibleRanks.append(8) # 3張2張配 葫蘆 elif sortedRanks.count(sortedRanks[0]) == 3 and sortedRanks.count(sortedRanks[3]) == 2: possibleRanks.append(7) # 2張3張配 葫蘆 elif sortedRanks.count(sortedRanks[0]) == 2 and sortedRanks.count(sortedRanks[3]) == 3: possibleRanks.append(7) # 三條 elif sortedRanks.count(sortedRanks[0]) == 3 or sortedRanks.count(sortedRanks[1]) == 3 or sortedRanks.count( sortedRanks[2]) == 3: possibleRanks.append(4) # 2 pairs elif countPairs(sortedRanks) == 2: possibleRanks.append(3) # 1 pair elif countPairs(sortedRanks) == 1: possibleRanks.append(2) # 沒組合就High card if not possibleRanks: possibleRanks.append(1) output = POKER_HAND_RANKS[max(possibleRanks)] return output
- 给牌定值
CARD_RANKS_ID = {
"A": 14, "K": 13, "Q": 12, "J": 11, "10": 10, "9": 9, "8": 8, "7": 7, "6": 6, "5": 5, "4": 4, "3": 3, "2": 2,
}
- 上述的牌型组合
POKER_HAND_RANKS = {
9: "Straight Flush", 8: "Four of a Kind", 7: "Full House", 6: "Flush", 5: "Straight", 4: "Three of a Kind", 3: "Two Pair", 2: "One Pair", 1: "High Card",
}
- 主程式
deck = [] hands = [] num_players = 0 player_names = [] if __name__ == "__main__":
deck = shuffle() num_players = int(input("\n请输入玩家数量2~5:"))
for i in range(num_players): # 輸入名字 name = input(f"请输入玩家 {i + 1} 的名字:") player_names.append(name)
- 转换 比较不容易弄错
hands = sort(deal_to(num_players), player_names) hands = transform_format(hands)
- 把组合换算成绩比输赢
scores = [findPokerHand(hand) for hand in hands] win_score = max(scores) winners = []
for i, (hand, score) in enumerate(zip(hands, scores)):
player_name = player_names[i] print(f" {player_name}: Hand: {hand}, Score: {score}") if score == win_score: winners.append(player_name)
- 给玩家的手牌排序并按照得分排序
sorted_scores = sorted(zip(player_names, scores, hands), key=lambda x: (x[1], [14 if card[0] == 'A' else 13 if card[0] == 'K' else 12 if card[0] == 'Q' else 11 if card[0] == 'J' else int(card[0]) for card in x[2]]), reverse=True) rank = 1 previous_score = None previous_hand = None
for i, (player, score, hand) in enumerate(sorted_scores, start=0):
if score != previous_score or hand != previous_hand: print(f"第 {rank} 名: {player},牌型: {score}") previous_score = score previous_hand = hand rank += 1
参考资料
[编辑]