├── blackjack.py └── test.py /blackjack.py: -------------------------------------------------------------------------------- 1 | from random import shuffle 2 | 3 | def hand_value(hand): 4 | r = 0 5 | for c in hand: 6 | r += c[1] 7 | 8 | return r 9 | 10 | class Deck: 11 | 12 | suits = ['hearts', 'diamonds', 'clubs', 'spades'] 13 | values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] 14 | 15 | def __init__(self, shuffle_func=None): 16 | self.cards = [] 17 | 18 | if shuffle_func is None: 19 | self.shuffle_func = shuffle 20 | else: 21 | self.shuffle_func = shuffle_func 22 | 23 | for s in self.suits: 24 | for v in self.values: 25 | self.cards.append((s, v)) 26 | 27 | def shuffle(self): 28 | self.shuffle_func(self.cards) 29 | 30 | def deal(self): 31 | return self.cards.pop(0) 32 | 33 | class Game: 34 | 35 | def __init__(self, player_hands): 36 | self.deck = Deck() 37 | self.deck.shuffle() 38 | self.dealer_hand = [] 39 | 40 | self.player_hands = [] 41 | for i in range(0, player_hands): 42 | self.player_hands.append([]) 43 | 44 | def initial_deal(self): 45 | self._deal_players() 46 | self.dealer_hand.append(self.deck.deal()) 47 | self._deal_players() 48 | 49 | def play(self): 50 | pass 51 | 52 | def _deal_players(self): 53 | for hand in self.player_hands: 54 | hand.append(self.deck.deal()) 55 | 56 | 57 | if __name__ == '__main__': 58 | players = 4 59 | 60 | game = Game(players) 61 | game.initial_deal() 62 | 63 | for i in range(0, players): 64 | print "Player %d has %d" % (i + 1, hand_value(game.player_hands[i])) 65 | 66 | print "Dealer has %d" % hand_value(game.dealer_hand) 67 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import copy 3 | 4 | from blackjack import Deck, Game, hand_value 5 | 6 | def shuffle_func(list): 7 | first_card = list[0] 8 | last_card = list[51] 9 | 10 | list[0], list[51] = last_card, first_card 11 | 12 | class TestDeck(unittest.TestCase): 13 | 14 | def setUp(self): 15 | self.deck = Deck(shuffle_func) 16 | 17 | def test_cards(self): 18 | self.assertEqual(52, len(self.deck.cards)) 19 | 20 | def test_shuffle(self): 21 | cards_before = list(self.deck.cards) 22 | self.deck.shuffle() 23 | cards_after = list(self.deck.cards) 24 | 25 | self.assertNotEqual(cards_before, cards_after) 26 | 27 | def test_deal(self): 28 | expected = self.deck.cards[0] 29 | card = self.deck.deal() 30 | 31 | self.assertEqual(expected, card) 32 | 33 | def test_deal_card_gone(self): 34 | card = self.deck.deal() 35 | self.assertEqual(51, len(self.deck.cards)) 36 | 37 | 38 | class TestGame(unittest.TestCase): 39 | 40 | def setUp(self): 41 | self.player_hands = 4 42 | self.game = Game(self.player_hands) 43 | 44 | def test_deck(self): 45 | self.assertEqual(self.game.deck.__class__, Deck) 46 | 47 | def test_player_hands(self): 48 | self.game.initial_deal() 49 | self.assertEqual(self.player_hands, len(self.game.player_hands)) 50 | for hand in self.game.player_hands: 51 | self.assertEqual(2, len(hand)) 52 | 53 | def test_dealer_hand(self): 54 | self.game.initial_deal() 55 | self.assertEqual(1, len(self.game.dealer_hand)) 56 | 57 | def test_initial_deal(self): 58 | dealt_cards = self.game.deck.cards[0:9] 59 | 60 | self.game.initial_deal() 61 | 62 | self.assertEqual(dealt_cards[0], self.game.player_hands[0][0]) 63 | self.assertEqual(dealt_cards[1], self.game.player_hands[1][0]) 64 | self.assertEqual(dealt_cards[2], self.game.player_hands[2][0]) 65 | self.assertEqual(dealt_cards[3], self.game.player_hands[3][0]) 66 | self.assertEqual(dealt_cards[4], self.game.dealer_hand[0]) 67 | self.assertEqual(dealt_cards[5], self.game.player_hands[0][1]) 68 | self.assertEqual(dealt_cards[6], self.game.player_hands[1][1]) 69 | self.assertEqual(dealt_cards[7], self.game.player_hands[2][1]) 70 | self.assertEqual(dealt_cards[8], self.game.player_hands[3][1]) 71 | 72 | 73 | class TestHandValue(unittest.TestCase): 74 | def test_value_of_hand(self): 75 | result = hand_value([('hearts', 1), ('diamonds', 4), ('clubs', 10), ('clubs', 6)]) 76 | self.assertEqual(21, result) 77 | 78 | if __name__ == '__main__': 79 | unittest.main() 80 | --------------------------------------------------------------------------------