Решение на От ливадите до Лас Вегас (и назад) от Евтим Иванов

Обратно към всички решения

Към профила на Евтим Иванов

Резултати

  • 7 точки от тестове
  • 0 бонус точки
  • 7 точки общо
  • 11 успешни тест(а)
  • 4 неуспешни тест(а)

Код

import random
valid_suits = ['clubs', 'diamonds', 'hearts', 'spades']
valid_faces = ['2', '3', '4', '5', '6',
'7', '8', '9', '10', 'A', 'J', 'Q', 'K']
number_of_belot_players = 4
belot_instructions = (2, 3, 3)
number_of_poker_players = 9
poker_instructions = (1, 1, 1, 1, 1)
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 = []):
self.__cards = []
for suit in valid_suits:
for face in valid_faces:
if face_filter and face in face_filter:
card_to_add = Card(suit, face)
self.__cards.append(card_to_add)
else:
card_to_add = Card(suit, face)
self.__cards.append(card_to_add)
def cut(self):
random_number = random.randint(0, len(self.__cards))
self.__cards = self.__cards[random_number:] + self.__cards[:random_number]
def shuffle(self):
random.shuffle(self.__cards)
def get_cards(self):
return self.__cards
def add_cards(self, cards):
for card in cards:
self.__cards.append(card)
def remove_cards(self, cards):
for card in cards:
self.__cards.remove(card)
class Player:
def __init__(self):
self.__cards_in_hand = []
def add_card(self, card):
self.__cards_in_hand.append(card)
def get_cards(self):
return self.__cards_in_hand
def collect_cards(self):
temp = self.__cards_in_hand
self.__cards_in_hand = []
return temp
class Game:
def __init__(self, number_of_players,
dealing_direction, dealing_instructions):
self._number_of_players = number_of_players
self._dealing_direction = dealing_direction
self._dealing_instructions = dealing_instructions
self._players = []
self.generate_players()
self._deck = Deck()
def generate_players(self):
for _ in range(self._number_of_players):
player = Player()
self._players.append(player)
def get_players(self):
return self._players
def prepare_deck(self):
for player in self._players:
self._deck.add_cards(player.collect_cards())
self._deck.shuffle()
self._deck.cut()
def deal(self, player):
index_of_first = self._players.index(player)
for number_of_cards_to_deal in self._dealing_instructions:
if self._dealing_direction == 'ltr':
for player in self._players[index_of_first:]:

Тук имаш доста повторения. Бих се опитал предварително да определя реда на игричите, за да мога да обединя двете посоки в едон парче код и да спестя повторение. Нека това не е причина да преправяш кода и евентуално да го счупиш. Просто го имай предвид.

cards_to_be_given = self._deck.get_cards()[0:number_of_cards_to_deal]
self.deal_cards(cards_to_be_given, player)
for player in self._players[0:index_of_first]:
cards_to_be_given = self._deck.get_cards()[0:number_of_cards_to_deal]
self.deal_cards(cards_to_be_given, player)
else:
for player in self._players[index_of_first:0:-1]:
cards_to_be_given = self._deck.get_cards()[0:number_of_cards_to_deal]
self.deal_cards(cards_to_be_given, player)
for player in self._players[index_of_first + 1::][::-1]:
cards_to_be_given = self._deck.get_cards()[0:number_of_cards_to_deal]
self.deal_cards(cards_to_be_given, player)
def get_deck(self):
return self._deck
def deal_cards(self, cards_to_be_give, player):
for card in cards_to_be_give:
player.add_card(card)
self._deck.get_cards().remove(card)
class Belot(Game):
def __init__(self):
super().__init__(number_of_belot_players, "ltr", belot_instructions)
face_filter = ['7', '8', '9', '10', 'J', 'Q', 'K']
self._deck = Deck(face_filter)
class Poker(Game):
def __init__(self):
super().__init__(number_of_poker_players, "ltr", poker_instructions)

Лог от изпълнението

F....F....F...F
======================================================================
FAIL: test_correct_deck_init (test.TestBelot)
Test initialization with correct deck.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
    raise result
AssertionError: Items in the second set but not the first:
('hearts', '5')
('spades', '5')
('diamonds', '5')
('clubs', '6')
('clubs', '4')
('clubs', '3')
('clubs', '2')
('hearts', '6')
('spades', '6')
('diamonds', '6')
('spades', '4')
('diamonds', '4')
('hearts', '4')
('clubs', '5')
('hearts', '3')
('spades', '2')
('diamonds', '3')
('diamonds', '2')
('spades', '3')
('hearts', '2')

======================================================================
FAIL: test_init_filtered (test.TestDeck)
Test initialized cards with filter.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
    raise result
AssertionError: Items in the second set but not the first:
('hearts', '8')
('spades', '8')
('diamonds', '8')
('clubs', 'Q')
('clubs', '6')
('clubs', '9')
('clubs', 'K')
('clubs', '4')
('clubs', '3')
('clubs', '7')
('spades', 'Q')
('diamonds', 'Q')
('spades', '9')
('hearts', 'Q')
('diamonds', '9')
('hearts', '6')
('diamonds', '6')
('spades', '4')
('spades', '6')
('diamonds', '4')
('hearts', '9')
('hearts', 'K')
('hearts', '4')
('diamonds', 'K')
('spades', 'K')
('clubs', '8')
('hearts', '3')
('spades', '3')
('diamonds', '3')
('hearts', '7')
('spades', '7')
('diamonds', '7')

======================================================================
FAIL: test_dealing_rtl (test.TestGame)
Test dealing the cards right to left.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
    raise result
AssertionError: {('clubs', '3'), ('clubs', '2'), ('clubs', '8')} not found in ({('clubs', '3'), ('clubs', '2'), ('clubs', '10')}, {('spades', '6'), ('spades', 'Q'), ('spades', 'K')})

======================================================================
FAIL: test_correct_direction_and_players_deal (test.TestPoker)
Test dealing with correct direction and players.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
    raise result
AssertionError: {('clubs', '10'), ('hearts', '2'), ('diamonds', '6'), ('hearts', 'A'), ('spades', '7')} not found in ({('hearts', 'Q'), ('clubs', '3'), ('diamonds', '8'), ('hearts', '4'), ('clubs', 'J')}, {('spades', 'Q'), ('diamonds', '3'), ('spades', '4'), ('hearts', '8'), ('diamonds', 'J')})

----------------------------------------------------------------------
Ran 15 tests in 0.161s

FAILED (failures=4)

История (2 версии и 13 коментара)

Евтим обнови решението на 13.11.2022 22:09 (преди над 1 година)

+import random
+
+valid_suits = ['clubs', 'diamonds', 'hearts', 'spades']
+
+valid_faces = ['1', '2', '3', '4', '5', '6',
+ '7', '8', '9', '10','J', 'Q', 'K']
+
+
+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, *args):
+ is_face_filter_on = False
+
+ if len(args) > 0:
+ face_filter = args[0]
+ is_face_filter_on = True
+
+ self.__cards_in_deck = []
+ for suit in valid_suits:
+ for face in valid_faces:
+ if is_face_filter_on and face in face_filter:
+ card_to_add = Card(suit, face)
+ self.__cards_in_deck.append(card_to_add)
+ else:
+ card_to_add = Card(suit, face)
+ self.__cards_in_deck.append(card_to_add)
+
+ def cut(self):
+ random_number = random.randint(0, len(self.__cards_in_deck))
+ self.__cards_in_deck = self.__cards_in_deck[random_number:] \

Разбирам, че искаш дължината на редът ти да следва PEP8, но използването на пренасяне с наклонена черта е силно непрепоръчително. Ако цената е по-дълъг ред, нека просто да е по-дълъг.

+ + self.__cards_in_deck[:random_number]
+
+ def shuffle(self):
+ random.shuffle(self.__cards_in_deck)
+
+ def get_cards(self):
+ return self.__cards_in_deck
+
+ def add_cards(self, cards):
+ for card in cards:
+ self.__cards_in_deck.append(card)
+
+ def remove_cards(self, cards):
+ for card in cards:
+ self.__cards_in_deck.remove(card)
+
+
+class Player:
+ def __init__(self):
+ self.__cards_in_hand = []
+
+ def add_card(self, card):
+ self.__cards_in_hand.append(card)
+
+ def get_cards(self):
+ return self.__cards_in_hand
+
+ def collect_cards(self):
+ temp = self.__cards_in_hand
+ self.__cards_in_hand = []
+ return temp
+
+
+class Game:
+ def __init__(self, number_of_players,
+ dealing_direction, dealing_instructions):
+ self._number_of_players = number_of_players
+ self._dealing_direction = dealing_direction
+ self._dealing_instructions = dealing_instructions
+ self._players = []
+ self.generate_players()
+ self._deck = Deck()
+
+ def generate_players(self):
+ for i in range(self._number_of_players):
+ player = Player()
+ self._players.append(player)
+
+ def get_players(self):
+ return self._players
+
+ def prepare_deck(self):
+ for player in self._players:
+ self._deck.add_cards(player.collect_cards())
+
+ self._deck.shuffle()
+ self._deck.cut()
+
+ def deal(self, player):
+ index_of_first = self._players.index(player)
+
+ for number_of_cards_to_deal in self._dealing_instructions:
+ if self._dealing_direction == 'ltr':
+
+ for player in self._players[index_of_first:]:

Тук имаш доста повторения. Бих се опитал предварително да определя реда на игричите, за да мога да обединя двете посоки в едон парче код и да спестя повторение. Нека това не е причина да преправяш кода и евентуално да го счупиш. Просто го имай предвид.

+ cards_to_be_given = \
+ self._deck.get_cards()[0:number_of_cards_to_deal]
+ self.deal_cards(cards_to_be_given, player)
+
+ for player in self._players[0:index_of_first]:
+ cards_to_be_given = \
+ self._deck.get_cards()[0:number_of_cards_to_deal]
+ self.deal_cards(cards_to_be_given, player)
+ else:
+ for player in self._players[index_of_first:0:-1]:
+ cards_to_be_given = \
+ self._deck.get_cards()[0:number_of_cards_to_deal]
+ self.deal_cards(cards_to_be_given, player)
+
+ for player in self._players[index_of_first + 1::][::-1]:
+ cards_to_be_given = \
+ self._deck.get_cards()[0:number_of_cards_to_deal]
+ self.deal_cards(cards_to_be_given, player)
+
+ def get_deck(self):
+ return self._deck
+
+ def deal_cards(self, cards_to_be_give, player):
+ for card in cards_to_be_give:
+ player.add_card(card)
+ self._deck.get_cards().remove(card)
+
+
+number_of_belot_players = 4

Тези редовете бих сложил в началото на файла, или директно в класовете, които касаят. Сега са просто между дефиниции на класове и се губят.

+belot_instructions = (2, 3, 3)
+number_of_poker_players = 9
+poker_instructions = (1, 1, 1, 1, 1)
+
+
+class Belot(Game):
+ def __init__(self):
+ super().__init__(number_of_belot_players, "ltr", belot_instructions)
+ face_filter = ['7', '8', '9', '10', 'J', 'Q', 'K']
+ self._deck = Deck(face_filter)
+
+class Poker(Game):
+ def __init__(self):
+ super().__init__(number_of_poker_players,"ltr",poker_instructions)

Евтим обнови решението на 15.11.2022 14:23 (преди над 1 година)

import random
valid_suits = ['clubs', 'diamonds', 'hearts', 'spades']
-valid_faces = ['1', '2', '3', '4', '5', '6',
- '7', '8', '9', '10','J', 'Q', 'K']
+valid_faces = ['2', '3', '4', '5', '6',
+ '7', '8', '9', '10', 'A', 'J', 'Q', 'K']
+number_of_belot_players = 4
+belot_instructions = (2, 3, 3)
+number_of_poker_players = 9
+poker_instructions = (1, 1, 1, 1, 1)
class Card:
def __init__(self, suit, face):
- self.__suit = suit
- self.__face = face
+ self._suit = suit
+ self._face = face
def get_suit(self):
- return self.__suit
+ return self._suit
def get_face(self):
- return self.__face
+ return self._face
+
class Deck:
- def __init__(self, *args):
- is_face_filter_on = False
+ def __init__(self, face_filter = []):
- if len(args) > 0:
- face_filter = args[0]
- is_face_filter_on = True
-
- self.__cards_in_deck = []
+ self.__cards = []
for suit in valid_suits:
for face in valid_faces:
- if is_face_filter_on and face in face_filter:
+ if face_filter and face in face_filter:
card_to_add = Card(suit, face)
- self.__cards_in_deck.append(card_to_add)
+ self.__cards.append(card_to_add)
else:
card_to_add = Card(suit, face)
- self.__cards_in_deck.append(card_to_add)
+ self.__cards.append(card_to_add)
def cut(self):
- random_number = random.randint(0, len(self.__cards_in_deck))
- self.__cards_in_deck = self.__cards_in_deck[random_number:] \
- + self.__cards_in_deck[:random_number]
+ random_number = random.randint(0, len(self.__cards))
+ self.__cards = self.__cards[random_number:] + self.__cards[:random_number]
def shuffle(self):
- random.shuffle(self.__cards_in_deck)
+ random.shuffle(self.__cards)
def get_cards(self):
- return self.__cards_in_deck
+ return self.__cards
def add_cards(self, cards):
for card in cards:
- self.__cards_in_deck.append(card)
+ self.__cards.append(card)
def remove_cards(self, cards):
for card in cards:
- self.__cards_in_deck.remove(card)
+ self.__cards.remove(card)
class Player:
def __init__(self):
self.__cards_in_hand = []
def add_card(self, card):
self.__cards_in_hand.append(card)
def get_cards(self):
return self.__cards_in_hand
def collect_cards(self):
temp = self.__cards_in_hand
self.__cards_in_hand = []
return temp
class Game:
def __init__(self, number_of_players,
dealing_direction, dealing_instructions):
self._number_of_players = number_of_players
self._dealing_direction = dealing_direction
self._dealing_instructions = dealing_instructions
self._players = []
self.generate_players()
self._deck = Deck()
def generate_players(self):
- for i in range(self._number_of_players):
+ for _ in range(self._number_of_players):
player = Player()
self._players.append(player)
def get_players(self):
return self._players
def prepare_deck(self):
for player in self._players:
self._deck.add_cards(player.collect_cards())
self._deck.shuffle()
self._deck.cut()
def deal(self, player):
index_of_first = self._players.index(player)
for number_of_cards_to_deal in self._dealing_instructions:
if self._dealing_direction == 'ltr':
for player in self._players[index_of_first:]:
- cards_to_be_given = \
- self._deck.get_cards()[0:number_of_cards_to_deal]
+ cards_to_be_given = self._deck.get_cards()[0:number_of_cards_to_deal]
self.deal_cards(cards_to_be_given, player)
for player in self._players[0:index_of_first]:
- cards_to_be_given = \
- self._deck.get_cards()[0:number_of_cards_to_deal]
+ cards_to_be_given = self._deck.get_cards()[0:number_of_cards_to_deal]
self.deal_cards(cards_to_be_given, player)
else:
for player in self._players[index_of_first:0:-1]:
- cards_to_be_given = \
- self._deck.get_cards()[0:number_of_cards_to_deal]
+ cards_to_be_given = self._deck.get_cards()[0:number_of_cards_to_deal]
self.deal_cards(cards_to_be_given, player)
for player in self._players[index_of_first + 1::][::-1]:
- cards_to_be_given = \
- self._deck.get_cards()[0:number_of_cards_to_deal]
+ cards_to_be_given = self._deck.get_cards()[0:number_of_cards_to_deal]
self.deal_cards(cards_to_be_given, player)
def get_deck(self):
return self._deck
def deal_cards(self, cards_to_be_give, player):
for card in cards_to_be_give:
player.add_card(card)
self._deck.get_cards().remove(card)
-number_of_belot_players = 4
-belot_instructions = (2, 3, 3)
-number_of_poker_players = 9
-poker_instructions = (1, 1, 1, 1, 1)
-
-
class Belot(Game):
def __init__(self):
super().__init__(number_of_belot_players, "ltr", belot_instructions)
face_filter = ['7', '8', '9', '10', 'J', 'Q', 'K']
self._deck = Deck(face_filter)
+
class Poker(Game):
def __init__(self):
- super().__init__(number_of_poker_players,"ltr",poker_instructions)
+ super().__init__(number_of_poker_players, "ltr", poker_instructions)
+
+