制作一副牌的最佳方法是什么?

2024-05-18 11:16:09 发布

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

我在考虑做一副纸牌来玩纸牌游戏。我可以把所有的卡片列一张单子(我不太在乎西装),但我想知道是否有一种更简单的方法可以做到这一点。

cards = ['1','1','1','1'....]

我肯定你可以做一个for循环来创建4张同样值的卡并将其添加到列表中,但我想知道这是否是最好的解决方案。我还不够先进,无法了解或创建一个Class,我已经看到它作为其他解决方案提供,但我愿意接受解释。

我已经编了一本字典来定义卡片的价值。


Tags: 方法游戏列表for字典定义解决方案class
3条回答

我建议你用一个基本的类用法来解决这个问题。

首先,让我们创建一个Card类:

class Card:
    def __init__(self, value, color):
        self.value = value
        self.color = color

然后,让我们列出颜色列表:

colors = ['heart', 'diamonds', 'spades', 'clubs']

最后,让我们建立一个列表理解你的甲板:

deck = [Card(value, color) for value in range(1, 14) for color in colors]

Card类只是一个包装器,只是用来操作卡片而不是元组,这感觉更自然。

在当前状态下,它几乎等同于重命名tuple类型。。。基本上,它只包含一个设置实例属性的构造函数__init__

因此,当我在列表理解中调用Card(value, color)时,例如Card(11, 'spades'),就会创建Card类的一个新实例,它的value属性设置为11,其color属性设置为'spades'

我建议您阅读一些关于OOP的教程,以深入理解这些概念。


现在,您可以尝试改进这个想法,例如使用更详细的values列表而不是range(1, 14)

values = ['ace', '2', ..., 'king']

另一种方法可以使用namedtuplefrom collections模块完成,如以下示例:

from collections import namedtuple

Card = namedtuple('Card', ['value', 'suit'])
suits = ['hearts', 'diamonds', 'spades', 'clubs']
cards = [Card(value, suit) for value in range(1, 14) for suit in suits]

您可以访问如下值:

print(cards[0])
>>> Card(value=1, suit='hearts')
print(cards[0].value, cards[0].suit)
>>> 1 hearts

首先是一些实用功能:

import random
from random import shuffle

def RANKS(): return [ "Ace", "2", "3", "4", "5", "6", "7","8", "9", "10", "Jack", "Queen", "King" ]
def SUITS(): return [ "Clubs", "Diamonds", "Hearts", "Spades" ]

然后是卡片类:

class Card:

    def __init__( self, rank, suit ):
        self.rank = rank
        self.suit = suit

    def __str__( self ):
        return self.rank + " of " + self.suit

然后是甲板班:

class Deck:

    def __init__( self ):
        self.contents = []
        self.contents = [ Card( rank, suit ) for rank in RANKS() for suit in SUITS() ]
        random.shuffle( self.contents )

相关问题 更多 >