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

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

Към профила на Теодора Петкова

Резултати

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

Код

from random import randint, shuffle
faces = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
suits = ['clubs', 'diamonds', 'hearts', 'spades']
class Card:
def __init__(self, suit, face):
""" Define card with suit: 'clubs', 'diamonds', 'hearts', 'spades' and face: '2',...'9', '10', 'J', 'Q',
'K' или 'A' """
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 = []
if face_filter is not None:

А ако е None? Тестето остава празно, а не трябва да има игра без тесте. Дори да не си наследила този клас, той пак трябва да инициализира стандартно тесте.

Deck трябва да работи самостоятелно, без да се имат предвид игрите по-долу. Тестовете ни ще разчитат, че при инициализиране на Deck имаме карти, с които да изтестваме класа. Инициализиране на Deck трябва да обект с готово за работа стандартното тесте от 52 карти.

# print("Hi")
for face in face_filter:
for suit in suits:
self.cards.append(Card(suit, face))
else:
for face in faces:
for suit in suits:
self.cards.append(Card(suit, face))
'''for c in self.cards:
print(c.get_face() + ": " + c.get_suit())'''
def cut(self):
index = randint(1, len(self.cards) - 1)
first_half = self.cards[:index]
second_half = self.cards[index:]
self.cards = second_half + first_half
def shuffle(self):
shuffle(self.cards)
def get_cards(self):
''' for c in self.cards:
print(c.get_face() + ": " + c.get_suit())'''
return self.cards
def add_card(self, card):
self.cards.append(card)
def deal_card(self):
return self.cards.pop()
class Player:
def __init__(self):
self.cards = []
# self.name = name
def get_cards(self):
return self.cards
def add_card(self, card):
self.cards.append(card)
def give_cards(self):
self.cards = []
def print_cards(self):
for c in self.cards:
print(" - " + c.get_face() + ": " + c.get_suit())
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.deck = Deck(faces)
self.players = []
for _ in range(number_of_players):
self.players.append(Player())
def get_players(self):
return self.players
def prepare_deck(self):
for p in self.players:
cards = p.get_cards()
for c in cards:
# print(f"getting card: {c.face}: {c.suit} from player {p.name}")
self.deck.add_card(c)
p.give_cards()

Не мисля, че си заслужава да инициализираш ново тесте при всяко раздаване. Можеш просто да изпразниш старото. Реално и така ще работи, но е прахосване на ресурси.

self.deck.shuffle()
self.deck.cut()
def deal(self, start_player):
start_index = self.players.index(start_player)
if self.dealing_direction == 'rtl':
before = self.players[:start_index + 1]
after = self.players[start_index + 1:]
before.reverse()
after.reverse()
self.players = before + after
else:
before = self.players[:start_index]
after = self.players[start_index:]
self.players = after + before
# for p in self.players:
# print(f"{p.name}")
for deal_turn in self.dealing_instructions:
for player in self.players:
for _ in range(deal_turn):
card = self.deck.deal_card()
player.add_card(card)
# print(f"Player {p.name} gets {card.face}: {card.suit}")
# for p in self.players:
# print(f"{p.name}: {p.print_cards()}")
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self):
super().__init__(number_of_players=4, dealing_direction='ltr', dealing_instructions=(2, 3, 3))
self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
'''for c in self.deck.get_cards():
print(f"{c.get_face}: {c.get_suit}")'''
class Poker(Game):
def __init__(self):
super().__init__(number_of_players=9, dealing_direction='rtl', dealing_instructions=(1, 1, 1, 1, 1))
self.deck = Deck(faces)

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

...............
----------------------------------------------------------------------
Ran 15 tests in 0.166s

OK

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

Теодора обнови решението на 13.11.2022 15:04 (преди над 1 година)

+from random import randint, shuffle
+
+faces = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
+suits = ['clubs', 'diamonds', 'hearts', 'spades']
+
+
+class Card:
+
+ def __init__(self, suit, face):
+ ''' Define card with suit: 'clubs', 'diamonds', 'hearts', 'spades' and face: '2',...'9', '10', 'J', 'Q',
+ 'K' или 'A' '''
+ 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 = []
+ if face_filter is not None:
+ # print("Hi")
+ for face in face_filter:
+ for s in suits:
+ self.cards.append(Card(s, face))
+
+ '''for c in self.cards:
+ print(c.get_face() + ": " + c.get_suit())'''
+
+ def cut(self):
+ index = randint(1, len(self.cards))
+ first_half = self.cards[:index]
+ second_half = self.cards[index:]
+ self.cards = second_half + first_half
+
+ def shuffle(self):
+ shuffle(self.cards)
+
+ def get_cards(self):
+ """ for c in self.cards:
+ print(c.get_face() + ": " + c.get_suit())"""
+ return self.cards
+
+ def add_card(self, card):
+ self.cards.append(card)
+
+ def deal_card(self):
+ card = self.cards[-1]
+ self.cards.remove(card)
+ return card
+
+
+class Player:
+
+ def __init__(self):
+ self.cards = Deck()
+ # self.name = name
+
+ def get_cards(self):
+ return self.cards.get_cards()
+
+ def add_card(self, card):
+ self.cards.add_card(card)
+
+ def give_cards(self):
+ self.cards = Deck()
+
+ def print_cards(self):
+ for c in self.cards.get_cards():
+ print(" - " + c.get_face() + ": " + c.get_suit())
+
+
+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.deck = Deck()
+ self.players = []
+ for i in range(0, number_of_players):
+ self.players.append(Player())
+
+ def get_players(self):
+ return self.players
+
+ def prepare_deck(self):
+ for p in self.players:
+ cards = p.get_cards()
+ for c in cards:
+ # print(f"getting card: {c.face}: {c.suit} from player {p.name}")
+ self.deck.add_card(c)
+ p.give_cards()
+
+ self.deck.shuffle()
+ self.deck.cut()
+
+ def deal(self, start_player):
+ st_ind = self.players.index(start_player)
+
+ if self.dealing_direction == 'rtl':
+ before = self.players[:st_ind + 1]
+ after = self.players[st_ind + 1:]
+ before.reverse()
+ after.reverse()
+ self.players = before + after
+ else:
+ before = self.players[:st_ind]
+ after = self.players[st_ind:]
+ self.players = after + before
+
+ # for p in self.players:
+ # print(f"{p.name}")
+
+ for d in self.dealing_instructions:
+ for p in self.players:
+ for i in range(0, d):
+ card = self.deck.deal_card()
+ p.add_card(card)
+ # print(f"Player {p.name} gets {card.face}: {card.suit}")
+
+ # for p in self.players:
+ # print(f"{p.name}: {p.print_cards()}")
+
+ def get_deck(self):
+ return self.deck
+
+
+class Belot(Game):
+ def __init__(self):
+ super().__init__(number_of_players=4, dealing_direction='ltr', dealing_instructions=(2, 3, 3))
+ self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
+
+ # for c in self.deck.get_cards():
+ # print(f"{c.get_face}: {c.get_suit}")
+
+
+class Poker(Game):
+ def __init__(self):
+ super().__init__(number_of_players=9, dealing_direction='rtl', dealing_instructions=(1, 1, 1, 1, 1))
+ self.deck = Deck(faces)

Теодора обнови решението на 13.11.2022 15:05 (преди над 1 година)

from random import randint, shuffle
faces = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
suits = ['clubs', 'diamonds', 'hearts', 'spades']
class Card:
def __init__(self, suit, face):
''' Define card with suit: 'clubs', 'diamonds', 'hearts', 'spades' and face: '2',...'9', '10', 'J', 'Q',

Спрямо PEP8, докстринговете трябва да се дефинират в """, без интервали след отварящите кавички и преди затварящите, и завършващи с точка. Има изисквания и за дължината на дефиницията. Не е нужно да го преправяш. Просто имай предвид за следващия път.

'K' или 'A' '''
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 = []
if face_filter is not None:

А ако е None? Тестето остава празно, а не трябва да има игра без тесте. Дори да не си наследила този клас, той пак трябва да инициализира стандартно тесте.

# print("Hi")
for face in face_filter:
for s in suits:
self.cards.append(Card(s, face))
'''for c in self.cards:
print(c.get_face() + ": " + c.get_suit())'''
def cut(self):
- index = randint(1, len(self.cards))
+ index = randint(1, len(self.cards) - 1)
first_half = self.cards[:index]
second_half = self.cards[index:]
self.cards = second_half + first_half
def shuffle(self):
shuffle(self.cards)
def get_cards(self):
""" for c in self.cards:
print(c.get_face() + ": " + c.get_suit())"""
return self.cards
def add_card(self, card):
self.cards.append(card)
def deal_card(self):
card = self.cards[-1]
self.cards.remove(card)
return card
class Player:
def __init__(self):
self.cards = Deck()
# self.name = name
def get_cards(self):
return self.cards.get_cards()
def add_card(self, card):
self.cards.add_card(card)
def give_cards(self):
self.cards = Deck()
def print_cards(self):
for c in self.cards.get_cards():
print(" - " + c.get_face() + ": " + c.get_suit())
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.deck = Deck()
self.players = []
for i in range(0, number_of_players):
self.players.append(Player())
def get_players(self):
return self.players
def prepare_deck(self):
for p in self.players:
cards = p.get_cards()
for c in cards:
# print(f"getting card: {c.face}: {c.suit} from player {p.name}")
self.deck.add_card(c)
p.give_cards()

Не мисля, че си заслужава да инициализираш ново тесте при всяко раздаване. Можеш просто да изпразниш старото. Реално и така ще работи, но е прахосване на ресурси.

self.deck.shuffle()
self.deck.cut()
def deal(self, start_player):
st_ind = self.players.index(start_player)
if self.dealing_direction == 'rtl':
before = self.players[:st_ind + 1]
after = self.players[st_ind + 1:]
before.reverse()
after.reverse()
self.players = before + after
else:
before = self.players[:st_ind]
after = self.players[st_ind:]
self.players = after + before
# for p in self.players:
# print(f"{p.name}")
for d in self.dealing_instructions:
for p in self.players:
for i in range(0, d):
card = self.deck.deal_card()
p.add_card(card)
# print(f"Player {p.name} gets {card.face}: {card.suit}")
# for p in self.players:
# print(f"{p.name}: {p.print_cards()}")
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self):
super().__init__(number_of_players=4, dealing_direction='ltr', dealing_instructions=(2, 3, 3))
self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
# for c in self.deck.get_cards():
# print(f"{c.get_face}: {c.get_suit}")
class Poker(Game):
def __init__(self):
super().__init__(number_of_players=9, dealing_direction='rtl', dealing_instructions=(1, 1, 1, 1, 1))
self.deck = Deck(faces)

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

from random import randint, shuffle
faces = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
suits = ['clubs', 'diamonds', 'hearts', 'spades']
class Card:
def __init__(self, suit, face):
- ''' Define card with suit: 'clubs', 'diamonds', 'hearts', 'spades' and face: '2',...'9', '10', 'J', 'Q',
- 'K' или 'A' '''
- self.suit = suit
- self.face = face
+ """ Define card with suit: 'clubs', 'diamonds', 'hearts', 'spades' and face: '2',...'9', '10', 'J', 'Q',
+ 'K' или 'A' """
+ self._suit = suit
+ self._face = face
def get_suit(self):
- return self.suit
+ return self._suit
def get_face(self):
- return self.face
+ return self._face
class Deck:
def __init__(self, face_filter=None):
+ """ Deck is a container for cards when a new Game is initialized then it creates a full deck of 52 cards,
+ and when a new Player has initialized his Deck is empty until cards are added. """
+
self.cards = []
if face_filter is not None:

Deck трябва да работи самостоятелно, без да се имат предвид игрите по-долу. Тестовете ни ще разчитат, че при инициализиране на Deck имаме карти, с които да изтестваме класа. Инициализиране на Deck трябва да обект с готово за работа стандартното тесте от 52 карти.

# print("Hi")
for face in face_filter:
- for s in suits:
- self.cards.append(Card(s, face))
+ for suit in suits:
+ self.cards.append(Card(suit, face))
+ '''else:
+ for face in faces:
+ for suit in suits:
+ self.cards.append(Card(suit, face))'''
'''for c in self.cards:
print(c.get_face() + ": " + c.get_suit())'''
def cut(self):
index = randint(1, len(self.cards) - 1)
first_half = self.cards[:index]
second_half = self.cards[index:]
self.cards = second_half + first_half
def shuffle(self):
shuffle(self.cards)
def get_cards(self):
- """ for c in self.cards:
- print(c.get_face() + ": " + c.get_suit())"""
+ ''' for c in self.cards:
+ print(c.get_face() + ": " + c.get_suit())'''
return self.cards
def add_card(self, card):
self.cards.append(card)
def deal_card(self):
- card = self.cards[-1]
- self.cards.remove(card)
- return card
+ return self.cards.pop()
class Player:
def __init__(self):
self.cards = Deck()
# self.name = name
def get_cards(self):
return self.cards.get_cards()
def add_card(self, card):
self.cards.add_card(card)
def give_cards(self):
self.cards = Deck()
def print_cards(self):
for c in self.cards.get_cards():
print(" - " + c.get_face() + ": " + c.get_suit())
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.deck = Deck()
+ self.deck = Deck(faces)
self.players = []
- for i in range(0, number_of_players):
+ for _ in range(number_of_players):
self.players.append(Player())
def get_players(self):
return self.players
def prepare_deck(self):
for p in self.players:
cards = p.get_cards()
for c in cards:
# print(f"getting card: {c.face}: {c.suit} from player {p.name}")
self.deck.add_card(c)
p.give_cards()
self.deck.shuffle()
self.deck.cut()
def deal(self, start_player):
- st_ind = self.players.index(start_player)
+ start_index = self.players.index(start_player)
if self.dealing_direction == 'rtl':
- before = self.players[:st_ind + 1]
- after = self.players[st_ind + 1:]
+ before = self.players[:start_index + 1]
+ after = self.players[start_index + 1:]
before.reverse()
after.reverse()
self.players = before + after
else:
- before = self.players[:st_ind]
- after = self.players[st_ind:]
+ before = self.players[:start_index]
+ after = self.players[start_index:]
self.players = after + before
# for p in self.players:
# print(f"{p.name}")
- for d in self.dealing_instructions:
- for p in self.players:
- for i in range(0, d):
+ for deal_turn in self.dealing_instructions:
+ for player in self.players:
+ for _ in range(deal_turn):
card = self.deck.deal_card()
- p.add_card(card)
+ player.add_card(card)
# print(f"Player {p.name} gets {card.face}: {card.suit}")
# for p in self.players:
# print(f"{p.name}: {p.print_cards()}")
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self):
super().__init__(number_of_players=4, dealing_direction='ltr', dealing_instructions=(2, 3, 3))
self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
- # for c in self.deck.get_cards():
- # print(f"{c.get_face}: {c.get_suit}")
+ '''for c in self.deck.get_cards():
+ print(f"{c.get_face}: {c.get_suit}")'''
class Poker(Game):
def __init__(self):
super().__init__(number_of_players=9, dealing_direction='rtl', dealing_instructions=(1, 1, 1, 1, 1))
self.deck = Deck(faces)

Теодора обнови решението на 14.11.2022 23:29 (преди над 1 година)

from random import randint, shuffle
faces = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
suits = ['clubs', 'diamonds', 'hearts', 'spades']
class Card:
def __init__(self, suit, face):
""" Define card with suit: 'clubs', 'diamonds', 'hearts', 'spades' and face: '2',...'9', '10', 'J', 'Q',
'K' или 'A' """
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):
- """ Deck is a container for cards when a new Game is initialized then it creates a full deck of 52 cards,
- and when a new Player has initialized his Deck is empty until cards are added. """
-
+
self.cards = []
if face_filter is not None:
# print("Hi")
for face in face_filter:
for suit in suits:
self.cards.append(Card(suit, face))
- '''else:
+ else:
for face in faces:
for suit in suits:
- self.cards.append(Card(suit, face))'''
+ self.cards.append(Card(suit, face))
'''for c in self.cards:
print(c.get_face() + ": " + c.get_suit())'''
def cut(self):
index = randint(1, len(self.cards) - 1)
first_half = self.cards[:index]
second_half = self.cards[index:]
self.cards = second_half + first_half
def shuffle(self):
shuffle(self.cards)
def get_cards(self):
''' for c in self.cards:
print(c.get_face() + ": " + c.get_suit())'''
return self.cards
def add_card(self, card):
self.cards.append(card)
def deal_card(self):
return self.cards.pop()
class Player:
def __init__(self):
- self.cards = Deck()
+ self.cards = []
# self.name = name
def get_cards(self):
- return self.cards.get_cards()
+ return self.cards
def add_card(self, card):
- self.cards.add_card(card)
+ self.cards.append(card)
def give_cards(self):
- self.cards = Deck()
+ self.cards = []
def print_cards(self):
- for c in self.cards.get_cards():
+ for c in self.cards:
print(" - " + c.get_face() + ": " + c.get_suit())
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.deck = Deck(faces)
self.players = []
for _ in range(number_of_players):
self.players.append(Player())
def get_players(self):
return self.players
def prepare_deck(self):
for p in self.players:
cards = p.get_cards()
for c in cards:
# print(f"getting card: {c.face}: {c.suit} from player {p.name}")
self.deck.add_card(c)
p.give_cards()
self.deck.shuffle()
self.deck.cut()
def deal(self, start_player):
start_index = self.players.index(start_player)
if self.dealing_direction == 'rtl':
before = self.players[:start_index + 1]
after = self.players[start_index + 1:]
before.reverse()
after.reverse()
self.players = before + after
else:
before = self.players[:start_index]
after = self.players[start_index:]
self.players = after + before
# for p in self.players:
# print(f"{p.name}")
for deal_turn in self.dealing_instructions:
for player in self.players:
for _ in range(deal_turn):
card = self.deck.deal_card()
player.add_card(card)
# print(f"Player {p.name} gets {card.face}: {card.suit}")
# for p in self.players:
# print(f"{p.name}: {p.print_cards()}")
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self):
super().__init__(number_of_players=4, dealing_direction='ltr', dealing_instructions=(2, 3, 3))
self.deck = Deck(['7', '8', '9', '10', 'J', 'Q', 'K', 'A'])
'''for c in self.deck.get_cards():
print(f"{c.get_face}: {c.get_suit}")'''
class Poker(Game):
def __init__(self):
super().__init__(number_of_players=9, dealing_direction='rtl', dealing_instructions=(1, 1, 1, 1, 1))
self.deck = Deck(faces)