Как случайным образом перемешать колоду карт среди игроков? - PullRequest
0 голосов
/ 09 июня 2018

У меня проблемы с использованием одной функции в другой для раздачи карт.Вот что у меня так далеко.

import random as rand 

def create(): 
     ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']   
     suites = ['H', 'C', 'D', 'S'] 
     deck = [[r + s] for s in suites for r in ranks]    
     return deck   

def cards_dealt (num_cards, num_players, deck): 
     rand.shuffle(deck) 


print(cards_dealt(5, 3, deck)) 

Я понимаю, что функция неполная.Мне нужно, чтобы num_cards было числом карт, которое получает каждый игрок, num_players - количество игроков, а колода - список строк карт из функции create ().Например, оператор печати покажет 5 карт, которые каждый из трех игроков получает из перетасованной колоды.Моя проблема в том, что всякий раз, когда я пишу что-то, он говорит, что колода не определена.

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Конечно, есть и другие способы сделать это, но вы можете выполнить свою функцию так, чтобы вернуть словарь ваших игроков и их рук:

def cards_dealt(num_cards, num_players, deck):
    rand.shuffle(deck)
    return {player:[deck.pop() for _ in range(num_cards)] for player in range(num_players)}

Затем, создайте свойколода (вот где ваша "колода не определена" проблема приходит) и вызовите вашу функцию:

my_deck = create()

print(cards_dealt(5, 3, my_deck))

, которая возвращает:

{0: [['10S'], ['8S'], ['7D'], ['6S'], ['4C']], 
 1: [['JD'], ['AC'], ['QD'], ['2D'], ['JS']], 
 2: [['6D'], ['4H'], ['AS'], ['4S'], ['9S']]}

Эквивалентная cards_dealt функция, но с циклами вместо словосочетаний и списков:

def cards_dealt (num_cards, num_players, deck): 
     rand.shuffle(deck)
     player_hands = {i:[] for i in range(num_players)}
     for player in range(num_players):
         for num in range(num_cards):
             player_hands[player].append(deck.pop())
     return player_hands
0 голосов
/ 09 июня 2018

Позвольте мне предложить объектно-ориентированный подход, в котором мы определим классы 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 предоставляет основы для раздачи карт и перемещения карт из рук в руки, но может быть расширен для реализации новых функций.

0 голосов
/ 09 июня 2018

Забудьте о двух ваших функциях, поскольку они обе правильные, и посмотрите на код верхнего уровня:

import random as rand
def ...
def ...
print(cards_dealt(5, 3, deck)) 

Откуда взялся deck?Нигде.Отсюда и исключение.

Совершенно очевидно, откуда вы намеревались получить его - у вас есть функция create, которая заканчивается return deck.Вы просто никуда его не вызываете.

Итак, вы хотите:

import random as rand
def ...
def ...
deck = create()
print(cards_dealt(5, 3, deck)) 

… или, если хотите прояснить, что глобальная переменная не связана с двумя локальными переменными:

import random as rand
def ...
def ...
mydeck = create()
print(cards_dealt(5, 3, mydeck)) 

… или, если вы хотите сделать вещи более краткими:

import random as rand
def ...
def ...
print(cards_dealt(5, 3, create())) 

Помимо этой проблемы, cards_dealt не имеет return, поэтомупросто возвращает None.Когда ваша функция завершена, возможно, что-то стоит распечатать, но сейчас, пока вы отлаживаете то, что у вас есть, это не очень полезно.

Между тем, если вы хотите напечатать перемешанную колоду, что может быть полезным, вы бы сделали что-то вроде этого:

import random as rand
def ...
def ...
mydeck = create()
cards_dealt(5, 3, mydeck)
print(mydeck)

Когда вы позже завершите функцию, чтобы она возвратила, скажем, кортеж из 3 списков по 5 карт,вы, вероятно, захотите сохранить эти возвращаемые значения для последующего использования, а также распечатать их, поэтому это может выглядеть примерно так:

import random as rand
def ...
def ...
mydeck = create()
hands = cards_dealt(5, 3, mydeck)
for hand in hands:
    print(hand)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...