Симеон обнови решението на 15.11.2022 17:50 (преди около 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:
+
+ 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):
+ self.deck:list[Card]=[]
+ for suit in self.suits:
+ for face in face_filter:
+ self.deck.append(Card(suit,face))
+
+ def deal_card(self):
+ card=self.deck[0]
+ self.deck.pop(0)
+ return card
+
+ def cut(self):
+
+ cards_cut=random.randint(1,len(self.deck)-1)
+
+ for add_card in range (cards_cut):
Преди скобите на функцията не се слагат интервали.
+ self.deck.append(self.deck[add_card])
+
+ for remove_card in range (cards_cut):
+ self.deck.pop(0)
+
+ def shuffle(self):
+ random.shuffle(self.deck)
+
+ def get_cards(self):
+ return self.deck
+
+class Player:
+ def __init__(self):
+ self.player_hand:list[Card]=[]
+
+ def get_cards(self):
+ return self.player_hand
+
+ def add_card(self,card):
+ self.player_hand.append(card)
+
+ def remove_hand(self):
+ self.player_hand=[]
+
+class Game:
+ players:list[Player]=[]
+
+ def __init__(self,num_players,dealing_direction,dealing_instructions:tuple[int]):
+ for player in range (num_players):
+ self.players.append(Player())
+
+ self.full_deck=Deck()
+ self.cur_deck=Deck()
+ self.direction=dealing_direction
+ self.dealing_instructions=dealing_instructions
+
+ def get_players(self):
+ return self.players
+
+ def prepare_deck(self):
+ for player in self.players:
+ player.remove_hand()
+
+ self.cur_deck=self.full_deck
+ self.cur_deck.shuffle()
+ self.cur_deck.cut()
+
+ def deal(self,player):
+
+ for index_player in range (len(self.players)):
self.players.index(player)
връща индекса, който търсиш.
+ if player==self.players[index_player]:
+ fs_player_index=index_player
+ break
+
+ players_in_deal_order:list[Player]=[]
+
+ if self.dealing_instructions=='ltr':
+ for index in range(fs_player_index,len(self.players)):
+ players_in_deal_order.append(self.players[index])
+
+ for index in range(fs_player_index):
+ players_in_deal_order.append(self.players[index])
+
+ else:
+ players_in_deal_order.append(self.players[fs_player_index])
+ for index in range(fs_player_index):
+ players_in_deal_order.append(self.players[index])
+
+ for index in range(fs_player_index+1,len(self.players)):
+ players_in_deal_order.append(self.players[index])
+
+ for instruct in self.dealing_instructions:
+ for player in players_in_deal_order:
+ for insctruct_size in range(instruct):
+ player.add_card(self.cur_deck.deal_card())
+
+ def get_deck(self):
+ return self.cur_deck
+
+
+class Belot(Game):
+ def __init__(self):
+ for player in range (4):
Наследявайки Game
, можеш просто да използваш неговия инициализатор, за да си спестиш тези редове.
+ self.players.append(Player())
+
+ self.full_deck=Deck(['7','8','9','10','J','Q','K','A'])
+ self.cur_deck=self.full_deck
+ self.direction='ltr'
+ self.dealing_instructions=(2,3,3)
+
+ def prepare_deck(self):
+ for player in self.players:
+ player.remove_hand()
+
+ self.cur_deck=Deck(['7','8','9','10','J','Q','K','A'])
Не е логично при всяко ново раздаване, да правиш ново тесте. Просто трябва да събереш картите от играчите.
+ self.cur_deck.shuffle()
+ self.cur_deck.cut()
+
+
+class Poker(Game):
+ def __init__(self):
+ for player in range (9):
+ self.players.append(Player())
+
+ self.full_deck=Deck()
+ self.cur_deck=self.full_deck
+ self.direction='rtl'
+ self.dealing_instructions=(1,1,1,1,1)
+
+ def prepare_deck(self):
+ for player in self.players:
+ player.remove_hand()
+
+ self.cur_deck=Deck()
+ self.cur_deck.shuffle()
+ self.cur_deck.cut()
+
Моля обърни внимание на интервалите си. Прегледай PEP8, ако трябва. Доста правила нарушаваш и ще се наложи да започнем да взимаме точки за това.
След запетая винаги се слагат интервали.
Бих използвал protected имена на атрибути като тези, които не използваш извън класа -
self._suit
Преди скобите на функцията не се слагат интервали.
self.players.index(player)
връща индекса, който търсиш.Наследявайки
Game
, можеш просто да използваш неговия инициализатор, за да си спестиш тези редове.Не е логично при всяко ново раздаване, да правиш ново тесте. Просто трябва да събереш картите от играчите.