创建生成卡片的类

2024-04-18 12:51:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个名为Card的类,它将处理一张卡片(random),使用then deal方法,它将使用random处理一张卡片,然后我将定义face_值,它将返回Card对象的值,例如:1=one,12=queen。以下是目前为止的情况。我有点搞不清创建一个类是怎么工作的,有人能给我解释一下吗?因为这本书让我更加困惑。在

    import random
class Card:
def __init__(self):
    self.__value = 0

def deal(self):        
    self.__value = random.randint(1,13)        



def find_face_value(self):


    if value == 1:
        print ("Ace")      
    elif value == 2:
        print ("Two")
    elif value == 3:
        print ("Three")
    elif value == 4:
        print ("Four")
    elif value == 5:
        print ("Five")
    elif value == 6:
        print ("Six")
    elif value == 7:
        print ("Seven")
    elif value == 8:
        print ("Eight")
    elif value == 9:
        print ("Nine")
    elif value == 10:
        print ("Ten")
    elif value == 11:
        print ("Jack")
    elif value == 12:
        print ("Queen")
    elif value == 13:
        print ("King")
    else:
        # This will catch any invalid card values
        print ("Invalid card")
    return self.__value

这是第二个测试程序:

^{2}$

Tags: 对象方法self定义valuedefrandomcard
2条回答

你开局不错!你想在初始化对象时创建随机的卡片值(因为这就是初始化的目的),而且你不想在你的card类中有一个deal函数,因为那是用于deck的。我还建议使用列表值,而不是if-elif语句的集合。最后,有一种特定的方法可以打印出对象的状态/值/状态:字符串方法__str__(self)。在

import random
class Card:
  def __init__(self):
    self.value = random.randint(0,12)
    self.suit = random.randint(0,3)
    self.names = ['Ace', 'Two', 'Three', ..., 'Ten', 'Jack', 'Queen', 'King']
    self.suitNames = ['Spades', 'Diamonds', 'Clubs', 'Hearts']

  def  __str__(self):
    card = self.names[self.value] + 'of' + self.suitNames[self.suit]
    return card

>>>
>>> temp = Card()
>>> print(temp) # 'Two of Clubs'

这还没有经过测试,但你知道了大概的想法。 顺便说一句,几乎所有事情都需要自我。在

您可能需要将Card对象的表示与随机生成的Card分开。
下面是一种使用类变量指定str表示的方法:

import random


class Card:

    VALUES = {'1': 'Ace', 'A': 'Ace', 'J': 'Jack', '11': 'Jack', 'Q': 'Queen', '12': 'Queen', 'K': 'King', '13': 'King'}
    SUITS = {'H': 'hearts', 'S': 'spades', 'D': 'diamond', 'C': 'clubs'}

    def __init__(self, value, suit):
        self.value = str(value)
        self.suit = suit

    def __str__(self):
        return f"{Card.VALUES.get(self.value, self.value)} of {Card.SUITS[self.suit]}"


def get_random_card():
    return Card(random.randrange(1, 14), random.choice(list(Card.SUITS.keys())))


if __name__ == '__main__':

    for _ in range(10):
        print(get_random_card())

输出示例:

^{pr2}$

注:

这个例子从无限牌堆中抽取牌。同一张卡可以多次生成。在

如果你想限制牌的数量,你可以使用一个Deck类;可以这样:

class Deck:
    """represents a deck of 52 cards or a multiple of 52 cards"""

    def __init__(self, num_decks=1):
        self.cards = [Card(val, suit) for val in range(1, 14) for suit in list(Card.SUITS.keys()) for _ in range(num_decks)]
        self.num_decks = num_decks
        self.shuffled = False

    def __iter__(self):
        for card in self.cards:
            yield card

    def shuffle(self):
        random.shuffle(self.cards)
        self.shuffled = True

    def get_random_card(self):
        """removes a random card from the deck and returns it
        shuffles the deck if not already shuffled"""
        if not self.shuffled:
            self.shuffle()
        return self.cards.pop()


def get_random_card():
    return Card(random.randrange(1, 14), random.choice(list(Card.SUITS.keys())))


if __name__ == '__main__':

    deck = Deck(3)   # creates a Deck that holds 3x52 cards
    deck.shuffle()

    for idx, card in enumerate(deck):
        print(idx, card)

从那里,它很容易添加功能,将处理手从一个牌组到不同的球员。在

相关问题 更多 >