Проблема с купоном в python колода карт - PullRequest
0 голосов
/ 21 марта 2020

возникли проблемы с написанием программы, которая может имитировать количество пиков из колоды карт, необходимых для получения одной масти. Я сталкиваюсь с бесконечным l oop, и я не уверен, как выбраться из него и получить требуемый результат.

import random
def coupon_collector():
  suits=['Hearts','Diamonds','Spades','Clubs']
  cards=['Ace','2','3','4','5','6','7','8','9','10','Jack','Queen','King']
  def has_suit(cards,suit):
    for s in cards:
      if suit == s:
        return True
    return False
  def has_all_suits(cards):
    for suit in suits:
      if not has_suit(cards,suit):
        return False
    return True
  def main():
    deck=[]
    my_cards=[]
    j=0
    for i in range(52):
      deck.append(suits[i%4]+cards[int(i/4)])
    while not has_all_suits(my_cards):
      ind=random.randint(0,51)
      card=deck[ind]
      if not has_suit(my_cards,card[0]):
        my_cards.append(card)
      j+=1
    for card in my_cards:
      print(card[1],'of',card[0])
    print('Number of picks:',j)
  main()


coupon_collector()

1 Ответ

0 голосов
/ 21 марта 2020

Проблема в том, что has_suit никогда не возвращает True, потому что suit == s никогда не True. Каждый элемент в вашем списке mycards представляет собой строку значения карты, соединенную с мастью (например, «Diamonds3»). Это означает, что вы проверяете, если "Diamonds" == "Diamonds3" et c. Вместо этого вы должны проверить if suit in s, чтобы увидеть, содержится ли строка "Diamonds" внутри строки "Diamonds3".

Также определения функций внутри другой функции немного странные и ненужные. Я отредактировал твой код:

import random
suits = ['Hearts', 'Diamonds', 'Spades', 'Clubs']
cards = ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']

def has_suit(cards, suit):
    for s in cards:
        if suit in s:
            return True
    return False

def has_all_suits(cards):
    for suit in suits:
        if not has_suit(cards, suit):
            return False
    return True

def main():
    deck = []
    my_cards = []
    j = 0
    for i in range(52):
        deck.append(suits[i%4] + cards[int(i/4)])

    while not has_all_suits(my_cards):
        ind = random.randint(0, 51)
        card = deck[ind]
        if not has_suit(my_cards, card[0]):
            my_cards.append(card)
        j += 1
    for card in my_cards:
        print(card)
    print('Number of picks:', j)

main()
...