Когда вы запускаете super().__init__()
колода унаследует атрибут чисел и мастей от карты.См. Следующее:
import random
class Card:
def __init__(self):
self.numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'jack', 'queen', 'king', 'ace']
self.suits = ['hearts', 'diamonds', 'clubs', 'spades']
# print the current card
def __str__(self):
print(f'{self.numbers} of {self.suits}')
class Deck(Card):
def __init__(self):
super().__init__()
self.deck = []
# create a new deck of cards
def create_deck(self):
for suit in self.suits:
for number in self.numbers:
self.deck.append([number, suit])
return self
# shuffle the deck of cards before the start of the game
def shuffle_deck(self):
random.shuffle(self.deck)
def __len__(self):
return len(self.deck)
def pop(self):
return self.deck.pop()
class People:
def __init__(self, name):
self.name = name
class Player(People):
def __init__(self, name, deck):
super().__init__(name)
self.hand = []
self.count_cards = 0
self.score = 0
self.deck = deck
# draw a card from the deck
def draw_card(self):
drawn_card = self.hand.append(self.deck.pop())
return drawn_card
# count the cards in the players hand
def count_hand(self):
self.count_cards = len(self.hand)
return self.count_cards
# calculate the score each time the player wins
def calculate_score(self):
pass
def main():
deck = Deck().create_deck()
players = [Player(name, deck) for name in ('Jim', 'Ben', 'Paul', 'Wang')]
deck.shuffle_deck()
i = 0
while len(deck):
players[i].draw_card()
i = (i + 1) % len(players)
for p in players:
print(p.name, p.count_hand(), p.calculate_score())
if __name__ == '__main__':
main()
Вывод:
Jim 14 None
Ben 14 None
Paul 14 None
Wang 14 None
Однако мое рекомендуемое решение выглядит следующим образом:
import random
class Card:
numbers = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'jack', 'queen', 'king', 'ace']
suits = ['hearts', 'diamonds', 'clubs', 'spades']
def __init__(self, number, suit):
self.number = number
self.suit = suit
self.score = self.numbers.index(number) * 10 + self.suits.index(suit)
# print the current card
def __str__(self):
print(f'{self.number} of {self.suit}')
def __eq__(self, other):
return self.score == other.score
def __lt__(self, other):
return self.score < other.score
class Deck:
def __init__(self):
self.deck = [
Card(num, suit) for num in Card.numbers for suit in Card.suits
]
# shuffle the deck of cards before the start of the game
def shuffle(self):
random.shuffle(self.deck)
return self
def __len__(self):
return len(self.deck)
def pop(self):
return self.deck.pop()
class People:
def __init__(self, name):
self.name = name
class Player(People):
def __init__(self, name, deck):
super().__init__(name)
self.hand = []
self.count_cards = 0
self.score = 0
self.deck = deck
# draw a card from the deck
def draw_card(self):
drawn_card = self.hand.append(self.deck.pop())
return drawn_card
# count the cards in the players hand
def count_hand(self):
self.count_cards = len(self.hand)
return self.count_cards
# calculate the score each time the player wins
def calculate_score(self):
return sum(card.score for card in self.hand)
def main():
deck = Deck().shuffle()
players = [Player(name, deck) for name in ('Jim', 'Ben', 'Paul', 'Wang')]
i = 0
while len(deck):
players[i].draw_card()
i = (i + 1) % len(players)
for p in players:
print(p.name, p.count_hand(), p.calculate_score())
if __name__ == '__main__':
main()