Last active
August 29, 2015 14:05
-
-
Save nivir/ea2188c4b57a2953e2ba to your computer and use it in GitHub Desktop.
BlackJack Game written in python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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