我如何实现塔罗牌是竖直的还是反向的?

2024-03-29 08:30:52 发布

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

我修改了Luciano Ramalho从Fluent Python生成的FrenchDeck类,试图构建塔罗牌甲板。由于元组是不可变的,我无法存储卡是否在元组中反转,因此我实现了如下所示的方向

import collections
from random import getrandbits

Card = collections.namedtuple('Card', ['rank','suit'])

class FrenchTarot:
  ranks = [str(n) for n in range(1,11)]+['Page','Knight','Queen','King']
  suits = 'wands swords coins cups'.split()
  major_arcana = ['The Fool', 'The Magician', 'The High Priestess', 'The Empress',
                  'The Hierophant', 'The Lovers', 'The Chariot', 'Strength',
                  'The Hermit', 'Wheel of Fortune', 'Justice', 'The Hanged Man',
                  'Death', 'Temperance', 'The Devil', 'The Tower', 'The Star',
                  'The Moon', 'The Sun', 'Judgement', 'The World']

  def __init__(self):
    self.minor = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
    self.major = [Card(rank, 'Major Arcana') for rank in self.major_arcana]
    self._cards = self.major + self.minor

  def __len__(self):
    return len(self._cards)

  def __repr__(self):
    return f'Tarot Deck containing {len(self)} cards, {len(self.major)} Major Arcana, and {len(self.minor)} Minor Arcana'

  def __getitem__(self,position):
    if getrandbits(1):
      orientation = 'Upright'
    else:
      orientation = 'Reversed'
    return self._cards[position], orientation

  def __setitem__(self, position, card):
    self._cards[position] = card

当我尝试测试时,问题就出现了

Card('The Fool', 'Major Arcana') in deck

它返回False,使其返回True的唯一方法是指定方向(并正确地随机猜测)。我不知道如何处理这个问题,将每张卡与一个方向关联起来,当一张卡被拉出来时,这个方向可能会随机改变

编辑:很抱歉在第一次oops时发布了错误的代码块


1条回答
网友
1楼 · 发布于 2024-03-29 08:30:52

如果要使用card in deck,但in的行为不符合您的要求,可以使用__contains__魔术方法覆盖该行为。这将使您能够编写忽略方向属性的自定义测试

您还可以创建一个Card类,该类重写__eq__以比较它们的等级和适合度,但忽略它们的方向,以便直观地使用==

相关问题 更多 >