Мария обнови решението на 15.11.2022 01:40 (преди около 2 години)
+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:
+ def __init__(self, face_filter=None):
+ if face_filter is None:
+ face_filter = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
+ self.face_filter = face_filter
+ self.cards = []
+ for face in face_filter:
Ако дефинираш всички лица в един списък и го обходиш, няма да се налага да дефинираш 4 еднакви реда.
+ self.cards.append(Card('clubs', face))
+ self.cards.append(Card('diamonds', face))
+ self.cards.append(Card('hearts', face))
+ self.cards.append(Card('spades', face))
+
+ def cut(self):
+ length = random.randint(1, len(self.cards))
+ for card in range(length):
+ current_card = self.cards.pop()
+ self.cards.insert(0, current_card)
+
+ def shuffle(self):
+ random.shuffle(self.cards)
+
+ def get_cards(self):
+ return self.cards
+
+
+class Player:
+ def __init__(self):
+ self.cards = []
+
+ def add_card(self, card):
+ self.cards.append(card)
+
+ def get_cards(self):
+ return self.cards
+
+
+class Game:
+ def __init__(self, number_of_players, dealing_direction, dealing_instructions):
+ self.number_of_players = number_of_players
+ self.players = []
+ current_player = 0
+ while current_player < number_of_players:
Ако използваш for
няма да се налага ръчно да инкрементираш брояча.
+ self.players.append(Player())
+ current_player += 1
+ self.dealing_direction = dealing_direction
+ self.dealing_instructions = dealing_instructions
+ self.deck = Deck()
+
+ def get_players(self):
+ return self.players
+
+ def prepare_deck(self):
+ temporary_list = []
+ for player in self.players:
+ temporary_list.append(player.get_cards())
+ player.cards = []
+ for sublist_of_cards in temporary_list:
+ for card in sublist_of_cards:
self.deck.extend(sublist_of_cards)
прави същото.
+ self.deck.cards.append(card)
+ self.deck.shuffle()
+ self.deck.cut()
+
+ def deal(self, starting_player):
+ start = self.players.index(starting_player)
+ current_player = 0
+ if self.dealing_direction == 'ltr':
+ while current_player < start:
+ move_player = self.players[0]
+ self.players.pop(0)
Не е добра идея да променяш реда на играчите при всяко раздаване. Ако ти трябва друг ред, направи си локална променлива.
+ self.players.append(move_player)
+ current_player += 1
+ elif self.dealing_direction == 'rtl':
+ while current_player <= start:
+ move_player = self.players[0]
+ self.players.pop(0)
+ self.players.append(move_player)
+ current_player += 1
+ self.players.reverse()
+ for num_of_cards in self.dealing_instructions:
+ for player in self.players:
+ given_cards = 0
+ while given_cards < num_of_cards:
+ player.add_card(self.deck.cards.pop(0))
+ given_cards += 1
+
+ def get_deck(self):
+ return self.deck.get_cards()
Този метод трябва да връща един елемент от тип Deck
, а не списък от карти.
+
+
+class Belot(Game):
+ def __init__(self):
+ self.number_of_players = 4
След като наследяваш Game
, възползвай се от неговия конструктор. Там се случват същите неща. Няма нужда да ги пренаписваш.
+ self.players = []
+ current_player = 0
+ while current_player < 4:
+ self.players.append(Player())
+ current_player += 1
+ self.dealing_direction = 'ltr'
+ self.dealing_instructions = (2, 3, 3)
+ self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
+
+
+class Poker(Game):
+ def __init__(self):
+ self.number_of_players = 9
+ self.players = []
+ current_player = 0
+ while current_player < 9:
+ self.players.append(Player())
+ current_player += 1
+ self.dealing_direction = 'rtl'
+ self.dealing_instructions = (1, 1, 1, 1, 1)
+ self.deck = Deck()
Бих използвал protected имена на атрибути като тези, които не използваш извън класа -
self._suit
Ако дефинираш всички лица в един списък и го обходиш, няма да се налага да дефинираш 4 еднакви реда.
Ако използваш
for
няма да се налага ръчно да инкрементираш брояча.self.deck.extend(sublist_of_cards)
прави същото.Не е добра идея да променяш реда на играчите при всяко раздаване. Ако ти трябва друг ред, направи си локална променлива.
Този метод трябва да връща един елемент от тип
Deck
, а не списък от карти.След като наследяваш
Game
, възползвай се от неговия конструктор. Там се случват същите неща. Няма нужда да ги пренаписваш.