如何通过用整数更改列表中的某些字母来对包含字母的列表求和?

How to sum a list that contains letters by changing certain letters in a list with integers?

刚开始学习 Python,我正在尝试制作二十一点游戏。我想找到玩家手中牌值的总和。我的方法是将字母“J”、“Q”、“K”的值更改为 10,将“A”的值更改为 11。我已经定义了 class 卡片,但是当我 运行代码,我收到一条错误消息“type object 'Card' has no attribute 'value'”


import random


DEFAULT_SUITS = ("Clubs","Hearts","Diamonds","Spades")
DEFAULT_VALUES = ("A",2,3,4,5,6,7,8,9,10,"J","Q","K")


class Card():
    def __init__ (self, suit, value):
        self.suit = suit
        self.value = value
    
    def show(self):
        print(self.value, self.suit)

  
class Shoes():
    def __init__(self, decks, suits=DEFAULT_SUITS, values=DEFAULT_VALUES):
        self.cards = []
        for deck in range(decks):
            for suit in suits:
                for value in values:
                    self.cards.append(Card(suit,value))
        random.shuffle(self.cards) 
        
    def show(self):
        for card in self.cards:
            card.show()
    
    def drawcard(self):
        return self.cards.pop()
    
          
class Player():
    def __init__ (self, name):
        self.name = name
        self.hand = []
    
    def drawcard(self, shoes):
        self.hand.append(shoes.drawcard())
        return self
    
    def totalvalue(self):
        for card in self.hand:
            if Card.value == "J":
                self.hand = [10 if card=="J" else card for card in cards]
            if Card.value == "Q":
                self.hand = [10 if card=="Q" else card for card in cards]
            if Card.value == "K":
                self.hand = [10 if card=="K" else card for card in cards]
            if Card.value == "A":
                self.hand = [11 if card=="A" else card for card in cards]    
        self.totalvalue = sum(self.hand(Card.value))
    
    def showhand(self):
        for card in self.hand:
            card.show()
            
shoe = Shoes(int(input("Enter the number of deck used in a shoes: ")))

bob = Player("bob")
bob.drawcard(shoe)
bob.showhand()
bob.totalvalue()

如何更改手头的值“J”、“Q”、“K”、“A”,然后将其相加得到总值?

你用过Card.value,其中Card是一个class实例,只需将totalvalue函数中的Card改为card即可

接下来,我会建议制作一本字典; 并从偶数中获取每个值。

dict = {'A':1, '2':2,.......}

等等,像这样

def totalvalue(self):
   self.totalvalue =0;
   dict = {'A':1, '2':2,.......};
       for card in self.hand:
            self.totalvalue = self.totalvalue +dict[card.value]

我发现在使用卡片列表时有些混乱。这是你应该做的

def totalvalue(self):
    total = 0
    for card in self.hand:
        if card.value in ["J", "Q", "K"]:
            total = total + 10
        elif card.value == "A":
            total = total + 11
        else:
            total = total + card.value
        
    self.totalvalue = total

可以使用列表推导式进一步简化代码,如下所示

def totalvalue(self):
    return  sum([10 if card.value in ['J', 'Q', 'K'] else 11 if card.value == 'A' else card.value for  card in self.hand])