Advertisement
B1KMusic

52.py

Jul 20th, 2018
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.66 KB | None | 0 0
  1. #!/usr/bin/env python2
  2.  
  3. import random
  4. import time
  5.  
  6. RANDMAX = 1<<32
  7.  
  8. random.seed(time.time())
  9.  
  10. # I like C's rand().
  11. def rand():
  12.     return random.randint(0, RANDMAX)
  13.  
  14. def flatten(list):
  15.     return [item for sublist in list for item in sublist]
  16.     # Thanks, StackOverflow.
  17.  
  18. class Card:
  19.     (ST_SPADE, ST_HEART, ST_CLUB, ST_DIAMOND, ST_END) = xrange(5)
  20.     SUIT_STR = ("Spade", "Heart", "Club", "Diamond")
  21.     VAL_STR = ("Joker","Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King")
  22.  
  23.     def __init__(self, suit = None, value = None):
  24.         self.suit = suit
  25.         self.value = value
  26.  
  27.         if self.suit is None:
  28.             self.suit = rand() % Card.ST_END
  29.  
  30.         if self.value is None:
  31.             self.value = rand() % len(Card.VAL_STR)
  32.  
  33.     def info(self):
  34.         if self.value == 0:
  35.             return Card.VAL_STR[self.value]
  36.  
  37.         return "%s of %ss" % (Card.VAL_STR[self.value], Card.SUIT_STR[self.suit])
  38.  
  39. class Deck:
  40.     def __init__(self):
  41.         self.generate()
  42.         self.shuffle()
  43.         self.drawn = []
  44.  
  45.     def generate(self):
  46.         generate_suit = lambda suit: map(lambda value: Card(suit, value), xrange(1, len(Card.VAL_STR)))
  47.         joker = lambda: Card(value = 0)
  48.         # ^ Probably being overly defensive here, but I've been burned by pass-by-reference before.
  49.         self.cards = [joker()] * 2 + flatten(map(generate_suit, xrange(Card.ST_END)))
  50.  
  51.     def reassemble(self):
  52.         while len(self.drawn) > 0:
  53.             self.undraw()
  54.  
  55.     def shuffle(self):
  56.         random.shuffle(self.cards)
  57.  
  58.     def info(self):
  59.         for card in self.cards:
  60.             print card.info()
  61.  
  62.     def undraw(self):
  63.         self.cards.append(self.drawn.pop())
  64.  
  65.     def draw(self):
  66.         if len(self.cards) == 0:
  67.             self.reassemble()
  68.             self.shuffle()
  69.  
  70.         self.drawn.append(self.cards.pop())
  71.         return self.drawn[-1]
  72.  
  73.     def deal(self, hands, amt):
  74.         for hand in hands:
  75.             hand.empty_hand()
  76.             hand.draw(self, amt)
  77.  
  78. class Hand:
  79.     def __init__(self):
  80.         self.cards = []
  81.  
  82.     def draw(self, deck, amt):
  83.         for x in xrange(amt):
  84.             self.cards.append(deck.draw())
  85.  
  86.     def empty_hand(self):
  87.         while len(self.cards) > 0:
  88.             self.cards.pop()
  89.  
  90.     def remove_card(self, index):
  91.         c = self.cards[index]
  92.         self.cards.remove(c)
  93.         return c
  94.  
  95.     def info(self):
  96.         print "Your hand:"
  97.  
  98.         for card in self.cards:
  99.             print " -> %s" % card.info()
  100.  
  101. def showcase_hand___or___5_drunk_friends_attempt_to_play_poker():
  102.     deck = Deck()
  103.     players = map(lambda x: Hand(), [None] * 5)
  104.  
  105.     deck.deal(players, 5)
  106.  
  107.     print "Our game begins with five players. Player 0, the dealer, deals everyone their cards. Five each, in accordance with the rules of poker"
  108.     print
  109.     print "Everyone looks at their hands..."
  110.     print
  111.  
  112.     for player in players:
  113.         print "Player %i:" % (players.index(player))
  114.         player.info()
  115.         print
  116.  
  117.     uno_card = players[0].remove_card(3)
  118.  
  119.     print "Player 0 lays down a card--a %s--and attempts to call 'Uno!', apparently not realizing this is a game of poker." % (uno_card.info())
  120.     print
  121.     print "Player 0 appears to be drunk."
  122.     print
  123.     print "Surprisingly, the other players roll with it. Player 0 looks at his hand..."
  124.     players[0].info()
  125.     print
  126.     print "Suddenly, player 4 calls out player 0, pointing out that he in fact has four cards, not one. Player 0 is forced to draw three cards."
  127.     players[0].draw(deck, 3)
  128.     print
  129.     print "Player 0 looks at his hand again..."
  130.     players[0].info()
  131.     print
  132.     print "Suddenly, player 3 decides to steal everyone's cards (including the %s that player 0 laid down earlier) and yell them out one by one" % (uno_card.info())
  133.     print
  134.  
  135.     for card in deck.drawn:
  136.         print " * %s" % card.info()
  137.  
  138.     print
  139.     print "Unsurprisingly, everyone leaves the room and the game ends."
  140.  
  141. def showcase_deck(): # this function doesn't get called
  142.     d = Deck()
  143.  
  144.     for x in xrange(54):
  145.         print d.draw().info()
  146.  
  147.     print
  148.     print "-- Deck has been exhausted. Let's try to break it by drawing a few more! --"
  149.     print
  150.  
  151.     for x in xrange(10):
  152.         print d.draw().info()
  153.  
  154.     print
  155.     print "As you can see, after the deck has been exhausted, it is reassembled and re-shuffled"
  156.     print "I considered generating a new deck, but I admittedly don't know what happens to 'lost' objects in python."
  157.     print "So to avoid memory leaks, I opted for frugality. Drawn cards are kept track of."
  158.  
  159. showcase_hand___or___5_drunk_friends_attempt_to_play_poker()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement