Позвольте мне предложить объектно-ориентированный подход, в котором мы определим классы Card
, Deck
и Player
.
. Использование объектов вместо списков карточек обеспечит удобный API для реализации игр.,Когда вы реализуете игровую логику, вам также будет проще хранить единственный источник истины о том, где находится каждая карта и у какого игрока есть каждая карта.
Deck API
import random
class Card:
def __init__(self, kind, rank, deck):
self._kind = kind
self._rank = rank
self.deck = deck
self.where = None
def __repr__(self):
return 'Card(kind={}, rank={}'.format(self.kind, self.rank)
@property
def kind(self):
return self._kind
@property
def rank(self):
return self._rank
class Deck:
def __init__(self):
ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
kinds = ['H', 'C', 'D', 'S']
self.cards = [Card(kind, rank, self) for kind in kinds for rank in ranks]
def deal(self, players, n=None):
if any(p.deck is not self for p in players):
raise RuntimeError('Player {} is not playing the deck'.format(p.id))
n = n if n is not None else len(self.cards)
random.shuffle(self.cards)
for i, card in enumerate(self.cards[:n * len(players)]):
card.where = players[i % len(players)]
class Player:
def __init__(self, id, deck):
self.id = id
self.deck = deck
@property
def hand(self):
return [card for card in deck.cards if card.where is self]
Дилинговые карты
deck = Deck()
players = [Player(id, deck) for id in range(3)]
deck.deal(players, n=4)
for p in players:
print(p.hand)
Вывод
[Card(kind=D, rank=A), Card(kind=D, rank=2), Card(kind=S, rank=5), Card(kind=S, rank=K)]
[Card(kind=S, rank=9), Card(kind=D, rank=5), Card(kind=C, rank=A), Card(kind=C, rank=Q)]
[Card(kind=C, rank=9), Card(kind=S, rank=J), Card(kind=D, rank=3), Card(kind=H, rank=9)]
Игра на карту
Атрибут card.where
можно обновить, чтобы указать положение карты,Поскольку это единственный источник истины для положения карты, это обновляет свойство player.hand
.
deck = Deck()
players = [Player(id, deck) for id in range(2)]
deck.deal(players, n=1)
players[0].hand[0].where = players[1]
for p in players:
print(p.hand)
Вывод
[]
[Card(kind=H, rank=K), Card(kind=D, rank=2)]
Дополнительные функции
Приведенный выше API предоставляет основы для раздачи карт и перемещения карт из рук в руки, но может быть расширен для реализации новых функций.