OO Black Jack Game - 计算手牌价值

时间:2014-06-01 15:50:56

标签: python

运行程序将导致错误消息:

TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'

问题在于行value += values.get(card.get_rank)

我认为get_rank方法可能存在问题?它不返回整数吗?

ranks = ('A','2','3','4','5','6','7','8','9','10','J','Q','K')
values = {'A':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':10,'Q':10,'K':10}
suits = ('Diamonds','Hearts','Clubs','Diamonds')
class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
    def __str__(self, suit, rank):
        print (self.rank + 'of' + self.rank)
    def get_rank(self):
        return self.rank
class Hand:
    def __init__(self):
        self.hand = []
    def __str__(self):
        hand = ''
        for card in self.hand:
            hand = hand + str(card)
        return hand
    def get_value(self):
        value = 0
        aces = 0
        for card in self.hand:
            if card.get_rank == 'A':
                aces += 1
            value += values.get(card.get_rank)

            if (aces>0) and (value + 10 <= 21):
                value += 10
        return value

1 个答案:

答案 0 :(得分:1)

values.get(card.get_rank)尝试使用实例方法作为字典的键。这不是字典中的有效密钥,因此dict.get()会返回默认的None

相反,您希望调用方法,并使用return值作为键:

value += values.get(card.get_rank())

或者,由于普通的getter和setter是unpythonic,只需直接访问该属性:

value += values.get(card.rank)

请注意,您也可以将默认值传递给dict.get(),以确保始终获得合理的返回值:

value += values.get(card.rank, 0)

现在,如果values中的卡等级没有值,则假定其值为零。


此外,还不清楚values的来源。我建议你把它作为类属性

class Hand:

    VALUES = {...}

    ...

    def get_value(self):
        ...
            value += self.VALUES.get(card.rank, 0)
             ...

get_value的明确论据:

class Hand:

    ...

    def get_value(self, values):
        ...
            value += self.values.get(card.rank, 0)
            ...