""" card.py example of a playing card class for the python programming class. Jim M | Nov 2008 | GPL """ from doctest import testmod from random import randrange class Card: """A card from a standard 52-card deck. >>> ace = Card(1, 's') >>> ace.getRank() 1 >>> ace.getRankName() 'ace' >>> ace.getSuit() 's' >>> ace.getSuitName() 'spades' >>> str(ace) 'ace of spades' >>> randomCard = Card() >>> 2 <= randomCard.blackJackValue() <= 11 # Ace has blackJackValue 11 True >>> Card(10, 'c') < Card(2, 's') # sort first by suits True >>> Card(1, 'h') > Card(13, 'h') # sort ace high True """ suits = ['c', 'd', 'h', 's'] suitNames = {'c':'clubs', 'd':'diamonds', 'h':'hearts', 's':'spades'} rankNames = [None, 'ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'jack', 'queen', 'king'] def __init__(self, rank=None, suit=None): """Inputs to create a new card are rank in [1,2,3,..., 13], representing ace through king, suit in ['c', 'd', 'h', 's'], representing clubs, diamonds, heart, spades. A random card is returned if rank or suit are missing or incorrect. >>> card1 = Card(1, 's') # ace of spades >>> card2 = Card() # a random card """ try: rank = int(rank) # Make sure that rank is an integer suit = (str(suit))[0].lower() # and that suit is one lowercase character. except: rank = suit = None # Otherwise, we'll return a random card. if rank==None or suit==None or rank<1 or rank>13 or not suit in Card.suits: rank = 1 + randrange(13) # a random rank from 1 to 13 suit = Card.suits[randrange(4)] # a random suit from ['c', 'd', 'h', 's'] self.rank = rank self.suit = suit def getRank(self): """Return card's rank as an integer from 1 to 13, ace as 1. >>> jackOfHearts = Card(11, 'h') >>> jackOfHearts.getRank() 11 """ return self.rank def getRankName(self): """Return card's rank as a word like 'ace' or 'ten' or 'jack'. >>> jackOfHearts = Card(11, 'h') >>> jackOfHearts.getRankName() 'jack' """ return Card.rankNames[self.rank] def getSuit(self): """Return card's suit as letter in ['c', 'd', 'h', 's']. >>> jackOfHearts = Card(11, 'h') >>> jackOfHearts.getSuit() 'h' """ return self.suit def getSuitName(self): """Return card's suit as a word like 'clubs' or 'spades'. >>> jackOfHearts = Card(11, 'h') >>> jackOfHearts.getSuitName() 'hearts' """ return Card.suitNames[self.suit] def blackJackValue(self): """Return card's value from 2 to 11. (Face cards are 10; ace is 11.) Note that in real blackjack, the ace is 1 if it would cause a bust, else 1. >>> jackOfHearts = Card(11, 'h') >>> jackOfHearts.blackJackValue() 10 """ if self.rank == 1: return 11 elif self.rank >= 10: return 10 else: return self.rank def __str__(self): """Return a string e.g. 'ace of spades'. >>> str(Card(1, 's')) 'ace of spades' """ return Card.rankNames[self.rank] + ' of ' + Card.suitNames[self.suit] def getRankAceHigh(self): """Return numeric rank as integer from 2 to 14, ace as 14. >>> Card(12,'s').getRankAceHigh() 12 >>> Card(1, 'c').getRankAceHigh() 14 """ if self.rank == 1: return 14 else: return self.rank def __cmp__(self, other): """Return -1 if self < other, 0f self == other, 1 if self > other. Ace is high. Cards are ordered by suit first (alphabetically), then rank, with aces high. >>> a = Card(5, 'c') >>> b = Card(1, 'c') >>> c = Card(10, 's') >>> a < b < c True """ if self.suit != other.suit: return cmp(self.suit, other.suit) else: return cmp(self.getRankAceHigh(), other.getRankAceHigh()) if __name__=="__main__": testmod()