2017-12-30 18 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:******************** 

항상 손이 생성 된 후 내 손은 마음이없는 경우에도 여덟 마음이 있다는 것을 보여줄 것 : 간결성을 위해 나는 목록에서 카드의 대부분을 잘라 , 그리고 빠진 카드가 마음이 아닐지라도.

본질적으로 로그가 잘못 기록되고 있는지, 카드를 올바르게 제거하지 못하는지 알 수 없습니다. 아니면 둘다. 같은 덱을 사용하여 두 손을 만드는 몇 가지 테스트는 중복 카드를 보여 주므로 피하려고합니다.

감사

답변

0

귀하의 외부 변수 cardlist보다는 Card 인스턴스입니다.

하나의 항목 (샘플 카드)을 포함하는 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 
관련 문제