# -*- coding: utf-8 -*- import random as rd import datetime # ============================================================================= # RunningTime() # ============================================================================= def RunningTime(func): """ Decorator -- For Calculate the running time """ def cputime(*arg, **kwarg): start = datetime.datetime.now() func(*arg, **kwarg) stop = datetime.datetime.now() print(f"Running Time = {stop-start}") return cputime spade = "\u2660" heart = "\u2665" diamond = "\u2666" club = "\u2663" suits = [spade, heart, diamond, club] # ============================================================================= # class Card # ============================================================================= class Card(object): """ 一張撲克牌的物件 """ def __init__(self, suit, rank): self.suit = suit self.rank = rank self.ran = None def __repr__(self): if self.rank == 11: return f"{self.suit}J" elif self.rank == 12: return f"{self.suit}Q" elif self.rank == 13: return f"{self.suit}K" elif self.rank == 1: return f"{self.suit}A" else: return f"{self.suit}{self.rank}" def __lt__(self, anotherCard): if self.ran < anotherCard.ran: return True else: return False def __gt__(self, anotherCard): if self.ran > anotherCard.ran: return True else: return False __str__=__repr__ # ============================================================================= # class ShowHand # ============================================================================= class ShowHand(object): def __init__(self): self.cards = []#建立一副牌 self.pick5 = []#取出5張牌 for s in suits: for r in range(1,14): self.cards.append(Card(s, r)) def deal(self): """ 發牌 """ self.__shuffle() j = self.__judge() print(f"{j}\n{self.pick5}") return j def __shuffle(self): """ 洗牌 """ rd.shuffle(self.cards) self.pick5 = self.cards[:5] def __judge(self): """ 判斷牌型 """ self.__sortByRank() if self.__isRoyalFlush(): return "同花大順" elif self.__isStraightFlush(): return("同花順") elif self.__is4OfAKind(): return("鐵支") elif self.__isFlush(): return("同花") elif self.__isStraight(): return("順") elif self.__is3OfAKind(): return("三條") elif self.__isTwoPairs(): return("Two Pairs") elif self.__isJacksOrBetter(): return("Jacks or Better") else: return("Nothing") def __sortByRank(self): """ Sort pick5 by Rank """ for p in self.pick5: p.ran = rd.random() self.pick5.sort(key=lambda x: x.rank) def __isFlush(self): """ Is it a Flush? """ if self.pick5[0].suit==self.pick5[1].suit==self.pick5[2].suit==self.pick5[3].suit==self.pick5[4].suit: #print("It is a Flush") return True else: #print("Not a Flush") return False def __isStraight(self): """ Is it a Straight? """ if all([self.pick5[0].rank==1, self.pick5[1].rank==10, self.pick5[2].rank==11, self.pick5[3].rank==12, self.pick5[4].rank==13]): #print("It is the Biggest Straight") return 1 elif self.pick5[0].rank+4==self.pick5[1].rank+3==self.pick5[2].rank+2==self.pick5[3].rank+1==self.pick5[4].rank: #print("It is a Straight") return 2 else: #print("It is not a Straight") return 0 def __is4OfAKind(self): """ Is it a 4 of a kind? """ if (self.pick5[0].rank==self.pick5[1].rank==self.pick5[2].rank==self.pick5[3].rank or self.pick5[1].rank==self.pick5[2].rank==self.pick5[3].rank==self.pick5[4].rank): #print("It is a 4 of a kind") return True else: #print("It is not a 4 of a kind") return False def __is3OfAKind(self): """ Is it a 3 of a kind? """ if ((self.pick5[0].rank==self.pick5[1].rank==self.pick5[2].rank!=self.pick5[3].rank!=self.pick5[4].rank) or (self.pick5[0].rank!=self.pick5[1].rank==self.pick5[2].rank==self.pick5[3].rank!=self.pick5[4].rank) or (self.pick5[0].rank!=self.pick5[1].rank!=self.pick5[2].rank==self.pick5[3].rank==self.pick5[4].rank)): #print("It is a 3 of a kind") return True else: #print("It is not a 3 of a kind") return False def __isRoyalFlush(self): """ Is it a Royal Flush? """ if self.__isStraight()==1 and self.__isFlush(): return True else: return False def __isStraightFlush(self): """ Is it a Straight Flush? """ if self.__isStraight()==2 and self.__isFlush(): return True else: return False def __isFullHouse(self): """ Is it a Full House? """ if ((self.pick5[0].rank==self.pick5[1].rank and self.pick5[2].rank==self.pick5[3].rank==self.pick5[4].rank) or (self.pick5[0].rank==self.pick5[1].rank==self.pick5[2].rank and self.pick5[3].rank==self.pick5[4].rank)): #print("It is a Full House") return True else: #print("It is not a Full House") return False def __isTwoPairs(self): """ Is it a Two Pairs? """ if ((self.pick5[0].rank!=self.pick5[1].rank==self.pick5[2].rank!=self.pick5[3].rank==self.pick5[4].rank) or (self.pick5[0].rank==self.pick5[1].rank!=self.pick5[2].rank!=self.pick5[3].rank==self.pick5[4].rank) or (self.pick5[0].rank==self.pick5[1].rank!=self.pick5[2].rank==self.pick5[3].rank==self.pick5[4].rank)): #print("It is a Two Pair.") return True else: #print("It is not a Two Pair") return False def __isJacksOrBetter(self): """ Is it a Jacks of Better? """ if (((self.pick5[0].rank==self.pick5[1].rank!=self.pick5[2].rank!=self.pick5[3].rank!=self.pick5[4].rank) and (self.pick5[0].rank==1 or self.pick5[0].rank >10)) or ((self.pick5[0].rank!=self.pick5[1].rank==self.pick5[2].rank!=self.pick5[3].rank!=self.pick5[4].rank) and (self.pick5[1].rank==1 or self.pick5[1].rank >10)) or ((self.pick5[0].rank!=self.pick5[1].rank!=self.pick5[2].rank==self.pick5[3].rank!=self.pick5[4].rank) and (self.pick5[2].rank==1 or self.pick5[2].rank >10)) or ((self.pick5[0].rank!=self.pick5[1].rank!=self.pick5[2].rank!=self.pick5[3].rank==self.pick5[4].rank) and (self.pick5[3].rank==1 or self.pick5[3].rank >10))): #print("It is Jacks or Better") return True else: #print("It is not Jacks or Better") return False # ============================================================================= # main # ============================================================================= if __name__=="__main__": #""" sh = ShowHand() while True: command = input("Deal(d) or Quit(q)?") if command.casefold() == "Deal".casefold() or command.casefold() == "d".casefold(): sh.deal() if command.casefold() == "Quit".casefold() or command.casefold() == "q".casefold(): break #""" """ @RunningTime def check(): sh = ShowHand() while True: if sh.deal().casefold() == "同花大順".casefold(): break check() #"""