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

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

Към профила на Рая Симеонова

Резултати

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

Код

import itertools
import random
class Card:
SUITS = {'clubs', 'diamonds', 'hearts', 'spades'}
FACES = {'2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'}
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=Card.FACES):
self._cards = list(itertools.product(face_filter, Card.SUITS))
def cut(self):
times = random.randrange(1, len(self._cards))
first_half = self._cards[0:times]
second_half = self._cards[times:]
self._cards = second_half + first_half
def shuffle(self):
random.shuffle(self._cards)
def get_cards(self):
return self._cards
def add_cards(self, cards):
self._cards.extend(cards)
def get_cards_from_deal(self, number_of_cards):
dealt_cards = self._cards[0:number_of_cards]
del self._cards[0:number_of_cards]
return dealt_cards
class Player:
_cards = list()
def get_cards(self):
return self._cards
def receive_cards(self, cards):
self._cards = self._cards + cards
def return_cards(self):
self._cards = []
class Game:
def __init__(self, number_of_players, dealing_direction, dealing_instructions, deck=Deck()):

deck=Deck() ще се евалюира само веднъж - при дефиниране на класа, т.е. всички инстанции на класа, които не получат deck като аргумент, ще споделят едно и също тесте.

self._number_of_players = number_of_players
self._dealing_direction = dealing_direction
self._dealing_instructions = dealing_instructions
self._deck = deck
self._players = []
for _ in range(number_of_players):
self._players.append(Player())
def get_players(self):
random_player_index = random.randrange(0, self._number_of_players)
players = self._players[random_player_index:] + self._players[0 : random_player_index]
return players
def prepare_deck(self):
for player in self._players:
cards = player.get_cards()
self._deck.add_cards(cards)
player.return_cards()
self._deck.shuffle()
self._deck.cut()
def deal(self, Player):
player_index = self._players.index(Player)
players = []
if self._dealing_direction == "ltr":
players = self._players[player_index:] + self._players[0:player_index]
elif self._dealing_direction == "rtl":
players = self._players[player_index:0:-1] + [self._players[0]] + self._players[self._number_of_players - 1:player_index:-1]
for cards_count_instruction in self._dealing_instructions:
for player in players:
cards = self._deck.get_cards_from_deal(cards_count_instruction)
player.receive_cards(cards)
def get_deck(self):
return self._deck
class Belot(Game):
def __init__(self):
super().__init__(4, "ltr", (2, 3, 3), Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A']))
class Poker(Game):
def __init__(self):
super().__init__(9, "rtl", (1, 1, 1, 1, 1))

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

EE...EE..EE..EE
======================================================================
ERROR: 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
AttributeError: 'tuple' object has no attribute 'get_suit'

======================================================================
ERROR: 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
AttributeError: 'tuple' object has no attribute 'get_suit'

======================================================================
ERROR: 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
AttributeError: 'tuple' object has no attribute 'get_suit'

======================================================================
ERROR: test_init_regular (test.TestDeck)
Test initialized cards without 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
AttributeError: 'tuple' object has no attribute 'get_suit'

======================================================================
ERROR: 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
AttributeError: 'tuple' object has no attribute 'get_suit'

======================================================================
ERROR: 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
AttributeError: 'tuple' object has no attribute 'get_suit'

======================================================================
ERROR: test_correct_deck_init (test.TestPoker)
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
AttributeError: 'tuple' object has no attribute 'get_suit'

======================================================================
ERROR: 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
AttributeError: 'tuple' object has no attribute 'get_suit'

----------------------------------------------------------------------
Ran 15 tests in 0.173s

FAILED (errors=8)

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

Рая обнови решението на 15.11.2022 16:47 (преди над 1 година)

+import random
+
+
+class Card:
+ SUITS = {'clubs', 'diamonds', 'hearts', 'spades'}
+ FACES = {'2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'}
+
+ 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=None):
+ faces = face_filter if face_filter != None else Card.FACES
+
+ self._cards = []
+ for face in faces:
+ for suit in Card.SUITS:
+ self._cards.append(Card(suit, face))
+
+ def cut(self):
+ times = random.randrange(1, len(self._cards))
+ for _ in range(times):
+ value = self._cards.pop(0)
+ self._cards.append(value)
+
+ def shuffle(self):
+ random.shuffle(self._cards)
+
+ def get_cards(self):
+ return self._cards
+
+ def add_cards(self, cards):
+ self._cards.extend(cards)
+
+ def get_cards_from_deal(self, number_of_cards):
+ dealt_cards = []
+ for _ in range(number_of_cards):
+ dealt_cards.append(self._cards.pop())
+
+ return dealt_cards
+
+
+class Player:
+ _cards = list()
+
+ def get_cards(self):
+ return self._cards
+
+ def receive_cards(self, cards):
+ self._cards = self._cards + cards
+
+ def return_cards(self):
+ self._cards = []
+
+
+class Game:
+
+ def __init__(self, number_of_players, dealing_direction, dealing_instructions, deck=Deck()):
+ self._number_of_players = number_of_players
+ self._dealing_direction = dealing_direction
+ self._dealing_instructions = dealing_instructions
+ self._deck = deck
+ self._players = []
+ for _ in range(number_of_players):
+ self._players.append(Player())
+
+ def get_players(self):
+ random_player_index = random.randrange(0, self._number_of_players)
+ players = self._players[random_player_index:] + self._players[0 : random_player_index]
+ return players
+
+ def prepare_deck(self):
+ for player in self._players:
+ cards = player.get_cards()
+ self._deck.add_cards(cards)
+ player.return_cards()
+ self._deck.shuffle()
+ self._deck.cut()
+
+ def deal(self, Player):
+ player_index = self._players.index(Player)
+ players = []
+ if self._dealing_direction == "ltr":
+ players = self._players[player_index:] + self._players[0:player_index]
+ elif self._dealing_direction == "rtl":
+ players = self._players[player_index:0:-1] + [self._players[0]] + self._players[self._number_of_players - 1:player_index:-1]
+
+ for cards_count_instruction in self._dealing_instructions:
+ for player in players:
+ cards = self._deck.get_cards_from_deal(cards_count_instruction)
+ player.receive_cards(cards)
+
+ def get_deck(self):
+ return self._deck
+
+
+class Belot(Game):
+
+ def __init__(self):
+ super().__init__(4, "ltr", (2, 3, 3), Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A']))
+
+
+class Poker(Game):
+
+ def __init__(self):
+ super().__init__(9, "rtl", (1, 1, 1, 1, 1))

Рая обнови решението на 15.11.2022 17:14 (преди над 1 година)

+import itertools
import random
class Card:
SUITS = {'clubs', 'diamonds', 'hearts', 'spades'}
FACES = {'2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'}
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=None):
- faces = face_filter if face_filter != None else Card.FACES
-
- self._cards = []
- for face in faces:
- for suit in Card.SUITS:
- self._cards.append(Card(suit, face))
+ def __init__(self, face_filter=Card.FACES):
+ self._cards = list(itertools.product(face_filter, Card.SUITS))
def cut(self):
times = random.randrange(1, len(self._cards))
- for _ in range(times):
- value = self._cards.pop(0)
- self._cards.append(value)
+ first_half = self._cards[0:times]
+ second_half = self._cards[times:]
+ self._cards = second_half + first_half
def shuffle(self):
random.shuffle(self._cards)
def get_cards(self):
return self._cards
def add_cards(self, cards):
self._cards.extend(cards)
def get_cards_from_deal(self, number_of_cards):
- dealt_cards = []
- for _ in range(number_of_cards):
- dealt_cards.append(self._cards.pop())
-
+ dealt_cards = self._cards[0:number_of_cards]
+ del self._cards[0:number_of_cards]
return dealt_cards
class Player:
_cards = list()
def get_cards(self):
return self._cards
def receive_cards(self, cards):
self._cards = self._cards + cards
def return_cards(self):
self._cards = []
class Game:
def __init__(self, number_of_players, dealing_direction, dealing_instructions, deck=Deck()):

deck=Deck() ще се евалюира само веднъж - при дефиниране на класа, т.е. всички инстанции на класа, които не получат deck като аргумент, ще споделят едно и също тесте.

self._number_of_players = number_of_players
self._dealing_direction = dealing_direction
self._dealing_instructions = dealing_instructions
self._deck = deck
self._players = []
for _ in range(number_of_players):
self._players.append(Player())
def get_players(self):
random_player_index = random.randrange(0, self._number_of_players)
players = self._players[random_player_index:] + self._players[0 : random_player_index]
return players
def prepare_deck(self):
for player in self._players:
cards = player.get_cards()
self._deck.add_cards(cards)
player.return_cards()
self._deck.shuffle()
self._deck.cut()
def deal(self, Player):
player_index = self._players.index(Player)
players = []
if self._dealing_direction == "ltr":
players = self._players[player_index:] + self._players[0:player_index]
elif self._dealing_direction == "rtl":
players = self._players[player_index:0:-1] + [self._players[0]] + self._players[self._number_of_players - 1:player_index:-1]
for cards_count_instruction in self._dealing_instructions:
for player in players:
cards = self._deck.get_cards_from_deal(cards_count_instruction)
player.receive_cards(cards)
def get_deck(self):
return self._deck
class Belot(Game):
def __init__(self):
super().__init__(4, "ltr", (2, 3, 3), Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A']))
class Poker(Game):
def __init__(self):
super().__init__(9, "rtl", (1, 1, 1, 1, 1))