내 코드에 도움이 필요하다고 생각합니다. 오류가 무엇인지 해결할 위치를 알 수 없습니다. 다음은 카드 놀이의 기본 데크를 다루는 여러 클래스입니다. 갑판에서 무작위로 카드를 선택하여 손으로 물건에 넣은 다음 손으로 물건에서 물건을 삭제하면됩니다. 내가 만든 다음 손으로 중복을 선택하지 않습니다. 어쩌면 이것에 대해 생각할 수있는 무딘 방법 일 수도 있지만 실제 세계에서와 같이 카드 덱을 관리하는 가장 좋은 방법 인 것으로 보입니다.무작위로 인스턴스 개체를 한 목록에서 다른 목록으로 바꾸기
문제는 로깅 메서드 또는 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:********************
항상 손이 생성 된 후 내 손은 마음이없는 경우에도 여덟 마음이 있다는 것을 보여줄 것 : 간결성을 위해 나는 목록에서 카드의 대부분을 잘라 , 그리고 빠진 카드가 마음이 아닐지라도.
본질적으로 로그가 잘못 기록되고 있는지, 카드를 올바르게 제거하지 못하는지 알 수 없습니다. 아니면 둘다. 같은 덱을 사용하여 두 손을 만드는 몇 가지 테스트는 중복 카드를 보여 주므로 피하려고합니다.
감사
데크는 deck_cards 속성을 가지고있다. 나는 어제이 질문의 절반을 실제로 썼지 만 게시하지 않았고 그 사이에 pycharm에서 해당 속성 이름을 업데이트했습니다. Deck 구현에서 "self.deck"이라고 말하면 self.deck_cards라고해야합니다. 나는 그것이 "deck.deck"이라고 말하는 것을 피하려고 노력했다. 나는 점심 시간에 돌아와 서면이 글의 코드를 업데이트하는 것을 잊었다. 그리고 "카드"라는 단어를 너무 많이 사용하는 것이 옳습니다. 나는 그것을 고쳐 줄 것이다. 귀하의 추천은 출력을 변경하지 않았지만, 어디서부터 시작해야할지 생각 나게했습니다. –
나는 테스트를 통해 카드가 하트 슈트 인 경우에만 내 코드가 카드를 제거한다는 사실을 발견했습니다. –