class TestDeck(unittest.TestCase): def setUp(self): self.deck = Deck() self.fake_cards = [ FakeCard(), FakeCard(), FakeCard() ] self.deck.cards = self.fake_cards[:] def test_shuffle_randomizes_card_order(self): # arrange sorted_cards = [] for i in xrange(10000): sorted_cards.append(FakeCard()) self.deck.cards = sorted_cards[:] # act self.deck.shuffle() # assert self.assertEqual(len(self.deck.cards), len(sorted_cards)) self.assertNotEqual(self.deck.cards, sorted_cards) def test_shuffle_flips_cards(self): # arrange Deck.SHUFFLE_FLIP_PROBABILITY = 1.0 # act self.deck.shuffle() # assert for card in self.fake_cards: self.assertTrue(card.flip_called) def test_nextCard_returns_cards_in_correct_order(self): # arrange next_cards = [] # act for i in range(len(self.fake_cards)): next_cards.append(self.deck.nextCard()) # assert self.assertEqual(next_cards, self.fake_cards) def test_nextCard_throws_exception_when_deck_empty(self): # arrange try: # act for i in range(len(self.fake_cards) + 1): self.deck.nextCard() except DeckEmptyException: pass
class BlackJack: """ BlackJackClass - Main actions for the game """ class Mode: dark = 0 one_up = 1 dark_dealer = 2 one_up_dealer = 3 def __init__(self, *names, console, bet=100, cash=500, players=2, mode=Mode.dark): self.__mode = mode self.__bet = bet self.__csl = console if players < len(names): players = len(names) + 1 self.players = [ BJPlayer(name=nome, npc=False, cash=cash) for nome in names ] for i in range(players - len(self.players)): self.players.append(BJPlayer(name=f'NPC-{i}', npc=True, cash=cash)) if len(self.players) > 7: raise Exception("No more than 7 players, please...") if mode in [self.Mode.dark_dealer, self.Mode.one_up_dealer]: self.players.append( BJPlayer(name="Dealer", npc=True, cash=float('inf'))) self.deck = Deck() def __enter__(self): self.start() return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_val is not None: raise exc_val # ------------------- functions for playing ---------------------------------- def start(self): # Initialize each player hand with 2 cards self.deck.shuffle() while sum(len(player) for player in self.players) < 2 * len(self.players): for player in self.players: player.get_card(self.deck.draw()) for player in self.players: if player.name == 'Dealer' and player.is_npc: while abs( player ) < 17: # For dealer type games, dealer cannot start with less than 17 points player.get_card(self.deck.draw()) def roll(self): # Play a round plays = 0 for player in self.players: if not player.burn: if not (player.name == 'Dealer' and player.is_npc): plays += 1 result = { 'asks': 0, 'non-asks': 0, 'unknown': plays } # plays counts the number of players in the roll while result['unknown'] > 0: for player in self.players: if player.name == 'Dealer' and player.is_npc: # Dealers only draw cards in the game start continue if not player.burn: if player.is_npc: draws = round(random()) if draws == 1: # Modify with machine learning decision making in future version result['asks'] += 1 result['unknown'] -= 1 player.get_card(self.deck.draw()) if player.burn: self.__csl.print( f'\n==========\n{player.name} BURNS\n===========\n', self.__csl.textColor.RED) else: result['non-asks'] += 1 result['unknown'] -= 1 else: if self.__mode == self.Mode.dark or self.__mode == self.Mode.dark_dealer: adver = { play.name: f"{len(play)} cards" for play in self.players } else: adver = { play.name: f"{play.hand[0]} => {len(play)} cards" for play in self.players } self.__csl.print( str("\n\n" f"Player: {player.name}\n\n" f"Opponent:\n" f"{adver}\n" f"Your cards {[card for card in player.hand]} Sum = {abs(player)}\n\n" f"Draw a card? (y/n):\n")) ask = input() while ask.lower() not in ['y', 'n']: ask = input( f"{self.__csl.textColor.YELLOW}Sorry?!\n{self.__csl.style.RESET_ALL}" f"Wanna draw a card? (y/n):\n") if ask.lower() == 'y': result['asks'] += 1 result['unknown'] -= 1 player.get_card(self.deck.draw()) if player.burn: self.__csl.print( f'\n==========\n{player.name} BURNS\n===========\n', self.__csl.textColor.RED) else: # if 'n' result['non-asks'] += 1 result['unknown'] -= 1 player.last_roll = result asks = result['asks'] return result def play(self): res = 1 while res > 0: self.__csl.clear() res = self.roll()['asks'] self.__csl.clear() result = { player.name: ('Burn' if player.burn else 'BlackJack' if abs(player) == 21 else abs(player)) for player in self.players } self.__csl.print(result) val = max(abs(player) for player in self.players if not player.burn) lista = [player for player in self.players if abs(player) == val] for player in self.players: if player in lista: player += self.__bet * len(self.players) / len(lista) else: player -= self.__bet # ------------------- TODO ---------------------------------- def showTable(): pass def showPlayerOptions(): pass def showResults(): pass