i made a blackjack game and i’m having problems counting my cards with the aces. Can someone help me clean my code
class Player(): def __init__(self, name): self.bust = False self.hand = [] self.hand2 = [] self.name = str(name) self.handlist = [] def hit(self): for i in self.handlist: response = '' while response != 'h' or response != 's': print(self.name) print(i) print("Do you want to hit or stand? (h/s)") print(self.gettotal(i)) response = str(input()) if response == 'h': phand = i card = pickacard(deck) phand.append(card) i = phand phand = [] grade = self.gettotal(i) if grade > 21: self.bust = True print(i) print(self.gettotal(i)) print("Player busts!") break else: break def gettotal(self, hand): total = 0 if hand == []: total = 0 return total for i in range(len(hand)): t = int(hand[i][0]) if t == 11 or t == 12 or t == 13: total += 10 elif t != 1: total += t elif t == 1 and total < 22: total += 11 if total > 21: i = len(hand)-1 while i >= 0: t = int(hand[i][0]) if t == 1: total -= 10 break i -= 1 t = 0 return total
i have those exemple:
player1
[[‘1’, ‘D’], [’11’, ‘C’], [’11’, ‘D’], [‘1’, ‘H’]]
Do you want to hit or stand? (h/s)
total = 21
player1
[[‘1’, ‘D’], [’10’, ‘D’], [’11’, ‘H’], [‘1’, ‘H’]]
Do you want to hit or stand? (h/s)
total = 21
Advertisement
Answer
Something like this:
def gettotal(self, hand): total = 0 aces = False for card in hand: t = int(card[0]) if t > 11: total += 10 elif t == 1: aces = True total += 1 else: total += t if aces and total <= 11: total += 10 return total
And, by the way, any card game that shows 1, 11, 12 and 13 instead of A, J, Q, K is not worth playing. Since you’re storing the cards as strings anyway, why not just store the familiar letters? It would take very minor changes to your code, and the user experience would be much better:
def gettotal(self, hand): total = 0 aces = False for card in hand: t = card[0] if t in "JQK": total += 10 elif t == 'A': aces = True total += 1 else: total += int(t) if aces and total <= 11: total += 10 return total