Марио обнови решението на 15.11.2022 04:22 (преди над 2 години)
+import random
+
+
+class Card:
+ 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=['K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2', 'A']):
+ self._cards = []
+
+ for face in face_filter:
+ self._cards.extend(map(lambda x: Card(x, face), [
Отварящата скоба за списъка трябва да е на новия ред.
+ 'clubs', 'diamonds', 'hearts', 'spades']))
+
+ def cut(self):
+ random_number_of_cards = random.randint(1, len(self._cards))
+ selected_cards = []
С малко слайсинг ще стане по-кратко, но и това решение е ок.
+
+ while random_number_of_cards > 0:
+ selected_cards.append(self._cards.pop(0))
+ random_number_of_cards -= 1
+
+ self._cards.extend(selected_cards)
+
+ def shuffle(self):
+ random.shuffle(self._cards)
+
+ def get_cards(self):
+ return self._cards
+
+
+class Player:
+ def __init__(self):
+ self._cards_held = []
cards
е също толкова описателно, колкото и cards_held
, но е по-кратко.
+
+ def get_cards(self):
+ return self._cards_held
+
+
+class Game:
+ def __init__(self, number_of_players, dealing_direction, dealing_instructions):
+ self._players = []
+ for i in range(0, number_of_players):
Ако няма да използваш променлива, именувай я _
, както е по конвенция.
Освен това range(0, x)
е същото като range(x)
.
+ self._players.append(Player())
+ self._dealing_direction = dealing_direction
+ self._dealing_instructions = dealing_instructions
+ self._deck = Deck()
+
+ def get_players(self):
+ return self._players
+
+ def prepare_deck(self):
+ for player in self._players:
+ self._deck.get_cards().extend(player.get_cards())
+ player.get_cards().clear()
+
+ self._deck.shuffle()
+ self._deck.cut()
+
+ def deal(self, player):
+ player_index = self._players.index(player)
+ if self._dealing_direction == 'ltr':
+ order_of_players = self._players[player_index:] + \
Силно непрепоръчително е да цепиш редове с наклонена чера. Ако причината за това е да се хванеш в 79 символа, по-добре го остави да са повече, но без това пренасяне.
+ self._players[:player_index]
+ elif self._dealing_direction == 'rtl':
+ order_of_players = list(reversed(self._players[:player_index + 1])) + \
+ list(reversed(self._players[player_index + 1:]))
+
+ for instruction in self._dealing_instructions:
+ for player in order_of_players:
+ for i in range(0, instruction):
+ player.get_cards().append(self._deck.get_cards().pop(0))
+
+ def get_deck(self):
+ return self._deck
+
+
+class Belot(Game):
+ def __init__(self):
+ super(Belot, self).__init__(4, 'ltr', (2, 3, 3))
+ self._deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
+
+
+class Poker(Game):
+ def __init__(self):
+ super(Poker, self).__init__(9, 'rtl', (1))
+
+ def deal(self, player):
+ player_index = self._players.index(player)
+ if self._dealing_direction == 'ltr':
+ order_of_players = self._players[player_index:] + \
+ self._players[:player_index]
+ elif self._dealing_direction == 'rtl':
+ order_of_players = list(reversed(self._players[:player_index + 1])) + \
+ list(reversed(self._players[player_index + 1:]))
+
+ count = 0
Това го правиш само защото не си подал правилните инструкции за раздаване - (1)
. Ако подадеш правилни инструкции, това парче код става излишно.
+ while count < 5:
+ for player in order_of_players:
+ player.get_cards().extend(self._deck.get_cards().pop(0))
extend
очаква iterable
а ти подаваш Card
.
+ count += 1