Рая обнови решението на 15.11.2022 16:47 (преди над 2 години)
+import random
+
+
+class Card:
+ SUITS = {'clubs', 'diamonds', 'hearts', 'spades'}
+ FACES = {'2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'}
+
+ def __init__(self, suit, face):
+ self._suit = suit
+ self._face = face
+
+ def get_suit(self):
+ return self._suit
+
+ def get_face(self):
+ return self._face
+
+
+class Deck:
+
+ def __init__(self, face_filter=None):
+ faces = face_filter if face_filter != None else Card.FACES
+
+ self._cards = []
+ for face in faces:
+ for suit in Card.SUITS:
+ self._cards.append(Card(suit, face))
+
+ def cut(self):
+ times = random.randrange(1, len(self._cards))
+ for _ in range(times):
+ value = self._cards.pop(0)
+ self._cards.append(value)
+
+ def shuffle(self):
+ random.shuffle(self._cards)
+
+ def get_cards(self):
+ return self._cards
+
+ def add_cards(self, cards):
+ self._cards.extend(cards)
+
+ def get_cards_from_deal(self, number_of_cards):
+ dealt_cards = []
+ for _ in range(number_of_cards):
+ dealt_cards.append(self._cards.pop())
+
+ return dealt_cards
+
+
+class Player:
+ _cards = list()
+
+ def get_cards(self):
+ return self._cards
+
+ def receive_cards(self, cards):
+ self._cards = self._cards + cards
+
+ def return_cards(self):
+ self._cards = []
+
+
+class Game:
+
+ def __init__(self, number_of_players, dealing_direction, dealing_instructions, deck=Deck()):
+ self._number_of_players = number_of_players
+ self._dealing_direction = dealing_direction
+ self._dealing_instructions = dealing_instructions
+ self._deck = deck
+ self._players = []
+ for _ in range(number_of_players):
+ self._players.append(Player())
+
+ def get_players(self):
+ random_player_index = random.randrange(0, self._number_of_players)
+ players = self._players[random_player_index:] + self._players[0 : random_player_index]
+ return players
+
+ def prepare_deck(self):
+ for player in self._players:
+ cards = player.get_cards()
+ self._deck.add_cards(cards)
+ player.return_cards()
+ self._deck.shuffle()
+ self._deck.cut()
+
+ def deal(self, Player):
+ player_index = self._players.index(Player)
+ players = []
+ if self._dealing_direction == "ltr":
+ players = self._players[player_index:] + self._players[0:player_index]
+ elif self._dealing_direction == "rtl":
+ players = self._players[player_index:0:-1] + [self._players[0]] + self._players[self._number_of_players - 1:player_index:-1]
+
+ for cards_count_instruction in self._dealing_instructions:
+ for player in players:
+ cards = self._deck.get_cards_from_deal(cards_count_instruction)
+ player.receive_cards(cards)
+
+ def get_deck(self):
+ return self._deck
+
+
+class Belot(Game):
+
+ def __init__(self):
+ super().__init__(4, "ltr", (2, 3, 3), Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A']))
+
+
+class Poker(Game):
+
+ def __init__(self):
+ super().__init__(9, "rtl", (1, 1, 1, 1, 1))
times
не е най-удачното име за тази променлива.Това значи, че всяка интсанция на класа ще споделя този атрибут. Т.е. не мога да инстанцирам няколко играча с различни тестета.
deck=Deck()
ще се евалюира само веднъж - при дефиниране на класа, т.е. всички инстанции на класа, които не получатdeck
като аргумент, ще споделят едно и също тесте.