草稿:十三支 python 程式

维基百科,自由的百科全书

十三支的 python 程式


章节标题[编辑]

import random


  1. 做一副撲克牌 和 洗牌

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


  1. 根據玩家數量發牌

def deal_to(num_players):

   global deck
  1. 這邊deck設全域變數 後面才不會變
   hands = []
   for _ in range(num_players):
       player_hand = deck[:5]
  1. 每人拿前五張
       deck = deck[5:]
  1. 拿完去掉牌組前五張
       hands.append(player_hand)
   return hands


  1. 每位玩家的手牌排序

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


  1. 將花色和數字結合

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
  1. 找有沒有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. 找有沒有順子 前-後=1就有順序 反之沒有

def checkStraight(ranks):

   for i in range(1, len(ranks)):
       if ranks[i] - ranks[i - 1] != 1:
           return False
   return True


  1. 找其他組合

def findPokerHand(hands):

   ranks = []
   suits = []
   possibleRanks = []
   for card in hands:
  1. 檢查牌的第一個字元是否為 '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])
  1. 將 ranks 列表排序後存入 sortedRanks 中,然後將 sortedRanks 轉換成集合 handUniqueRanks
   sortedRanks = sorted(ranks)
   handUniqueRanks = set(sortedRanks)
  1. 檢查是否有其他組合,數字對應下面的組合可能
   # 例如:同花就對應下面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



  1. 給牌定值

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,

}

  1. 上述的牌型組合

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",

}


  1. 主程式

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)
  1. 轉換 比較不容易弄錯
   hands = sort(deal_to(num_players), player_names)
   hands = transform_format(hands)
  1. 把組合換算成績比輸贏

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)
  1. 给玩家的手牌排序并按照得分排序

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


參考資料[编辑]


外部連結[编辑]