Question: My code isn't working. This is my version without the addition of instructions yet. I need to define these rules of Chinese BlackJack (I found

My code isn't working. This is my version without the addition of instructions yet. I need to define these rules of Chinese BlackJack (I found the rules on Wilkipedia).

  • All hands including the dealer must reach at least15 points(reached 'license' or 'passport'), or a penalty applies (usually the offender has to pay all players).
  • The maximum number of cards to be drawn is 5 only.
  • Aburnrule may apply to make things more exciting. Players receiving the initial 2 cards of 15 points may get a new lease of luck by drawing a fresh set of cards by doubling up their original bet. It gets interesting when the dealer does the burn, as all players must then double up as well. Players may choose not to 'burn' with the dealer by forfeiting the bet.
  • A Blackjack is one that has 21 points achieved by a ten/picture card + an ace, and usually is paid as 1:2.
  • In addition, other special winning conditions apply:
  • Any combination to 21 points (usually paid out as 1:2), drawn to a maximum of 5 cards.
  • Surviving unbusted at 5 cards (usually 1:2 depending on house rules).
  • Unbusted at 5 cards AND 21 (usually 1:3 depending on house rules).
  • Triple 7 21 (usually a big payout from 1:5 to 1:21, depending on house rules).
  • Unlike Chinese Blackjack described below, pairs has no winning privileges.
  • Players to reveal busted cards (depending on house rules)
  • The dealer's turn is always last. He may choose selectively open the hands of the players, and make an immediate payout/collect according to the points he has at hand. After that, he may continue to hit himself to chance if he can get higher points, or bust. This feature gives a perception of 'another lifeline' as the dealer with a bad card like 16 or 17 points can eliminate players with 3 or 4 cards on the likelihood that they have busted, before attempting another attempt to beat players with 2 cards which are likely to be good cards (18 to 21).

I need to add the ability to use multiple decks of cards. I need to incorporate a method to check to see if there are enough cards left, and if not, repopulate and shuffle the multiple decks of cards (this is where I have errors as it's reshuffling more than once). I cannot figure it out where I went wrong.

I also need to incorporate a betting feature to allow players to bet on their hand and keep track of their winnings/losings and store the cash values to a text file.

Please #comment# on what you add or change so I may thoroughly examine and compare with my attempt. My thought process may just be way off. Or I just really suck at Python.

import cards, games

class BJ_Card(cards.Card):

""" A Blackjack Card. """

ACE_VALUE = 1

def get_value(self):

if self.is_face_up:

value = BJ_Card.RANKS.index(self.rank) + 1

if value > 10:

value = 10

else:

value = None

return value

value = property(get_value)

class BJ_Deck(cards.Deck):

""" A Blackjack Deck. """

def populate(self):

for suit in BJ_Card.SUITS:

for rank in BJ_Card.RANKS:

self.cards.append(BJ_Card(rank, suit))

def deal(self, hands, per_hand=1):

for rounds in range(per_hand):

if len(self.cards)>=7*(len(hands)):

print "Reshuffling the deck."

self.cards=[]

self.populate()

self.shuffle()

for hand in hands:

top_card=self.cards[0]

self.give(top_card, hand)

class BJ_Hand(cards.Hand):

""" A Blackjack Hand. """

def __init__(self, name):

super(BJ_Hand, self).__init__()

self.name = name

def __str__(self):

rep = self.name + ":\t" + super(BJ_Hand, self).__str__()

if self.total:

rep += "(" + str(self.total) + ")"

return rep

def get_total(self):

# if a card in the hand has value of None, then total is None

for card in self.cards:

if not card.value:

return None

# add up card values, treat each Ace as 1

total = 0

for card in self.cards:

total += card.value

# determine if hand contains an Ace

contains_ace = False

for card in self.cards:

if card.value == BJ_Card.ACE_VALUE:

contains_ace = True

# if hand contains Ace and total is low enough, treat Ace as 11

if contains_ace and total <= 11:

# add only 10 since we've already added 1 for the Ace

total += 10

return total

total = property(get_total)

def is_busted(self):

return self.total > 21

class BJ_Player(BJ_Hand):

""" A Blackjack Player. """

def is_hitting(self):

response = games.ask_yes_no(" " + self.name + ", do you want a hit? (Y/N): ")

return response == "y"

def bust(self):

print self.name, "busts."

self.lose()

def lose(self):

print self.name, "loses."

def win(self):

print self.name, "wins."

def push(self):

print self.name, "pushes."

class BJ_Dealer(BJ_Hand):

""" A Blackjack Dealer. """

def is_hitting(self):

return self.total < 17

def bust(self):

print self.name, "busts."

def flip_first_card(self):

first_card = self.cards[0]

first_card.flip()

class BJ_Game(object):

""" A Blackjack Game. """

def __init__(self, names):

self.players = []

for name in names:

player = BJ_Player(name)

self.players.append(player)

self.dealer = BJ_Dealer("Dealer")

self.deck = BJ_Deck()

self.deck.populate()

self.deck.shuffle()

def get_still_playing(self):

remaining = []

for player in self.players:

if not player.is_busted():

remaining.append(player)

return remaining

# list of players still playing (not busted) this round

still_playing = property(get_still_playing)

def __additional_cards(self, player):

while not player.is_busted() and player.is_hitting():

self.deck.deal([player])

print player

if player.is_busted():

player.bust()

def play(self):

# deal initial 2 cards to everyone

self.deck.deal(self.players + [self.dealer], per_hand = 2)

self.dealer.flip_first_card()# hide dealer's first card

for player in self.players:

print player

print self.dealer

# deal additional cards to players

for player in self.players:

self.__additional_cards(player)

self.dealer.flip_first_card()# reveal dealer's first

if not self.still_playing:

# since all players have busted, just show the dealer's hand

print self.dealer

else:

# deal additional cards to dealer

print self.dealer

self.__additional_cards(self.dealer)

if self.dealer.is_busted():

# everyone still playing wins

for player in self.still_playing:

player.win()

else:

# compare each player still playing to dealer

for player in self.still_playing:

if player.total > self.dealer.total:

player.win()

elif player.total < self.dealer.total:

player.lose()

else:

player.push()

# remove everyone's cards

for player in self.players:

player.clear()

self.dealer.clear()

def main():

print "\t\tWelcome to Blackjack! "

names = []

number = games.ask_number("How many players? (1 - 7): ", low = 1, high = 8)

for i in range(number):

name = raw_input("Enter player name: ")

names.append(name)

print

game = BJ_Game(names)

again = None

while again != "n":

game.play()

again = games.ask_yes_no(" Do you want to play again?: ")

main()

raw_input(" Press the enter key to exit.")

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Programming Questions!