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

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

Към профила на Божидар Горанов

Резултати

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

Код

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=None):
self.cards = []
paints = ('clubs', 'diamonds', 'hearts', 'spades')
card_faces = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A')
self.face_filter = face_filter
if self.face_filter is None:
pass
else:
card_faces = face_filter
for face in card_faces:
for paint in paints:
self.cards.append(Card(paint, face))
def cut(self):
x = random.randrange(1, len(self.cards))
self.cards = self.cards[x:] + self.cards[:x]
def shuffle(self):
random.shuffle(self.cards)
def get_cards(self):
return self.cards
class Player:
def __init__(self):
self.cards = []
def get_cards(self):
return self.cards
class Game:
def __init__(self, number_of_players, dealing_direction, dealing_instruction):
self.number_of_players = number_of_players
self.players = []
self.deck = Deck()
for i in range(number_of_players):
self.players.append(Player())
self.dealing_direction = dealing_direction
self.dealing_instruction = dealing_instruction
def get_players(self):
return self.players
def prepare_deck(self):
for player_index in range(self.number_of_players):
for card_index in range(len(self.players[player_index].cards)):
self.deck.cards.append(self.players[player_index].cards[card_index])
self.players[player_index].cards = []
self.deck.shuffle()
self.deck.cut()
def deal(self, player):
start_index = self.players.index(player)
for play_person in self.players:
if play_person is player:
break
start_index += 1
if self.dealing_direction == 'ltr':

Бих се опитал да комбинирам тези два блока. Смятам, че така дори ще се справиш с проблеми, които виждам във втория блок, но няма да коментирам изрично, защото ако изтестваш, ще хванеш сам.

for cards_num in self.dealing_instruction:
index = start_index
for i in range(self.number_of_players):
for j in range(cards_num):
self.players[index].cards.append(self.deck.cards[0])
self.deck.cards.pop(0)
index += 1
if index >= self.number_of_players:
index = 0
elif self.dealing_direction == 'rtl':
for cards_num in self.dealing_instruction:
index = start_index
for i in range(self.number_of_players):
for j in range(cards_num):
self.players[index].cards.append(self.deck.cards[0])
self.deck.cards.pop(0)
index -= 1
if index <= 0:
index = self.number_of_players - 1
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self):
super().__init__(4, 'ltr', (2, 3, 3))
self.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))
self.deck = Deck()

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

.........EF...F
======================================================================
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
IndexError: list index out of range

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

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

----------------------------------------------------------------------
Ran 15 tests in 0.159s

FAILED (failures=2, errors=1)

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

Божидар обнови решението на 06.11.2022 19:49 (преди над 1 година)

+from random 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=None):
+ if face_filter is None:
+ face_filter = []
+ self.cards = []
+ paints = ('clubs', 'diamonds', 'hearts', 'spades')
+ card_faces = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A')
+ self.face_filter = face_filter
+ if self.face_filter is None:
+ br = 0
+ for face in card_faces:
+ for paint in paints:
+ self.cards.append(Card(paint, face))
+
+ else:
+ for face in face_filter:
+ for paint in paints:
+ self.cards.append(Card(paint, face))
+
+ def cut(self):
+ x = random.randrange(1, len(self.cards))
+ cards = self.cards[x:] + self.cards[:x]
+
+ def shuffle(self):
+ random.shuffle(self.cards)
+
+ def get_cards(self):
+ return self.cards
+
+
+class Player:
+ def __init__(self):
+ self.cards = []
+
+ def get_cards(self):
+ return self.cards
+
+
+class Game:
+ def __init__(self, number_of_players, dealing_direction, dealing_instruction):
+ self.deck = Deck()
+ self.number_of_players = number_of_players
+ self.players = []
+ for i in range(number_of_players):
+ self.players.append(Player())
+ self.dealing_direction = dealing_direction
+ self.dealing_instruction = dealing_instruction
+
+ def get_players(self):
+ return self.players
+
+ def prepare_deck(self):
+ for i in self.number_of_players:
+ self.players[i].cards = ''
+ self.deck.shuffle()
+ self.deck.cut()
+
+ def deal(self, player):
+ start_index = 0
+ for play_person in self.players:
+ if play_person is player:
+ break
+ start_index += 1
+ count_cards = 0
+ if self.dealing_direction == 'ltr':
+ for cards_num in self.dealing_instruction:
+ index = start_index
+ for i in self.number_of_players:
+ for j in cards_num:
+ self.players[index].cards.append(self.deck.cards[count_cards])
+ count_cards += 1
+ index += 1
+ if index >= self.number_of_players:
+ index = 0
+ elif self.dealing_instruction == 'rtl':
+ for cards_num in self.dealing_instruction:
+ index = start_index
+ for i in self.number_of_players:
+ for j in cards_num:
+ self.players[index].cards.append(self.deck.cards[count_cards])
+ count_cards += 1
+ index -= 1
+ if index <= 0:
+ index = self.number_of_players - 1
+
+ def get_deck(self):
+ return self.deck
+
+
+class Belot(Game):
+
+ def __init__(self, number_of_players=4, dealing_direction='ltr', dealing_instruction=(2, 3, 3)):
+ super().__init__(number_of_players, dealing_direction, dealing_instruction)
+ self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
+
+
+class Poker(Game):
+
+ def __init__(self, number_of_players=9, dealing_direction='rtl', dealing_instruction=(1, 1, 1, 1, 1)):
+ super().__init__(number_of_players, dealing_direction, dealing_instruction)
+ self.deck = Deck()

Божидар обнови решението на 08.11.2022 20:43 (преди над 1 година)

-from random import random
+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=None):
- if face_filter is None:
- face_filter = []
self.cards = []
paints = ('clubs', 'diamonds', 'hearts', 'spades')
card_faces = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A')
self.face_filter = face_filter
if self.face_filter is None:
br = 0
for face in card_faces:
for paint in paints:
self.cards.append(Card(paint, face))
+ else:
+ for face in face_filter:
+ for paint in paints:
+ self.cards.append(Card(paint, face))
- else:
- for face in face_filter:
- for paint in paints:
- self.cards.append(Card(paint, face))
-
def cut(self):
x = random.randrange(1, len(self.cards))
- cards = self.cards[x:] + self.cards[:x]
+ self.cards = self.cards[x:] + self.cards[:x]
def shuffle(self):
- random.shuffle(self.cards)
+ copy_cards = self.cards
+ random.shuffle(copy_cards)
+ self.cards = copy_cards
def get_cards(self):
return self.cards
class Player:
def __init__(self):
self.cards = []
def get_cards(self):
return self.cards
class Game:
def __init__(self, number_of_players, dealing_direction, dealing_instruction):
- self.deck = Deck()
self.number_of_players = number_of_players
self.players = []
+ self.deck = Deck()
for i in range(number_of_players):
self.players.append(Player())
self.dealing_direction = dealing_direction
self.dealing_instruction = dealing_instruction
def get_players(self):
return self.players
def prepare_deck(self):
- for i in self.number_of_players:
- self.players[i].cards = ''
+ for i in range(self.number_of_players):
+ for j in range(len(self.players[i].cards)):
+ self.deck.cards.append(self.players[i].cards[j])
+ self.players[i].cards = []

От идеологична гледна точка, добре е да не бъркаш в елементите на класа, а да му кажеш да вземе/даде елементи и сам да си преправи вътрешните атрибути.
На последната лекция стана въпрос за това.
Просто го вземи предвид за следващи неща. Не е нужно да преправяш.

self.deck.shuffle()
self.deck.cut()
def deal(self, player):
start_index = 0
for play_person in self.players:
if play_person is player:
break
start_index += 1
- count_cards = 0
if self.dealing_direction == 'ltr':

Бих се опитал да комбинирам тези два блока. Смятам, че така дори ще се справиш с проблеми, които виждам във втория блок, но няма да коментирам изрично, защото ако изтестваш, ще хванеш сам.

for cards_num in self.dealing_instruction:
index = start_index
- for i in self.number_of_players:
- for j in cards_num:
- self.players[index].cards.append(self.deck.cards[count_cards])
- count_cards += 1
+ for i in range(self.number_of_players):
+ for j in range(cards_num):
+ self.players[index].cards.append(self.deck.cards[0])
+ self.deck.cards.pop(0)
index += 1
if index >= self.number_of_players:
index = 0
elif self.dealing_instruction == 'rtl':
for cards_num in self.dealing_instruction:
index = start_index
for i in self.number_of_players:
for j in cards_num:
- self.players[index].cards.append(self.deck.cards[count_cards])
- count_cards += 1
+ self.players[index].cards.append(self.deck.cards[0])
+ self.deck.cards.pop(0)
index -= 1
if index <= 0:
index = self.number_of_players - 1
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self, number_of_players=4, dealing_direction='ltr', dealing_instruction=(2, 3, 3)):

Бих дефинирал тези аргументи като атрибути на класа, без да ги очаквам при инициализиране. Ще е една идея по-лесно да се чете, защото сега са натрупани.

def __init__(self):
    self.number_of_players = 4
    self.dealing_direction = 'ltr'

А защо не и директно да ги подадем на родителя, който така или иначе ще ги сетне като атрибути?

def __init__(self):
    super().__init__(4, 'ltr', (2, 3, 3))
super().__init__(number_of_players, dealing_direction, dealing_instruction)
self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
class Poker(Game):
def __init__(self, number_of_players=9, dealing_direction='rtl', dealing_instruction=(1, 1, 1, 1, 1)):
super().__init__(number_of_players, dealing_direction, dealing_instruction)
self.deck = Deck()

Божидар обнови решението на 14.11.2022 16:35 (преди над 1 година)

import random
class Card:
def __init__(self, suit, face):
- self.suit = suit
+ self._suit = suit
self.face = face
def get_suit(self):
- return self.suit
+ return self._suit
def get_face(self):
return self.face
class Deck:
def __init__(self, face_filter=None):
self.cards = []
paints = ('clubs', 'diamonds', 'hearts', 'spades')
card_faces = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A')
self.face_filter = face_filter
if self.face_filter is None:
- br = 0
- for face in card_faces:
- for paint in paints:
- self.cards.append(Card(paint, face))
+ pass
else:
- for face in face_filter:
- for paint in paints:
- self.cards.append(Card(paint, face))
+ card_faces = face_filter
+ for face in card_faces:
+ for paint in paints:
+ self.cards.append(Card(paint, face))
def cut(self):
x = random.randrange(1, len(self.cards))
self.cards = self.cards[x:] + self.cards[:x]
def shuffle(self):
- copy_cards = self.cards
- random.shuffle(copy_cards)
- self.cards = copy_cards
+ random.shuffle(self.cards)
def get_cards(self):
return self.cards
class Player:
def __init__(self):
self.cards = []
def get_cards(self):
return self.cards
class Game:
def __init__(self, number_of_players, dealing_direction, dealing_instruction):
self.number_of_players = number_of_players
self.players = []
self.deck = Deck()
for i in range(number_of_players):
self.players.append(Player())
self.dealing_direction = dealing_direction
self.dealing_instruction = dealing_instruction
def get_players(self):
return self.players
def prepare_deck(self):
- for i in range(self.number_of_players):
- for j in range(len(self.players[i].cards)):
- self.deck.cards.append(self.players[i].cards[j])
- self.players[i].cards = []
+ for player_index in range(self.number_of_players):
+ for card_index in range(len(self.players[player_index].cards)):
+ self.deck.cards.append(self.players[player_index].cards[card_index])
+ self.players[player_index].cards = []
self.deck.shuffle()
self.deck.cut()
def deal(self, player):
- start_index = 0
+ start_index = self.players.index(player)
for play_person in self.players:
if play_person is player:
break
start_index += 1
if self.dealing_direction == 'ltr':
for cards_num in self.dealing_instruction:
index = start_index
for i in range(self.number_of_players):
for j in range(cards_num):
self.players[index].cards.append(self.deck.cards[0])
self.deck.cards.pop(0)
index += 1
if index >= self.number_of_players:
index = 0
- elif self.dealing_instruction == 'rtl':
+ elif self.dealing_direction == 'rtl':
for cards_num in self.dealing_instruction:
index = start_index
- for i in self.number_of_players:
- for j in cards_num:
+ for i in range(self.number_of_players):
+ for j in range(cards_num):
self.players[index].cards.append(self.deck.cards[0])
self.deck.cards.pop(0)
index -= 1
+
if index <= 0:
index = self.number_of_players - 1
def get_deck(self):
return self.deck
class Belot(Game):
- def __init__(self, number_of_players=4, dealing_direction='ltr', dealing_instruction=(2, 3, 3)):
- super().__init__(number_of_players, dealing_direction, dealing_instruction)
+ def __init__(self):
+ super().__init__(4, 'ltr', (2, 3, 3))
self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
class Poker(Game):
- def __init__(self, number_of_players=9, dealing_direction='rtl', dealing_instruction=(1, 1, 1, 1, 1)):
- super().__init__(number_of_players, dealing_direction, dealing_instruction)
+ def __init__(self):
+ super().__init__(9, 'rtl', (1, 1, 1, 1, 1))
self.deck = Deck()