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

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

Към профила на Йолина Вълчева

Резултати

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

Код

import random
type_of_face = ("2", "3", "4", "5",
"6", "7", "8", "9",
"10", "J", "Q", "K", "A")
type_of_suit = ("spades", "diamonds", "hearts", "clubs")
type_of_directions = ("ltr", "rtl")
class Card:
def __init__(self, suit, face):
if suit in type_of_suit and face in type_of_face:

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

self._suit = suit
self._face = face
else:
self._suit = "none"
self._face = "none"
def get_suit(self):
return self._suit
def get_face(self):
return self._face
def get_card(self):
return self.get_suit(), self.get_face()
class Deck:
def __init__(self, face_filter=None):
self.face_filter = face_filter or type_of_face
self.cards = []
for suit in type_of_suit:
for face in self.face_filter:
self.cards.append(Card(suit, face))
def cut(self):
index = random.randrange(2,len(self.cards))
self.cards = self.cards[index:]+self.cards[:index]
def shuffle(self):
random.shuffle(self.cards)
def get_top_card(self):
if self.cards:
return self.cards.pop()
def add_card(self, card):
self.cards.append(card)
def get_cards(self):
return self.cards
def print_deck(self):
for card in self.cards:
print(card.get_suit())
print(card.get_face())
class Player:
def __init__(self):
self.cards = []
def pick_card(self, card):
self.cards.append(card)
def get_cards(self):
return self.cards
class Game:
def __init__(self, numer_of_players, dealing_direction, dealing_instructons, face_filter=None):
self.number_of_players = numer_of_players
self.dealing_directions = dealing_direction if dealing_direction in type_of_directions else "ltr"
self.dealing_instructons = dealing_instructons
self.players = {0 : Player()}
self.deck = Deck(face_filter)
for number in range(self.number_of_players):
self.players[number] = Player()
def __find_player_index(self, player):
for index in self.players:
if self.players[index] == player:
return index
return -1
def get_players(self):
return list(self.players.values())
def prepare_deck(self):
for player in self.players:
cards = self.players[player].get_cards()
while len(cards) > 0:
self.deck.add_card(cards.pop())
self.deck.shuffle()
self.deck.cut()
def deal_card(self, start_index, cards_count):
if self.dealing_directions == "ltr":
for index in range(start_index, len(self.players)):
for number in range(cards_count):
self.players[index].pick_card(self.deck.get_top_card())
for index in range(start_index):
for number in range(cards_count):
self.players[index].pick_card(self.deck.get_top_card())
else:
for index in reversed(range(start_index)):
for number in range(cards_count):
self.players[index].pick_card(self.deck.get_top_card())
for index in reversed(range(start_index, len(self.players))):
for number in range(cards_count):
self.players[index].pick_card(self.deck.get_top_card())
def deal(self, player):
start_index = self.__find_player_index(player)
for round in self.dealing_instructons:
self.deal_card(start_index, round)
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self):
face_filter = ["7", "8", "9", "10", "J", "Q", "K", "A"]
super().__init__(3, "ltr", (2, 3, 3), face_filter)
class Poker(Game):
def __init__(self):
super().__init__(9, "rtl", (1, 1, 1, 1, 1))

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

.F........F...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: 3 != 4

======================================================================
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: {('clubs', '7'), ('clubs', '3'), ('clubs', '8')} not found in ({('spades', '2'), ('spades', '3'), ('spades', '10')}, {('clubs', 'A'), ('clubs', 'K'), ('clubs', '6')})

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

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

FAILED (failures=3)

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

Йолина обнови решението на 13.11.2022 20:18 (преди над 1 година)

+import random
+
+type_of_face = ("2", "3", "4", "5",
+ "6", "7", "8", "9",
+ "10", "J", "Q", "K", "A")
+
+type_of_suit = ("spades", "diamonds", "hearts", "clubs")
+
+type_of_directions = ("ltr", "rtl")
+
+
+class Card:
+ def __init__(self, suit, face):
+ if suit in type_of_suit and face in type_of_face:

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

+ self.suit = suit
+ self.face = face
+ else:
+ self.suit = "none"
+ self.face = "none"
+
+ def get_suit(self):
+ return self.suit
+
+ def get_face(self):
+ return self.face
+
+ def get_card(self):
+ return self.get_suit(), self.get_face()
+
+
+class Deck:
+ def __init__(self, face_filter = None):
+ self.face_filter = type_of_face if face_filter == None else face_filter
+ self.cards = []
+ for suit in type_of_suit:
+ for face in self.face_filter:
+ self.cards.append(Card(suit,face))
+
+ def cut(self):
+ last_card = self.cards[len(self.cards) - 1]

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

+ self.cards.insert(0,last_card)
+ self.cards.pop()
+
+ def shuffle(self):
+ random.shuffle(self.cards)
+
+ def get_top_card(self):
+ if self.cards:
+ return self.cards.pop()
+
+ def add_card(self, card):
+ self.cards.append(card)
+
+ def get_cards(self):
+ return self.cards
+
+ def print_deck(self):
+ for card in self.cards:
+ print(card.get_suit())
+ print(card.get_face())
+
+
+class Player:
+ def __init__(self):
+ self.cards = []
+
+ def pick_card(self, card):
+ self.cards.append(card)
+
+ def get_cards(self):
+ return self.cards
+
+
+class Game:
+ def __init__(self, numer_of_players, dealing_direction, dealing_instructons, face_filter = None):
+ self.number_of_players = numer_of_players
+ self.dealing_directions = dealing_direction if dealing_direction in type_of_directions else "ltr"
+ self.dealing_instructons = dealing_instructons
+ self.players = {0 : Player()}
+ self.deck = Deck() if face_filter == None else Deck(face_filter)
+
+ for number in range(self.number_of_players):
+ self.players[number] = Player()
+
+ def __find_player_index(self, player):
+ for index in self.players:
+ if self.players[index] == player:
+ return index
+ return -1
+
+ def get_players(self):
+ return self.players

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

+
+ def prepare_deck(self):
+ for player in self.players:
+ cards = self.players[player].get_cards()
+ while len(cards) > 0:
+ self.deck.add_card(cards.pop())
+
+ self.deck.shuffle()
+ self.deck.cut()
+
+ def deal_card(self, start_index, numbers):
+ if self.dealing_directions == "ltr":
+ for index in range(start_index, len(self.players)):
+ for number in range(numbers):
+ self.players[index].pick_card(self.deck.get_top_card())
+ for index in range(start_index):
+ for number in range(numbers):
+ self.players[index].pick_card(self.deck.get_top_card())
+ else:
+ for index in reversed(range(start_index)):
+ for number in range(numbers):
+ self.players[index].pick_card(self.deck.get_top_card())
+ for index in reversed(range(start_index, len(self.players))):
+ for number in range(numbers):
+ self.players[index].pick_card(self.deck.get_top_card())
+
+ def deal(self, player):
+ start_index = self.__find_player_index(player)
+ for round in self.dealing_instructons:
+ self.deal_card(start_index, round)
+
+ def get_deck(self):
+ return self.deck
+
+
+class Belot(Game):
+ def __init__(self):
+ face_filter = ["7", "8", "9", "10", "J", "Q", "K", "A"]
+ super().__init__(3,"ltr",(2,3,3),face_filter)
+
+
+class Poker(Game):
+ def __init__(self):
+ super().__init__(9,"rtl",(1,1,1,1,1))
+
+
+belot = Belot()
+players = belot.get_players()
+belot.prepare_deck()
+belot.deal(players[0])
+# Play the game, argue about the rules, curse, fight, argue about who should deal the cards during second round...
+belot.prepare_deck()
+belot.deal(players[1])
+
+poker = Poker()
+players = poker.get_players()
+poker.prepare_deck()
+poker.deal(players[0])
+# Play the game, argue about the rules, curse, fight, argue about who should deal the cards during second round...
+poker.prepare_deck()
+poker.deal(players[1])

Йолина обнови решението на 14.11.2022 20:32 (преди над 1 година)

import random
type_of_face = ("2", "3", "4", "5",
- "6", "7", "8", "9",
- "10", "J", "Q", "K", "A")
+ "6", "7", "8", "9",
+ "10", "J", "Q", "K", "A")
type_of_suit = ("spades", "diamonds", "hearts", "clubs")
type_of_directions = ("ltr", "rtl")
class Card:
def __init__(self, suit, face):
if suit in type_of_suit and face in type_of_face:
- self.suit = suit
- self.face = face
+ self._suit = suit
+ self._face = face
else:
- self.suit = "none"
- self.face = "none"
+ self._suit = "none"
+ self._face = "none"
def get_suit(self):
- return self.suit
+ return self._suit
def get_face(self):
- return self.face
+ return self._face
def get_card(self):
return self.get_suit(), self.get_face()
class Deck:
- def __init__(self, face_filter = None):
- self.face_filter = type_of_face if face_filter == None else face_filter
+ def __init__(self, face_filter=None):
+ self.face_filter = face_filter or type_of_face
self.cards = []
for suit in type_of_suit:
for face in self.face_filter:
- self.cards.append(Card(suit,face))
+ self.cards.append(Card(suit, face))
def cut(self):
- last_card = self.cards[len(self.cards) - 1]
- self.cards.insert(0,last_card)
- self.cards.pop()
+ index = random.randrange(2,len(self.cards))
+ self.cards = self.cards[index:]+self.cards[:index]
def shuffle(self):
random.shuffle(self.cards)
def get_top_card(self):
if self.cards:
return self.cards.pop()
def add_card(self, card):
self.cards.append(card)
def get_cards(self):
return self.cards
def print_deck(self):
for card in self.cards:
print(card.get_suit())
print(card.get_face())
class Player:
def __init__(self):
self.cards = []
def pick_card(self, card):
self.cards.append(card)
def get_cards(self):
return self.cards
class Game:
- def __init__(self, numer_of_players, dealing_direction, dealing_instructons, face_filter = None):
+ def __init__(self, numer_of_players, dealing_direction, dealing_instructons, face_filter=None):
self.number_of_players = numer_of_players
self.dealing_directions = dealing_direction if dealing_direction in type_of_directions else "ltr"
self.dealing_instructons = dealing_instructons
self.players = {0 : Player()}
- self.deck = Deck() if face_filter == None else Deck(face_filter)
+ self.deck = Deck(face_filter)
for number in range(self.number_of_players):
self.players[number] = Player()
def __find_player_index(self, player):
for index in self.players:
if self.players[index] == player:
return index
return -1
def get_players(self):
- return self.players
+ return list(self.players.values())
def prepare_deck(self):
for player in self.players:
cards = self.players[player].get_cards()
while len(cards) > 0:
self.deck.add_card(cards.pop())
self.deck.shuffle()
self.deck.cut()
- def deal_card(self, start_index, numbers):
+ def deal_card(self, start_index, cards_count):
if self.dealing_directions == "ltr":
for index in range(start_index, len(self.players)):
- for number in range(numbers):
+ for number in range(cards_count):
self.players[index].pick_card(self.deck.get_top_card())
for index in range(start_index):
- for number in range(numbers):
+ for number in range(cards_count):
self.players[index].pick_card(self.deck.get_top_card())
else:
for index in reversed(range(start_index)):
- for number in range(numbers):
+ for number in range(cards_count):
self.players[index].pick_card(self.deck.get_top_card())
for index in reversed(range(start_index, len(self.players))):
- for number in range(numbers):
+ for number in range(cards_count):
self.players[index].pick_card(self.deck.get_top_card())
def deal(self, player):
start_index = self.__find_player_index(player)
for round in self.dealing_instructons:
self.deal_card(start_index, round)
def get_deck(self):
return self.deck
class Belot(Game):
def __init__(self):
face_filter = ["7", "8", "9", "10", "J", "Q", "K", "A"]
- super().__init__(3,"ltr",(2,3,3),face_filter)
+ super().__init__(3, "ltr", (2, 3, 3), face_filter)
class Poker(Game):
def __init__(self):
- super().__init__(9,"rtl",(1,1,1,1,1))
-
+ super().__init__(9, "rtl", (1, 1, 1, 1, 1))
-
-belot = Belot()
-players = belot.get_players()
-belot.prepare_deck()
-belot.deal(players[0])
-# Play the game, argue about the rules, curse, fight, argue about who should deal the cards during second round...
-belot.prepare_deck()
-belot.deal(players[1])
-
-poker = Poker()
-players = poker.get_players()
-poker.prepare_deck()
-poker.deal(players[0])
-# Play the game, argue about the rules, curse, fight, argue about who should deal the cards during second round...
-poker.prepare_deck()
-poker.deal(players[1])