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

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

Към профила на Цветан Тошев

Резултати

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

Код

import random
suits = ["spades", "clubs", "diamonds", "hearts"]
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 str(self._suit)
def get_face(self):
return str(self._face)
def __repr__(self):
return str(self._face + " of " + self._suit)
class Deck :
cards = []
def __init__(self, face_filter=None):
if face_filter == None:
for suit in suits:
for face in faces:
self.cards.append(Card(suit , face))
else:
for suit in suits:
for face in face_filter:
self.cards.append(Card(suit, face))
def cut(self):
middle_index = int(len(self.cards) / 2)

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

first_half = self.cards[:middle_index]
sec_half = self.cards[middle_index:]
self.cards = sec_half + first_half
def shuffle(self):
random.shuffle(self.cards)
def get_cards(self):
return self.cards
def deal_card(self):
return self.cards.pop(0)
class Player:
players_cards = []
def add_card(self,given_card):
self.players_cards.append(given_card)
def get_cards(self):
cards_in_hand = self.players_cards
self.players_cards = []
return cards_in_hand
def __repr__(self):
return str(self.players_cards)
class Game:
players_in_the_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
for _ in range(self.number_of_players):
self.players_in_the_game.append(Player())
deck_for_game = Deck()
def get_players(self):
return self.players_in_the_game
def prepare_deck(self):
for current_player in self.players_in_the_game:
[self.deck_for_game.cards.append(cards) for cards in current_player.cards]
current_player.cards = []
self.deck_for_game.shuffle()
self.deck_for_game.cut()
def deal(self, player):
dealer = self.players_in_the_game.index(player)
if self.dealing_direction == 'rtl':
temp_players = self.players_in_the_game.reverse()
first_half = temp_players[:dealer]
sec_half = temp_players[dealer:]
temp_players = sec_half + first_half
for num in self.dealing_instructions:
for player_to_be_dealed in temp_players:
for i in range(num):
player_to_be_dealed.players_cards.append((self.deck_for_game.deal_card()))
else:
temp_players = self.players_in_the_game
first_half = temp_players[:dealer]
sec_half = temp_players[dealer:]
temp_players = sec_half + first_half
for num in self.dealing_instructions:
for player_to_be_dealed in temp_players:
for i in range(num):
player_to_be_dealed.players_cards.append(self.deck_for_game.deal_card())
def get_deck(self):
return self.deck_for_game
class Belot(Game):
def __init__(self):
super().__init__(4, "ltr", (2, 3, 3))
self.deck_for_game = Deck(["K", "A"])
class Poker(Game):
def __init__(self):
super().__init__(9, "rtl", (1, 1, 1, 1, 1))
belot = Belot()
players = belot.get_players()
belot.deal(players[0])
print(belot.get_players())

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

[[2 of spades, 3 of spades, 4 of spades, 5 of spades, 6 of spades, 7 of spades, 8 of spades, 9 of spades, 10 of spades, J of spades, Q of spades, K of spades, A of spades, 2 of clubs, 3 of clubs, 4 of clubs, 5 of clubs, 6 of clubs, 7 of clubs, 8 of clubs, 9 of clubs, 10 of clubs, J of clubs, Q of clubs, K of clubs, A of clubs, 2 of diamonds, 3 of diamonds, 4 of diamonds, 5 of diamonds, 6 of diamonds, 7 of diamonds], [2 of spades, 3 of spades, 4 of spades, 5 of spades, 6 of spades, 7 of spades, 8 of spades, 9 of spades, 10 of spades, J of spades, Q of spades, K of spades, A of spades, 2 of clubs, 3 of clubs, 4 of clubs, 5 of clubs, 6 of clubs, 7 of clubs, 8 of clubs, 9 of clubs, 10 of clubs, J of clubs, Q of clubs, K of clubs, A of clubs, 2 of diamonds, 3 of diamonds, 4 of diamonds, 5 of diamonds, 6 of diamonds, 7 of diamonds], [2 of spades, 3 of spades, 4 of spades, 5 of spades, 6 of spades, 7 of spades, 8 of spades, 9 of spades, 10 of spades, J of spades, Q of spades, K of spades, A of spades, 2 of clubs, 3 of clubs, 4 of clubs, 5 of clubs, 6 of clubs, 7 of clubs, 8 of clubs, 9 of clubs, 10 of clubs, J of clubs, Q of clubs, K of clubs, A of clubs, 2 of diamonds, 3 of diamonds, 4 of diamonds, 5 of diamonds, 6 of diamonds, 7 of diamonds], [2 of spades, 3 of spades, 4 of spades, 5 of spades, 6 of spades, 7 of spades, 8 of spades, 9 of spades, 10 of spades, J of spades, Q of spades, K of spades, A of spades, 2 of clubs, 3 of clubs, 4 of clubs, 5 of clubs, 6 of clubs, 7 of clubs, 8 of clubs, 9 of clubs, 10 of clubs, J of clubs, Q of clubs, K of clubs, A of clubs, 2 of diamonds, 3 of diamonds, 4 of diamonds, 5 of diamonds, 6 of diamonds, 7 of diamonds]]
FF...FF.EEEFEEE
======================================================================
ERROR: test_collecting_cards_before_dealing (test.TestGame)
Test collecting the cards before a new deal.
----------------------------------------------------------------------
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: 'Player' object has no attribute 'cards'

======================================================================
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: 'Game' object has no attribute 'deck_for_game'

======================================================================
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: 'Game' object has no attribute 'deck_for_game'

======================================================================
ERROR: test_prepare_deck (test.TestGame)
Test preparing the deck for dealing.
----------------------------------------------------------------------
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: 'Player' object has no attribute 'cards'

======================================================================
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: 'Poker' object has no attribute 'deck_for_game'

======================================================================
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: 'Poker' object has no attribute 'deck_for_game'

======================================================================
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:
('spades', '3')
('spades', '4')
('spades', '5')
('diamonds', '2')
('hearts', '2')
('clubs', '3')
('clubs', '4')
('clubs', '5')
('spades', '2')
('diamonds', '6')
('hearts', '6')
('clubs', '2')
('spades', '6')
('diamonds', '4')
('hearts', '4')
('clubs', '6')
('diamonds', '3')
('hearts', '3')
('diamonds', '5')
('hearts', '5')

======================================================================
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: 8 != 4

======================================================================
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')
('hearts', '6')
('diamonds', 'K')
('spades', 'K')
('hearts', '7')
('diamonds', 'Q')
('hearts', 'K')
('diamonds', '9')
('hearts', '4')
('hearts', 'Q')
('hearts', '9')
('hearts', '3')
('diamonds', '8')
('clubs', 'K')

======================================================================
FAIL: 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
AssertionError: 80 != 52

======================================================================
FAIL: test_players_creation (test.TestGame)
Test creation and retrieval of 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: 11 != 2

----------------------------------------------------------------------
Ran 15 tests in 0.209s

FAILED (failures=5, errors=6)

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

Цветан обнови решението на 14.11.2022 16:09 (преди над 1 година)

+import random
+suits = ["spades", "clubs", "diamonds", "hearts"]
+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 str(self.suit)
+
+ def get_face(self):
+ return str(self.face)
+
+ def __repr__(self):
+ return str(self.face + " of " + self.suit)
+
+
+class Deck :
+ def __init__(self, face_filter = None):
+ self.cards = []
+ if face_filter == None:
+ for suit_ in suits:
+ for face_ in faces:
+ self.cards.append(Card(suit_ , face_))
+ else:
+ for suit_ in suits:
+ for face_ in face_filter:
+ self.cards.append(Card(suit_ , face_))
+
+ def cut(self):
+ middle_index = int(len(self.cards) / 2)

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

+ first_half = self.cards[:middle_index]
+ sec_half = self.cards[middle_index:]
+ self.cards = sec_half + first_half
+
+ def shuffle(self):
+ random.shuffle(self.cards)
+
+ def get_cards(self):
+ return self.cards
+
+ def deal_card(self):
+ return self.cards.pop(0)
+
+
+class Player:
+ def __init__(self):
+ self.players_cards = []
+
+ def add_card(self,given_card):
+ self.players_cards.append(given_card)
+
+ def get_cards(self):
+ cards_in_hand = self.players_cards
+ self.players_cards = []
+ return cards_in_hand
+
+ def __repr__(self):
+ return str(self.players_cards)
+
+
+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_in_the_game = []
+ for num in range (self.number_of_players):
+ self.players_in_the_game.append(Player())
+ self.deck_for_game = Deck()
+
+
+ def get_players(self):
+ return self.players_in_the_game
+
+ def prepare_deck(self):
+ for current_player in self.players_in_the_game:
+ [self.deck_for_game.cards.append(cards) for cards in current_player.players_cards]
+ current_player.players_cards = []
+ self.deck_for_game.shuffle()
+ self.deck_for_game.cut()
+
+ def get_deck(self):
+ return self.deck_for_game
+
+ def deal(self, player):
+ player_dealing = self.players_in_the_game.index(player)
+ if self.dealing_direction == 'rtl':
+ self.players_in_the_game.reverse()

Не е добра идея при всяко раздаване на обръщаш реда на играчите. Ако ти трябва обратен ред, направи си го локално, но без да закачаш вече установения ред.

+ first_half = self.players_in_the_game[:player_dealing]
+ sec_half = self.players_in_the_game[player_dealing:]
+ self.players_in_the_game = sec_half + first_half
+
+ for num in self.dealing_instructions:
+ for player_to_be_dealed in self.players_in_the_game:
+ for i in range(0,num):
+ player_to_be_dealed.players_cards.append((self.deck_for_game.deal_card()))
+
+ else:
+ first_half = self.players_in_the_game[:player_dealing]
+ sec_half = self.players_in_the_game[player_dealing:]
+ self.players_in_the_game = sec_half + first_half
+
+ for num in self.dealing_instructions:
+ for player_to_be_dealed in self.players_in_the_game:
+ for i in range(0,num):
+ player_to_be_dealed.players_cards.append((self.deck_for_game.deal_card()))
+
+
+class Belot(Game):
+ def __init__(self):
+ super().__init__(4, "ltr", (2, 3, 3))
+ self.deck_for_game = Deck(['7', '8', '9','10', 'J', 'Q', 'K', 'A'])
+
+
+class Poker(Game):
+ def __init__(self):
+ super().__init__(9, "rtl", (1, 1, 1, 1, 1))
+

Цветан обнови решението на 14.11.2022 22:03 (преди над 1 година)

import random
+
+
suits = ["spades", "clubs", "diamonds", "hearts"]
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
+ self._suit = suit
+ self._face = face
def get_suit(self):
- return str(self.suit)
+ return str(self._suit)
def get_face(self):
- return str(self.face)
+ return str(self._face)
def __repr__(self):
- return str(self.face + " of " + self.suit)
+ return str(self._face + " of " + self._suit)
+
class Deck :
- def __init__(self, face_filter = None):
- self.cards = []
+ cards = []
+
+ def __init__(self, face_filter=None):
if face_filter == None:
- for suit_ in suits:
- for face_ in faces:
- self.cards.append(Card(suit_ , face_))
+ for suit in suits:
+ for face in faces:
+ self.cards.append(Card(suit , face))
else:
- for suit_ in suits:
- for face_ in face_filter:
- self.cards.append(Card(suit_ , face_))
+ for suit in suits:
+ for face in face_filter:
+ self.cards.append(Card(suit, face))
def cut(self):
middle_index = int(len(self.cards) / 2)
first_half = self.cards[:middle_index]
sec_half = self.cards[middle_index:]
self.cards = sec_half + first_half
def shuffle(self):
random.shuffle(self.cards)
def get_cards(self):
return self.cards
def deal_card(self):
return self.cards.pop(0)
+
class Player:
- def __init__(self):
- self.players_cards = []
-
+ players_cards = []
+
def add_card(self,given_card):
self.players_cards.append(given_card)
def get_cards(self):
cards_in_hand = self.players_cards
self.players_cards = []
return cards_in_hand
def __repr__(self):
return str(self.players_cards)
+
class Game:
+ players_in_the_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_in_the_game = []
- for num in range (self.number_of_players):
+ for _ in range(self.number_of_players):
self.players_in_the_game.append(Player())
- self.deck_for_game = Deck()
+ deck_for_game = Deck()
def get_players(self):
return self.players_in_the_game
def prepare_deck(self):
for current_player in self.players_in_the_game:
- [self.deck_for_game.cards.append(cards) for cards in current_player.players_cards]
- current_player.players_cards = []
+ [self.deck_for_game.cards.append(cards) for cards in current_player.cards]
+ current_player.cards = []
self.deck_for_game.shuffle()
self.deck_for_game.cut()
- def get_deck(self):
- return self.deck_for_game
-
def deal(self, player):
- player_dealing = self.players_in_the_game.index(player)
+ dealer = self.players_in_the_game.index(player)
if self.dealing_direction == 'rtl':
- self.players_in_the_game.reverse()
- first_half = self.players_in_the_game[:player_dealing]
- sec_half = self.players_in_the_game[player_dealing:]
- self.players_in_the_game = sec_half + first_half
+ temp_players = self.players_in_the_game.reverse()
+ first_half = temp_players[:dealer]
+ sec_half = temp_players[dealer:]
+ temp_players = sec_half + first_half
for num in self.dealing_instructions:
- for player_to_be_dealed in self.players_in_the_game:
- for i in range(0,num):
+ for player_to_be_dealed in temp_players:
+ for i in range(num):
player_to_be_dealed.players_cards.append((self.deck_for_game.deal_card()))
else:
- first_half = self.players_in_the_game[:player_dealing]
- sec_half = self.players_in_the_game[player_dealing:]
- self.players_in_the_game = sec_half + first_half
+ temp_players = self.players_in_the_game
+ first_half = temp_players[:dealer]
+ sec_half = temp_players[dealer:]
+ temp_players = sec_half + first_half
for num in self.dealing_instructions:
- for player_to_be_dealed in self.players_in_the_game:
- for i in range(0,num):
- player_to_be_dealed.players_cards.append((self.deck_for_game.deal_card()))
+ for player_to_be_dealed in temp_players:
+ for i in range(num):
+ player_to_be_dealed.players_cards.append(self.deck_for_game.deal_card())
+ def get_deck(self):
+ return self.deck_for_game
+
class Belot(Game):
+
def __init__(self):
super().__init__(4, "ltr", (2, 3, 3))
- self.deck_for_game = Deck(['7', '8', '9','10', 'J', 'Q', 'K', 'A'])
+ self.deck_for_game = Deck(["K", "A"])
+
class Poker(Game):
+
def __init__(self):
super().__init__(9, "rtl", (1, 1, 1, 1, 1))
+
+belot = Belot()
+players = belot.get_players()
+
+belot.deal(players[0])
+
+print(belot.get_players())