私は自分のコードに助けが必要だと思いますが、エラーの内容や修正箇所を教えてくれません。以下は、トランプカードの基本デッキを扱ういくつかのクラスであり、デッキオブジェクトからカードをランダムに選択してハンドオブジェクトに入れ、そのオブジェクトをハンドオブジェクトから削除することで、私が作成した次の手は重複を拾わないでしょう。多分、これはそれについての鈍い考え方ですが、実世界のようにカードのデッキを管理する最善の方法と思われました。インスタンスオブジェクトをあるリストから別のリストに無作為にスワップする
問題は、ロギングメソッドまたはcreate_hand()メソッドのいずれかです。私のコードを実行した後で私の手を見ると、私はログのレポートに行くと、私の手のカードがまだデッキに入っているのが分かります。代わりに、削除された別のカードがあります。それはデッキから取り出したカードの正しい数を報告しますが、カードの枚数を数えたタリーでハートを取り出しただけであることも報告しています。しかし、私の手にはユニークな価値とスーツを持つユニークなカードのランダムな品揃えがあります。それでその部分は機能します。
class Suit(Enum):
HEARTS = "Hearts"
CLUBS = "Clubs"
DIAMONDS = "Diamonds"
SPADES = "Spades"
class Card:
def __init__(self, suit, value):
self.suit = suit
self.value = value
if self.suit == 1:
self.suit = Suit.HEARTS
elif self.suit == 2:
self.suit = Suit.CLUBS
elif self.suit == 3:
self.suit = Suit.DIAMONDS
else:
self.suit = Suit.SPADES
#and a host of magic methods that are irrelevant
class Deck:
def __init__(self, deck_size):
self.deck_size = deck_size
self.deck = []
card_suit = 1
card_value = 2
while len(self.deck) < self.deck_size:
self.deck.append(Card(suit=card_suit, value=card_value))
card_value += 1
if card_value > 14:
card_suit += 1
card_value = 2
def log_deck(self):
logging.info("Deck cards: {}".format(len(self.deck)))
hearts = clubs = diamonds = spades = 0
for card in self.deck:
if card.suit == Suit.HEARTS:
hearts += 1
elif card.suit == Suit.CLUBS:
clubs += 1
elif card.suit == Suit.DIAMONDS:
diamonds += 1
else:
spades += 1
logging.info("{} |".format(str(card)))
logging.info("Hearts: {}, Clubs: {}, Diamonds: {}, Spades: {}".format(hearts, clubs, diamonds, spades))
logging.info("*"*20)
class Hand:
def __init__(self, size=2):
self.size = size
self.cards = []
def create_hand(self, deck):
self.cards = []
while len(self.cards) < self.size:
card = random.sample(deck.deck_cards, k=1)
card_value = card[0].value
card_suit = card[0].suit
if card not in self.cards:
self.cards.append(card)
for card in deck.deck_cards:
if card.value == card_value and card.suit == card_suit:
deck.deck_cards.remove(card)
deck.log_deck()
return self.cards
次に、ログの表示例を示します。簡潔にするため、私はリストからカードのほとんどをカット:下部の
INFO:root:Deck cards: 47
INFO:root:|2 of Hearts| |
INFO:root:|3 of Hearts| |
INFO:root:|5 of Hearts| |
INFO:root:|6 of Hearts| |
....
INFO:root:|King of Spades| |
INFO:root:|Ace of Spades| |
INFO:root:Hearts: 8, Clubs: 13, Diamonds: 13, Spades: 13
INFO:root:********************
タリーは、私の手は心を持っていない場合でも、常に手が生成された後にのみ、8心があることを示しているように見えます、そして欠けているカードが心でないとしても。
私のログが誤ってロギングしているのか、正しくカードを削除していないのかは分かりません。または両方。同じデッキを使用して2本の手を作成するテストでは、重複したカードが表示されています。これは私が避けようとしているものです。
おかげ
デッキはdeck_cards属性を持っていません。私は実際にこの質問の半分を昨日書きましたが、投稿しておらず、その間にpycharmの属性名を更新しました。 Deckの実装で "self.deck"と書かれているところでは、self.deck_cardsと言うべきです。私は「deck.deck」と言っていた場所を避けようとしていました。私はこの記事のコードを更新するのを忘れてしまった。 あなたは「カード」という言葉をあまりにも多く使うのは正しいです。私はそれを修正します。 あなたのお勧めは出力を変更しませんでしたが、どこから探し始めるかがわかりました。 –
私はまた、カードがハートスーツのカードである場合にのみ、自分のコードがカードを取り除くことをテストを通して気づいた。 –