Skip to content

Instantly share code, notes, and snippets.

@nivir
Last active August 29, 2015 14:05
Show Gist options
  • Save nivir/ea2188c4b57a2953e2ba to your computer and use it in GitHub Desktop.
Save nivir/ea2188c4b57a2953e2ba to your computer and use it in GitHub Desktop.
BlackJack Game written in python
import ColorLog
import random
import copy
import Deck
import Hand
import CardShuffle
import Player
class BlackJack():
def __init__(self, num_players=1, num_decks=8):
self.positions = []
self.num_players = num_players
self.num_decks = num_decks
for i in xrange(num_players):
self.positions.append([Player.Player(), []])
self.dealer = Hand.Hand()
self.cardstack = CardShuffle.CardShuffle(num_decks)
self.chips = 0
def blackjack_play(self):
while True:
if len(self.cardstack) < 52:
self.cardstack = CardShuffle(self.num_decks)
self.dealer = Hand.Hand()
new_positions = []
for player, hands in self.positions:
bet = player.player_bet_value()
if bet == 'q':
print player, 'Quit'
self.num_players -= 1
if self.num_players == 0:
print 'Game over.'
ColorLog.game_instruction_colour("*"*40)
return
continue
new_positions.append([player, [Hand.Hand(bet)]])
self.positions = new_positions
self.card_deals()
self.dealer_player_status()
if self.dealer.valid_moves == 'Blackjack':
print 'Dealer Blackjack!'
ColorLog.game_instruction_colour("*"*40)
for player, hands in self.positions:
if hands[0].valid_moves == 'Blackjack':
player.chips += hands[0].bet
print str(player) + ' Dealer Blackjack.'
ColorLog.game_instruction_colour("*"*40)
continue
card_hands = []
for player, hands in self.positions:
for hand in hands:
#TODO: Checking for 21 or Blackjack and loop until 21, decide bust, or stay
while True:
if hand.valid_moves == 'Blackjack':
print str(player) + ' has Blackjack and Wins ' + str(2 * hand.bet) + ' Chips!'
player.chips += 2 * hand.bet
break
if hand.valid_moves == '21':
print str(player) + ' has 21'
card_hands.append([player, hand])
break
selected_move = player.command_value(copy.deepcopy(hand))
if selected_move == 'Stay':
if len(hand.values) == 2:
print str(player) + ' stays on soft ' + str(hand.values[1])
else:
print str(player) + ' stays on ' + str(hand.values[0])
card_hands.append([player, hand])
break
if selected_move == 'Hit':
new_card = self.cardstack.draw()
print player, 'hits and draws a', new_card
hand.add_card(new_card)
if hand.valid_moves == 'Bust':
ColorLog.error_colour( 'Bust!')
ColorLog.game_instruction_colour("*"*40)
break
if selected_move == 'Double':
new_card = self.cardstack.draw()
print player, 'doubles down and draws a', new_card
hand.add_card(new_card)
hand.bet *= 2
if hand.valid_moves == 'Bust':
ColorLog.error_colour( 'Bust!')
ColorLog.game_instruction_colour("*"*40)
break
print str(player) + ' ends on ' + str(max(hand.values))
card_hands.append([player, hand])
break
if selected_move == 'Split':
print player, ' Splits two ', str(hand.cards[0].rank)
index = hands.index(hand) + 1
hand1 = Hand(hand.bet)
hand1.add_card(hand.cards[0])
hand2 = Hand(hand.bet)
hand2.add_card(hand.cards[1])
hands.insert(index, hand2)
hands.insert(index, hand1)
break
if not card_hands:
continue
while True:
has_dealer_soft = False
if len(self.dealer.values) == 2:
has_dealer_soft = True
dealer_value = self.dealer.values[1]
else:
dealer_value = self.dealer.values[0]
if dealer_value > 17 or (dealer_value == 17 and has_dealer_soft is False):
break
else:
card = self.cardstack.draw()
self.dealer.add_card(card)
print 'Dealer hits and draw ' + str(card)
#TODO: if dealer busts, then all staying hands win
is_dealer_busted = False
if self.dealer.valid_moves == 'Bust':
print 'Dealer Busts!\n'
is_dealer_busted = True
else:
print 'Dealer Value: ' + str(self.dealer)
print 'Dealer Value: ' + str(dealer_value)
for player, hand in card_hands:
# win
if is_dealer_busted or max(hand.values) > max(self.dealer.values):
player.chips += 2 * hand.bet
print str(player) + ' Wins ' + str(2 * hand.bet) + ' chips values : ' + str(hand)
# push
elif max(hand.values) == max(self.dealer.values):
player.chips += hand.bet
print str(player) + ' hand values : ' + str(hand) + ' and Wins ' + str(hand.bet) + ' back'
# loss
else:
print str(player) + ' Loses values : ' + str(hand)
ColorLog.error_colour('End of Round.\n')
ColorLog.game_instruction_colour("*"*40)
def card_deals(self):
for i in xrange(2):
for player, hands in self.positions:
hands[0].add_card(self.cardstack.draw())
self.dealer.add_card(self.cardstack.draw())
def dealer_player_status(self):
for player, hands in self.positions:
ColorLog.dealer_colour("*"*40+"\n")
print 'Player ' + player.name
for i, hand in enumerate(hands):
print 'Hand ' + str(i) + ': ' + str(hand)
ColorLog.dealer_colour("*"*40+"\n")
print 'Dealer: ' + str(self.dealer)
ColorLog.dealer_colour("*"*40+"\n")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment