草稿:十三支 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
參考資料