def test_concludeRound(self): """at the end of the round all players should be deleted properly and reset""" table = Table() newPlayer = Player(0, '1', Role.HUMAN) table.activePlayers.append(newPlayer) newPlayer = Player(20, '2', Role.HUMAN) newPlayer.bet = 20 table.activePlayers.append(newPlayer) newPlayer = Player(40, '3', Role.HUMAN) newPlayer.bet = 20 table.activePlayers.append(newPlayer) for player in table.activePlayers: player.hand.add(Card(CardValues.QUEEN, Suits.DIAMONDS)) player.hand.add(Card(CardValues.QUEEN, Suits.DIAMONDS)) player.hand.add(Card(CardValues.QUEEN, Suits.DIAMONDS)) newPlayer = Player(40, '4', Role.HUMAN) newPlayer.bet = 20 newPlayer.hand.add(Card(CardValues.QUEEN, Suits.DIAMONDS)) newPlayer.hand.add(Card(CardValues.ACE, Suits.DIAMONDS)) table.activePlayers.append(newPlayer) table.hand.add(Card(CardValues.QUEEN, Suits.DIAMONDS)) table.hand.add(Card(CardValues.KING, Suits.DIAMONDS)) table.concludeRound() assert(len(table.activePlayers) == 2) assert (table.activePlayers[0].name == '3') assert (table.activePlayers[1].name == '4') assert (len(table.activePlayers[0].hand.cards) == 0) assert (table.activePlayers[0].purse == 20) assert (table.activePlayers[1].purse == 60) assert (len(table.activePlayers[1].hand.cards) == 0)
def test_dealInitialHands(self): """Each player should recive an card from the first to dealer in the initial deal This process should happend twice """ table = Table() newPlayer = Player(0, '1', Role.HUMAN) table.activePlayers.append(newPlayer) newPlayer = Player(20, '2', Role.HUMAN) newPlayer.bet = 20 table.activePlayers.append(newPlayer) newPlayer = Player(40, '3', Role.HUMAN) newPlayer.bet = 20 table.activePlayers.append(newPlayer) table.dealInitialHands() for player in table.activePlayers: assert(len(player.hand.cards) == 2) for i in range(len(table.activePlayers)): assert(table.activePlayers[i].hand.cards[0] == table.deck._Deck__deck[i]) assert(table.activePlayers[i].hand.cards[1] == table.deck._Deck__deck[i + 4]) assert(table.hand.cards[0] == table.deck._Deck__deck[3]) assert(table.hand.cards[1] == table.deck._Deck__deck[7])
def test_a_player_can_win_or_lose_a_hand(): p = Player() p.bet(100) assert p.bank == 900 p.payout(200) assert p.bank == 1100 p.bet(500) assert p.bank == 600 p.payout(0) assert p.bank == 600
class SetupGame: def __init__(self): # game logic related self.pot = 0 self.player = Player() self.dealer = Dealer() # interface related - add interface elements here self.root = Tk() self.root.title('Casino') self.root.iconbitmap( 'C:/Users/SavSamuShaman/Desktop/blackjack/pkc2.ico') # labels self.header_label = Label( self.root, text="You walk to the table and the dealer ask for your name") self.message_label = Label( self.root, text='Best of luck a the blackjack table ;)') self.error_message_label = Label(self.root) self.player_money_label = Label( self.root, text=f'Your money : {self.player.chips}') self.dealer_money_label = Label( self.root, text=f'Dealer money : {self.dealer.chips}') self.pot_label = Label(self.root, text=f'Pot : 0') self.current_score_label = Label(self.root, text=f'Current score : 0') # buttons self.hit_me_button = Button(self.root, text='Hit me', command=self.hit_me) self.stay_button = Button(self.root, text='Stay', command=self.stay) self.bet_button = Button(self.root, text='Bet', command=self.bet) self.start_button = Button(self.root, text='Tell the dealer your name', command=self.set_up_environ) # input box self.entry = Entry(self.root, width=30) # element placement self.header_label.grid(row=0, column=1) self.entry.grid(row=1, column=1, columnspan=3) self.start_button.grid(row=2, column=1, padx=15, pady=20) self.root.mainloop() def set_up_environ(self): name_input = self.entry.get() if name_input: self.player.name = name_input self.entry.delete(0, END) self.entry.grid_forget() self.start_button.grid_forget() # reusing existing elements self.header_label[ 'text'] = 'The Red Sparrow welcomes you, {name}'.format( name=self.player.name) self.start_button['text'] = 'Begin' self.start_button['command'] = self.new_round self.start_button.grid(row=4, column=1) self.message_label.grid(row=2, column=1) self.player_money_label.grid(row=3, column=2) self.dealer_money_label.grid(row=3, column=0) self.pot_label.grid(row=3, column=1) return def bet(self): """Clears variables and starts a new round on valid bet""" try: amount = int(self.entry.get()) if amount > self.player.chips: self.error_message_label['text'] = 'Not enough money' self.error_message_label.grid(row=6, column=1) return self.clear_game() self.pot += self.player.bet(amount) + self.dealer.bet(amount) self.entry.grid_forget() self.bet_button.grid_forget() self.error_message_label.grid_forget() self.entry.delete(0, END) self.current_score_label['text'] = 'Current score : 0' self.message_label[ 'text'] = 'Best of luck a the blackjack table ;)' self.pot_label['text'] = 'Pot :{pot}'.format(pot=self.pot) self.update_money_labels() self.current_score_label.grid(row=4, column=1) self.stay_button.grid(row=4, column=0) self.hit_me_button.grid(row=4, column=2) except ValueError: self.error_message_label['text'] = 'Invalid bet' self.error_message_label.grid(row=6, column=1) return def hit_me(self): # hit me --> deal me a card in blackjack card = self.dealer.deal_card() self.player.add_to_score(card) player_score = self.player.current_score if player_score < 21: pass elif player_score == 21: self.player.win(self.pot) self.message_label['text'] = f'{self.player.name} has Blackjack !' self.conclude_round() else: self.dealer.win(self.pot) self.message_label['text'] = f'{self.player.name} busted out' self.conclude_round() self.current_score_label['text'] = 'Current score : {score}'.format( score=player_score) return def stay(self): player_score = self.player.current_score player_points = abs(21 - player_score) dealer_points = abs(21 - conclude_game(self.dealer)) if dealer_points < player_points: self.dealer.win(self.pot) self.message_label[ 'text'] = f'The dealer was closer to 21. You lose' elif dealer_points == player_points: self.dealer.win(self.pot / 2) self.player.win(self.pot / 2) self.message_label['text'] = "It's a tie" else: self.player.win(self.pot) self.message_label['text'] = f"You win ${self.pot}" self.current_score_label[ 'text'] = f'Your score : {player_score} \nDealer score {self.dealer.current_score}' self.conclude_round() return def new_round(self): self.start_button.grid_forget() self.entry.grid(row=5, column=1) self.bet_button.grid(row=5, column=2) return def conclude_round(self): self.update_money_labels() self.hit_me_button.grid_forget() self.stay_button.grid_forget() self.new_round() return def clear_game(self): self.dealer.clear_score() self.player.clear_score() self.pot = 0 return def update_money_labels(self): self.dealer_money_label['text'] = f'Dealer money : {self.dealer.chips}' self.player_money_label['text'] = f'Player money : {self.player.chips}' return
def test_a_player_can_bet_amounts(): p = Player() assert p.bet(50) == 50 assert p.bank == 950
class TestPlayer(unittest.TestCase): def setUp(self): self.player = Player() def test_player_hand_property(self): self.player.hand = "8♥" self.assertEqual(self.player.hand, ["8♥"]) self.assertRaises(ValueError, setattr, self.player, "hand", 1) def test_player_money_property(self): self.assertEqual(self.player.money, Decimal("2000.0")) def test_hit_card(self): deck = ["8♥", "6♣", "2♦"] self.player.hit_card(deck) self.assertEqual(self.player.hand, ["8♥"]) self.assertEqual(self.player.points, 8) self.assertEqual(len(deck), 2) def test_show_points(self): deck = ["8♥", "6♣", "2♦"] for card in range(3): self.player.hit_card(deck) import sys from io import StringIO saved_stdout = sys.stdout try: fake_out = StringIO() sys.stdout = fake_out self.player.show_points() output = fake_out.getvalue().strip() self.assertEqual(output, "Points in game: 16") finally: sys.stdout = saved_stdout def test_show_hand(self): self.player.hand = ["8♥", "6♣", "2♦"] import sys from io import StringIO saved_stdout = sys.stdout try: fake_out = StringIO() sys.stdout = fake_out self.player.show_hand() output = fake_out.getvalue().strip() self.assertEqual(output, "The player have 3 cards: 8♥, 6♣, 2♦") finally: sys.stdout = saved_stdout def test_show_money(self): import sys from io import StringIO saved_stdout = sys.stdout try: fake_out = StringIO() sys.stdout = fake_out self.player.show_money() output = fake_out.getvalue().strip() self.assertEqual(output, "Money in game: 2000.0") finally: sys.stdout = saved_stdout def test_deal_cards(self): deck = ["8♥", "6♣", "2♦", "10♦", "3♣"] self.player.deal_cards(deck) self.assertEqual(self.player.hand, ["8♥", "6♣", "2♦"]) self.assertEqual(deck, ["10♦", "3♣"]) self.assertEqual(len(deck), 2) def test_bet(self): self.assertEqual(self.player.bet(100), 100) self.assertRaises(Exception, lambda: self.player.bet(10)) def test_get_card_value(self): self.assertEqual(self.player.get_card_value("6♣"), 6) def tearDown(self): pass