Решение на От ливадите до Лас Вегас (и назад) от Лиляна Белчева

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

Към профила на Лиляна Белчева

Резултати

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

Код

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=['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']):
self.cards = []
for face in face_filter:
for suit in ['clubs', 'diamonds', 'hearts', 'spades']:
self.cards.append(Card(suit, face))
def cut(self):
length = random.randint(0, len(self.cards) - 1)
while length > 0:
popped_card = self.cards.pop()
self.cards.insert(0, popped_card)
length -= 1
return self.cards
def shuffle(self):
return random.shuffle(self.cards)
def get_cards(self):
return self.cards
class Player:
def __init__(self):
self.hand = []
def get_cards(self):
return self.hand
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.deck = Deck()
while number_of_players > 0:
self.players.append(Player())
number_of_players -= 1
def set_deck(self, new_deck):
self.deck = new_deck
def get_deck(self):
return self.deck
def get_players(self):
return self.players
def prepare_deck(self):
for player in self.players:
self.deck.cards += player.get_cards()
player.hand = []
self.deck.shuffle()
self.deck.cut()
def deal(self, start_player):
idx = self.players.index(start_player)
if self.dealing_direction == 'rtl':
self.players.reverse()

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

while idx > 0:
popped_player = self.players.pop()
self.players.insert(0, popped_player)
idx -= 1
for count in self.dealing_instructions:
for player in self.players:
for _ in range(count):
player.hand.append(self.deck.cards.pop())
class Belot(Game):
def __init__(self):
super().__init__(4, 'ltr', ())
super().set_deck(Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A']))
class Poker(Game):
def __init__(self):
super().__init__(9, 'rtl', (1, 1, 1, 1, 1))

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

.F.......FF...F
======================================================================
FAIL: test_correct_direction_and_players_deal (test.TestBelot)
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: set() not found in ({('hearts', '9'), ('clubs', 'Q'), ('diamonds', '7'), ('hearts', 'Q'), ('clubs', '7'), ('diamonds', '9'), ('diamonds', 'Q'), ('clubs', '9')}, {('hearts', '9'), ('spades', 'Q'), ('spades', 'A'), ('hearts', 'Q'), ('spades', '9'), ('diamonds', '9'), ('hearts', 'A'), ('diamonds', 'Q')})

======================================================================
FAIL: test_dealing_ltr (test.TestGame)
Test dealing the cards left to right.
----------------------------------------------------------------------
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: {('spades', 'K'), ('hearts', 'A'), ('clubs', 'K')} not found in ({('clubs', '2'), ('hearts', '3'), ('spades', '2')}, {('spades', 'A'), ('diamonds', 'K'), ('clubs', 'A')})

======================================================================
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: {('diamonds', 'K'), ('clubs', 'Q'), ('clubs', 'K')} not found in ({('clubs', '2'), ('clubs', '4'), ('diamonds', '2')}, {('spades', 'A'), ('hearts', 'A'), ('spades', 'Q')})

======================================================================
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: {('spades', '3'), ('diamonds', '8'), ('clubs', '6'), ('hearts', '10'), ('spades', 'Q')} not found in ({('diamonds', '4'), ('clubs', '2'), ('spades', '8'), ('hearts', '6'), ('clubs', 'J')}, {('spades', 'A'), ('diamonds', '10'), ('hearts', 'Q'), ('spades', '5'), ('clubs', '8')})

----------------------------------------------------------------------
Ran 15 tests in 0.160s

FAILED (failures=4)

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

Лиляна обнови решението на 13.11.2022 17:41 (преди над 1 година)

+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=['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']):
+ self.cards = []
+
+ for face in face_filter:
+ for suit in ['clubs', 'diamonds', 'hearts', 'spades']:
+ self.cards.append(Card(suit, face))
+
+ def cut(self):
+ length = len(self.cards) // 2

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

+
+ while length > 0:
+ popped_card = self.cards.pop()
+ self.cards.insert(0, popped_card)
+ length -= 1
+ return self.cards
+
+ def shuffle(self):
+ return random.shuffle(self.cards)
+
+ def get_cards(self):
+ return self.cards
+
+
+class Player:
+
+ def __init__(self):
+ self.hand = []
+
+ def get_cards(self):
+ return self.hand
+
+
+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.deck = Deck()
+
+ while number_of_players > 0:
+ self.players.append(Player())
+ number_of_players -= 1
+
+ def set_deck(self, new_deck):
+ self.deck = new_deck
+
+ def get_deck(self):
+ return self.deck
+
+ def get_players(self):
+ return self.players
+
+ def prepare_deck(self):
+ for player in self.players:
+ self.deck.cards += player.get_cards()
+ player.hand = []
+
+ self.deck.shuffle()
+ self.deck.cut()
+
+ def deal(self, start_player):
+ idx = self.players.index(start_player)
+
+ if self.dealing_direction == 'rtl':
+ self.players.reverse()

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

+
+ while idx > 0:
+ popped_player = self.players.pop()
+ self.players.insert(0, popped_player)
+ idx -= 1
+
+ if isinstance(self.dealing_instructions, tuple):
+ for count in self.dealing_instructions:
+ for player in self.players:
+ for _ in range(count):
+ player.hand.append(self.deck.cards.pop())
+ else:
+ for player in self.players:
+ for _ in range(self.dealing_instructions):
+ player.hand.append(self.deck.cards.pop())
+
+
+class Belot(Game):
+
+ def __init__(self):
+ super().__init__(4, 'ltr', ())
+ super().set_deck(Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A']))
+
+
+class Poker(Game):
+
+ def __init__(self):
+ super().__init__(9, 'rtl', (1, 1, 1, 1, 1))
+ super().set_deck(Deck())

Лиляна обнови решението на 15.11.2022 00:08 (преди над 1 година)

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=['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']):
self.cards = []
for face in face_filter:
for suit in ['clubs', 'diamonds', 'hearts', 'spades']:
self.cards.append(Card(suit, face))
def cut(self):
length = len(self.cards) // 2
while length > 0:
popped_card = self.cards.pop()
self.cards.insert(0, popped_card)
length -= 1
return self.cards
def shuffle(self):
return random.shuffle(self.cards)
def get_cards(self):
return self.cards
class Player:
def __init__(self):
self.hand = []
def get_cards(self):
return self.hand
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.deck = Deck()
while number_of_players > 0:
self.players.append(Player())
number_of_players -= 1
def set_deck(self, new_deck):
self.deck = new_deck
def get_deck(self):
return self.deck
def get_players(self):
return self.players
def prepare_deck(self):
for player in self.players:
self.deck.cards += player.get_cards()
player.hand = []
self.deck.shuffle()
self.deck.cut()
def deal(self, start_player):
idx = self.players.index(start_player)
if self.dealing_direction == 'rtl':
self.players.reverse()
while idx > 0:
popped_player = self.players.pop()
self.players.insert(0, popped_player)
idx -= 1
- if isinstance(self.dealing_instructions, tuple):
- for count in self.dealing_instructions:
- for player in self.players:
- for _ in range(count):
- player.hand.append(self.deck.cards.pop())
- else:
+ for count in self.dealing_instructions:
for player in self.players:
- for _ in range(self.dealing_instructions):
+ for _ in range(count):
player.hand.append(self.deck.cards.pop())
class Belot(Game):
def __init__(self):
super().__init__(4, 'ltr', ())
super().set_deck(Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A']))
class Poker(Game):
def __init__(self):
- super().__init__(9, 'rtl', (1, 1, 1, 1, 1))
- super().set_deck(Deck())
+ super().__init__(9, 'rtl', (1, 1, 1, 1, 1))

Лиляна обнови решението на 15.11.2022 11:52 (преди над 1 година)

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=['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']):
self.cards = []
for face in face_filter:
for suit in ['clubs', 'diamonds', 'hearts', 'spades']:
self.cards.append(Card(suit, face))
def cut(self):
- length = len(self.cards) // 2
+ length = random.randint(0, len(self.cards) - 1)
while length > 0:
popped_card = self.cards.pop()
self.cards.insert(0, popped_card)
length -= 1
return self.cards
def shuffle(self):
return random.shuffle(self.cards)
def get_cards(self):
return self.cards
class Player:
def __init__(self):
self.hand = []
def get_cards(self):
return self.hand
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.deck = Deck()
while number_of_players > 0:
self.players.append(Player())
number_of_players -= 1
def set_deck(self, new_deck):
self.deck = new_deck
def get_deck(self):
return self.deck
def get_players(self):
return self.players
def prepare_deck(self):
for player in self.players:
self.deck.cards += player.get_cards()
player.hand = []
self.deck.shuffle()
self.deck.cut()
def deal(self, start_player):
idx = self.players.index(start_player)
if self.dealing_direction == 'rtl':
self.players.reverse()
while idx > 0:
popped_player = self.players.pop()
self.players.insert(0, popped_player)
idx -= 1
for count in self.dealing_instructions:
for player in self.players:
for _ in range(count):
player.hand.append(self.deck.cards.pop())
class Belot(Game):
def __init__(self):
super().__init__(4, 'ltr', ())
super().set_deck(Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A']))
class Poker(Game):
def __init__(self):
super().__init__(9, 'rtl', (1, 1, 1, 1, 1))