Rosalie
Rosalie

Reputation: 7

Trouble giving values to deck of cards

(Cards numbered 2-10 should be valued from 2-10, respectively. J,Q, and K should be 10, and A should be either 1 or 11, depending on the value of the hand).

How do I assign the deck these values? Also, the game needs to be 3 rounds. The way I did it is only one round. How do I make the game go three times, while keeping track of the players wins/losses?

Could someone please explain how I can do this a simple way?

Upvotes: 1

Views: 976

Answers (3)

Joran Beasley
Joran Beasley

Reputation: 113978

here is a complete implementation for you

look at hand.Score

import random

class Card:
    def __init__(self,rank,suite):        
        self.rank = rank
        self.suite = suite
    def Rank(self):
        return "Ace Two Three Four Five Six Seven Eight Nine Ten Jack Queen King".split()[self.rank]
    def Suite(self):
        return "Hearts Spades Clubs Diamonds".split()[self.suite]
    def __str__(self):
        #print "Get Self:",type(self)
        #print "Dir:",dir(self)
        #return "OF"
        return self.Rank()+" of "+ self.Suite()


class Hand:
    def __init__(self):
        self.cards = []
    def Score(self):
        aces_ct = 0
        score = 0
        for c in self.cards:
            if c.rank == 0:
                aces_ct += 1
                score += 11
            if 0 < c.rank < 9:
                score += c.rank+1
            else:
                score += 10
        while score > 21 and aces_ct > 0:
            score -= 10
            aces_ct -= 1
        return score
    def add(self,card):
        self.cards.append(card)
    def Show(self,show_only=None):
        if not show_only:
            for k in self.cards:
                print "%s"%k
        else:
            if isinstance(show_only,int):
                print "%s"%self.cards[show_only]
            elif isinstance(show_only,(list,tuple)):
                for idx in show_only:
                    print "%s"%self.cards[idx]


class deck:
    def __init__(self):
        self.cards = []
        for i in range(4):
            for j in range(13):
                self.cards.append(Card(j,i))
        random.shuffle(self.cards)
    def shuffle(self):
        random.shuffle(self.cards)
    def pop(self):
        return self.cards.pop()

if __name__ == "__main__":
    d = deck()
    player_hand = Hand()
    dealer_hand = Hand()
    player_hand.add(d.pop())
    dealer_hand.add(d.pop())
    player_hand.add(d.pop())
    dealer_hand.add(d.pop())
    print "Player Score :",player_hand.Score()
    player_hand.Show()
    print "\n\nDealer Score :",dealer_hand.Score()
    dealer_hand.Show()

Upvotes: 1

Janus Troelsen
Janus Troelsen

Reputation: 21290

You should probably calculate the total dynamically. Also, you need some kind of way to store the money of each individual player. Right now, there is no way of knowing the distribution of money since you only have one total.

Upvotes: 0

steveha
steveha

Reputation: 76715

You can represent cars as tuples: a character indicating suit, and a number indicating value. I would also add a third value to the tuple, its blackjack value (e.g. a king and a queen both count as a 10).

card = ('D', 11, 10)  # card is queen of diamonds

You could also make your own class to represent cards.

class Card(object):
    def __init__(self, suit, number):
        self.suit = suit
        self.number = number
        self.value = (number if 2 <= number <= 9 else 10)

You will have to special-case the value of the ace, of course.

Upvotes: 0

Related Questions