Даниела обнови решението на 13.11.2022 13:31 (преди над 2 години)
+import itertools
+import random
+
+
+class Card:
+ def __init__(self, suit, face):
+ self.suit = suit
Бих използвал protected имена на атрибути като тези, които не използваш извън класа - self._suit
+ self.face = face
+
+ def get_suit(self):
+ return self.suit
+
+ def get_face(self):
+ return self.face
+
+
+class Deck:
+ _suits = ['clubs', 'diamonds', 'hearts', 'spades']
+ _faces = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
+
+ def __init__(self, face_filter=_faces):
+ all_cards_possible = list(itertools.product(self._suits, face_filter))
+ self.cards = []
+ for card in all_cards_possible:
+ self.cards.append(Card(*card))
+
+ def cut(self):
+ number_of_cards_top = random.randrange(0, len(self.cards)-1)
Моля слагай итнервали около -
спрямо PEP8.
+ top_cards = self.cards[:number_of_cards_top]
Можеш директно self.cards = self.cards[number_of_cards_top:] + self.cards[:number_of_cards_top]
, но и твоето е ок.
+ del self.cards[:number_of_cards_top]
+ self.cards.extend(top_cards)
+
+ def shuffle(self):
+ random.shuffle(self.cards)
+
+ def get_cards(self):
+ return self.cards
+
+ def add_cards(self, cards):
+ self.cards.extend(cards)
+
+ def give_cards(self, amount):
+ to_give = self.cards[:amount]
+ del self.cards[:amount]
+ return to_give
+
+
+class Player:
+ def __init__(self):
+ self.cards = []
+
+ def get_cards(self):
+ return self.cards
+
+ def give_cards(self):
+ to_return = self.cards
+ self.cards = []
+ return to_return
+
+ def receive_cards(self, cards):
+ self.cards.extend(cards)
+
+
+class Game:
+ def __init__(self, number_of_players, dealing_direction, dealing_instructions):
+ self.players = []
+ for _ in range(number_of_players):
+ self.players.append(Player())
+ self.dealing_direction = dealing_direction
+ self.dealing_instructions = dealing_instructions
+ self.deck = Deck()
+
+ def get_players(self):
+ random_player = random.choice(self.players)
+ players_to_random = itertools.dropwhile(lambda pl: pl != random_player,
+ itertools.cycle(self.players))
+ return list(itertools.islice(players_to_random, len(self.players)))
+
+ def prepare_deck(self):
+ for player in self.players:
+ self.deck.add_cards(player.give_cards())
+ self.deck.shuffle()
+ self.deck.cut()
+
+ def deal(self, player):
+ deal_list = []
+ if self.dealing_direction == 'ltr':
+ players_to_player = itertools.dropwhile(lambda pl: pl != player,
+ itertools.cycle(self.players))
+ elif self.dealing_direction == 'rtl':
+ players_to_player = itertools.dropwhile(lambda pl: pl != player,
+ itertools.cycle(reversed(self.players)))
+ deal_list = list(itertools.islice(players_to_player, len(self.players)))
+ for amount in self.dealing_instructions:
+ for player in deal_list:
+ player.receive_cards(self.deck.give_cards(amount))
+
+ def get_deck(self):
+ return self.deck
+
+ def change_deck(self, deck):
+ self.deck = deck
+
+
+class Belot(Game):
+ def __init__(self):
+ super().__init__(4, 'ltr', (2, 3, 3))
+ bellot_deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
+ self.change_deck(bellot_deck)
+
+
+class Poker(Game):
+ def __init__(self):
+ super().__init__(9, 'rtl', (1, 1, 1, 1, 1))
Добро и чисто решение. Хареса ми, че използваш self.cards.append(Card(*card))
.
Доста от операциите, за които използваш itertools
могат да се направят с вградена Питонска функционалност, и то може би по-кратко, но пък показваш, че си разгледала модула в дълбочина и решенията са иновативни (спрямо това, което видях от останалите колеги).
Поради посочените причини, получаваш бонус точка.