【问题标题】:Deck of cards, dealing alternately一副牌,交替发牌
【发布时间】:2014-11-17 11:20:11
【问题描述】:
import random
import itertools    
suit = 'CSHD'
rank = '23456789TJQKA'
deck_of_cards = [''.join(card) for card in itertools.product(rank, suit)]

def draw_card(deck,hand, count):
    for i in range(count):
        hand.append(deck.pop())

def hand_selection(deck):
    shuffled_deck = random.sample(deck, len(deck))
    dealer_hand = []
    player_hand = []
    draw_card(shuffled_deck, dealer_hand, 1)
    draw_card(shuffled_deck, player_hand, 1)
    draw_card(shuffled_deck, dealer_hand, 1)
    draw_card(shuffled_deck, player_hand, 1)
    return dealer_hand,player_hand

这里尽量遵循发牌原则。最初我想随机生成一张牌,将其从shuffled_deck 中删除,但我们不会通过随机翻牌来发牌,是吗?出于我的目的,代码做了它应该做的事情,但它看起来不太好。 (是的,shuffled_deckplayer_handdealer_hand 实际上都是全局变量,但暂时无关紧要。)

以这种方式发牌的更优雅(阅读:pythonic)的解决方案是什么?例如,我们是否在 3 名玩家之间玩类似中国扑克的游戏。像这样一个一个地处理似乎太乏味了。

【问题讨论】:

    标签: python playing-cards


    【解决方案1】:

    我会将卡片组设为一个类,以将其相关功能保持在一起:

    class Deck(object):
    
        def __init__(self, suits='CSHD', ranks='23456789TJQKA'):
            self.cards = [''.join(card) for card in itertools.product(ranks, suits)]
    
        def shuffle(self):
            random.shuffle(self.cards)
    
        def deal_cards(self, hand, count=1):
            for _ in range(count):
                hand.append(self.cards.pop())
    
        def return_cards(self, hand):
            self.cards.extend(hand)
    

    为了简化交易:

    deck = Deck()
    deck.shuffle()
    dealer_hand = []
    player_hand = []
    for _ in range(2): # number of rounds to deal
        for hand in (dealer_hand, player_hand): # hands to deal to
             deck.deal(hand)
    

    这更容易适应更多玩家和/或更多回合。

    【讨论】:

    • 让我想知道为什么他们不会在我们的编程课程中立即接触课程:(。
    • 有些人觉得它们很棘手,但如果没有它们,做卡片之类的事情就会变得更加困难。
    • 编程中的一副纸牌只是一个堆栈。在 python 中,堆栈只是一个 python 列表。使用类会混淆实际发生的事情,这实际上是 OO 的特性之一,但是一旦您熟练使用标准库,将类删掉会感觉更好。这里有一个很好的演讲,叫做“停止写作课程”:youtube.com/watch?v=o9pEzgHorH0
    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多