2017-12-30 57 views
1

私は自分のコードに助けが必要だと思いますが、エラーの内容や修正箇所を教えてくれません。以下は、トランプカードの基本デッキを扱ういくつかのクラスであり、デッキオブジェクトからカードをランダムに選択してハンドオブジェクトに入れ、そのオブジェクトをハンドオブジェクトから削除することで、私が作成した次の手は重複を拾わないでしょう。多分、これはそれについての鈍い考え方ですが、実世界のようにカードのデッキを管理する最善の方法と思われました。インスタンスオブジェクトをあるリストから別のリストに無作為にスワップする

問題は、ロギングメソッドまたは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本の手を作成するテストでは、重複したカードが表示されています。これは私が避けようとしているものです。

おかげ

答えて

0

あなたの外側の変数cardlistいうよりCardインスタンスです。

1つのアイテム(サンプルカード)を含むlistを、アイテム自体ではなくself.cardsリストに追加します。私はあなたの最後の行でカードを削除しようといくつかの混乱を引き起こしていると思う。

私はそれが問題を修正かどうかを確認するために

if card not in self.cards 

self.cards.append(card) 

card[0]cardを変更することをおすすめします。

また、deck.deck_cardsからサンプリングされているようです。私はdeckDeckオブジェクトだとしますが、あなたの与えられたDeck実装にはdeck_cards属性がないようです。私はそれがAttributeErrorを投げると思います。


また、自分自身を保存する(とあなたのコードを読んで誰も)いくつかの過度の混乱が、多分あなたは、あなたの内側のループでcard変数名を上書きしないようにしたいと思います。

+0

デッキはdeck_cards属性を持っていません。私は実際にこの質問の半分を昨日書きましたが、投稿しておらず、その間にpycharmの属性名を更新しました。 Deckの実装で "self.deck"と書かれているところでは、self.deck_cardsと言うべきです。私は「deck.deck」と言っていた場所を避けようとしていました。私はこの記事のコードを更新するのを忘れてしまった。 あなたは「カード」という言葉をあまりにも多く使うのは正しいです。私はそれを修正します。 あなたのお勧めは出力を変更しませんでしたが、どこから探し始めるかがわかりました。 –

+0

私はまた、カードがハートスーツのカードである場合にのみ、自分のコードがカードを取り除くことをテストを通して気づいた。 –

0

私はredditで/ r/learnpythonの/ u/Zigity_Zagityから助けを得ました。私のコードのわずかな書き換え、彼のおかげで:

def create_hand(self, deck): 
     self.cards = random.sample(deck.deck_cards, k=self.size) 

     deck.deck_cards = [card for card in deck.deck_cards if card not in self.cards] 

     deck.log_deck() 
     return self.cards 

、カードオブジェクトの__eq__固定方法:

def __eq__(self, other): 
    return self.value == other and self.suit.value == other 
関連する問題