Решение на От ливадите до Лас Вегас (и назад) от Радостин Маринов

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

Към профила на Радостин Маринов

Резултати

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

Код

import random
suits = ("clubs", "diamonds", "hearts", "spades")
faces = ("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A")
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=faces):
available_faces = filter(lambda face: face in face_filter, faces)
self.cards = [card for face in available_faces for card in self.__face_to_cards(face)]
def get_cards(self):
return self.cards
def cut(self):
amount_to_cut = random.randint(1, len(self.cards) - 1)
first_part = self.cards[:amount_to_cut]

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

self.cards = self.cards[amount_to_cut:] + self.cards[:amount_to_cut]

second_part = self.cards[amount_to_cut:]
self.cards = second_part + first_part
def shuffle(self):
random.shuffle(self.cards)
def take(self, amount):
to_take = self.cards[:amount]
self.cards = self.cards[amount:]
return to_take
def add(self, cards):
self.cards = cards + self.cards
@staticmethod
def __face_to_cards(face):
return list(map(lambda suit: Card(suit, face), suits))
class Player:
def __init__(self):
self.cards = []
def get_cards(self):
return self.cards
def give_cards(self, cards):
self.cards.extend(cards)
def take_cards(self):
to_take = self.cards
self.cards = []
return to_take
class Game:
def __init__(self, number_of_players, dealing_direction, dealing_instructions):
self.players = [Player() for _ in range(number_of_players)]
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.add(player.take_cards())
self.deck.shuffle()
self.deck.cut()
def deal(self, player):
index_of_player = self.players.index(player)
if self.dealing_direction == "ltr":
self.players = self.players[index_of_player:] + self.players[:index_of_player]
for amount in self.dealing_instructions:
for player in self.players:
player.give_cards(self.deck.take(amount))
else:
self.players = self.players[(index_of_player + 1):] + self.players[:(index_of_player + 1)]
for amount in self.dealing_instructions:
for player in reversed(self.players):
player.give_cards(self.deck.take(amount))
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self):
Game.__init__(self, 4, "ltr", (2, 3, 3))
self.deck = Deck(["7", "8", "9", "10", "J", "Q", "K", "A"])
class Poker(Game):
def __init__(self):
Game.__init__(self, 9, "rtl", (1, 1, 1, 1, 1))

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

...............
----------------------------------------------------------------------
Ran 15 tests in 0.155s

OK

История (1 версия и 6 коментара)

Радостин обнови решението на 13.11.2022 17:23 (преди над 1 година)

+import random
+
+suits = ("clubs", "diamonds", "hearts", "spades")
+faces = ("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A")
+
+
+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=faces):
+ available_faces = filter(lambda face: face in face_filter, faces)
+ self.cards = [card for face in available_faces for card in self.__face_to_cards(face)]
+
+ def get_cards(self):
+ return self.cards
+
+ def cut(self):
+ amount_to_cut = random.randint(1, len(self.cards) - 1)
+ first_part = self.cards[:amount_to_cut]

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

self.cards = self.cards[amount_to_cut:] + self.cards[:amount_to_cut]

+ second_part = self.cards[amount_to_cut:]
+ self.cards = second_part + first_part
+
+ def shuffle(self):
+ random.shuffle(self.cards)
+
+ def take(self, amount):
+ to_take = self.cards[:amount]
+ self.cards = self.cards[amount:]
+ return to_take
+
+ def add(self, cards):
+ self.cards = cards + self.cards
+
+ @staticmethod
+ def __face_to_cards(face):
+ return list(map(lambda suit: Card(suit, face), suits))
+
+
+class Player:
+ def __init__(self):
+ self.cards = []
+
+ def get_cards(self):
+ return self.cards
+
+ def give_cards(self, cards):
+ self.cards.extend(cards)
+
+ def take_cards(self):
+ to_take = self.cards
+ self.cards = []
+ return to_take
+
+
+class Game:
+ def __init__(self, number_of_players, dealing_direction, dealing_instructions):
+ self.players = [Player() for _ in range(number_of_players)]
+ 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.add(player.take_cards())
+ self.deck.shuffle()
+ self.deck.cut()
+
+ def deal(self, player):
+ index_of_player = self.players.index(player)
+ if self.dealing_direction == "ltr":
+ self.players = self.players[index_of_player:] + self.players[:index_of_player]
+ for amount in self.dealing_instructions:
+ for player in self.players:
+ player.give_cards(self.deck.take(amount))
+ else:
+ self.players = self.players[(index_of_player + 1):] + self.players[:(index_of_player + 1)]
+ for amount in self.dealing_instructions:
+ for player in reversed(self.players):
+ player.give_cards(self.deck.take(amount))
+
+ def get_deck(self):
+ return self.deck
+
+
+class Belot(Game):
+ def __init__(self):
+ Game.__init__(self, 4, "ltr", (2, 3, 3))
+ self.deck = Deck(["7", "8", "9", "10", "J", "Q", "K", "A"])
+
+
+class Poker(Game):
+ def __init__(self):
+ Game.__init__(self, 9, "rtl", (1, 1, 1, 1, 1))

Смятам, че си направил доста чисто и методично решение. Имах само дребни коментари, които не са грешки, а само идеи/препоръки. Получаваш бонус точка.