<p>这更多的是一个代码/方法审查。纸牌游戏是一种组合游戏,而不是继承游戏;<code>Deck</code>包含<code>Card</code>s,但它本身不是<code>Card</code>的一种类型,反之亦然。</p>
<p>我认为你在复制<code>Card</code>中的信息。只需存储套装和等级,然后使用<code>__str__</code>创建<code>'x of y'</code>。您还可以实现<a href="https://docs.python.org/2/reference/datamodel.html#object.__lt__" rel="noreferrer">rich comparison methods</a>:</p>
<pre><code>class Card(object):
FACES = {11: 'Jack', 12: 'Queen', 13: 'King', 14: 'Ace'}
def __init__(self, rank, suit):
self.suit = suit
self.rank = rank
def __str__(self):
value = self.FACES.get(self.rank, self.rank)
return "{0} of {1}".format(value, self.suit)
def __lt__(self, other):
return self.rank < other.rank
</code></pre>
<p>现在例如<code>str(Card(13, 'Clubs')) == "King of Clubs"</code>。这样就不会在<code>card</code>中复制<code>rank</code>和<code>value</code>。</p>
<p>接下来,我认为<code>Deck</code>应该将population生成合并到<code>__init__</code>;您可以为非标准组提供可选参数。我包含了两个实现;注释掉的版本是一个列表理解,使用<code>itertools</code>在一行中完成相同的工作。我还提供了一个从<code>self.deck</code>中选取<code>n</code>不同随机卡的函数。</p>
<pre><code>from itertools import product
import random
class Deck(object):
def __init__(self, ranks=None, suits=None):
if ranks is None:
ranks = range(2, 15)
if suits is None:
suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
## self.deck = [Card(r, s) for r, s in product(ranks, suits)]
self.deck = []
for r in ranks:
for s in suits:
self.deck.append(Card(r, s))
def deal(self, n):
return random.sample(self.deck, n)
</code></pre>
<p>现在这个游戏很简单了;由于比较方法的缘故,你可以每手发三张牌,然后自然地(使用<code><</code>)比较牌。</p>
<pre><code>deck = Deck()
hand = deck.deal(3)
print(" - ".join(map(str, hand)))
if min(hand[0], hand[1]) < hand[2] < max(hand[0], hand[1]):
print("Winner!")
else:
print("Loser.")
</code></pre>