如何在python中打印用户友好的扑克手?

Posted

技术标签:

【中文标题】如何在python中打印用户友好的扑克手?【英文标题】:how to print user friendly poker hand in python? 【发布时间】:2016-08-08 07:10:20 【问题描述】:

我正在用 python 编写一个扑克游戏,我需要打印出一个便于用户阅读的扑克牌。它没有打印我需要它打印的东西。我知道有一个解决方案,我只是看不到它。代码如下:

userCards = ['AC','KD','4C','4S','7H']
print('Your cards:')
for card in range(len(userCards)):
   print('%s) %-2s of %-9s' % (card,cvalue,csuit))

我已经定义了用户卡、价值和花色。我只需要它打印出这样的手:

'你的卡片:'

1) 黑桃 A

2) 钻石之王

3)4 个俱乐部

4)4 黑桃

5)红心7

提前致谢!

【问题讨论】:

userCards 长什么样子? userCard 看起来像:['AC, 'KD','4C','4S,'7H'] 请将示例userCards 编辑到您的问题中。您是否定义了dict(或其他一些数据结构)来将'A' 转换为'Ace''K' 转换为'King' 等;还有一个用于'C' 到 'Clubs''D''Diamonds' 等? 是的,我有。我已经定义了返回值和套装的函数。 那为什么不给他们打电话呢? 【参考方案1】:

我建议使用字典,而不是使用扩展卡片等级和花色的功能。字典是执行此类操作的一种紧凑而有效的方式。

此代码应适用于 Python 2 或 Python 3。

from __future__ import print_function

suits = 'C': 'Clubs', 'D': 'Diamonds', 'H': 'Hearts', 'S': 'Spades'
ranks = 'J': 'Jack', 'Q': 'Queen', 'K': 'King', 'A': 'Ace'

def show_hand(hand):
    print('Your cards:')
    for rank, suit in hand:
        rank = ranks.get(rank, rank)
        suit = suits[suit]
        print('%s of %s' % (rank, suit))

#Test
userCards = ['AC', 'KD', '4C', '4S', '7H']
show_hand(userCards)

输出

Your cards:
Ace of Clubs
King of Diamonds
4 of Clubs
4 of Spades
7 of Hearts

我想我应该解释一下rank = ranks.get(rank, rank)

somedict.get(key, default)

尝试在somedict 中查找key。如果该键存在,则返回关联的值,就像您执行somedict[key] 一样。但如果密钥不存在,则返回default。所以rank = ranks.get(rank, rank)返回扩展的rank,如果存在,则返回原始的rank字符串。所以A 被翻译成Ace 但数字字符串保持原样。


获取卡片索引的简洁方法是使用内置的enumerate 函数。我们将 1 的 start 参数提供给 enumerate 以获取基于 1 的索引:

def show_hand(hand):
    print('Your cards:')
    for i, (rank, suit) in enumerate(hand, 1):
        rank = ranks.get(rank, rank)
        suit = suits[suit]
        print('%d: %s of %s' % (i, rank, suit))

输出

Your cards:
1: Ace of Clubs
2: King of Diamonds
3: 4 of Clubs
4: 4 of Spades
5: 7 of Hearts

最后,这是一个新版本,它使用zipall 函数来检测一手牌是否包含同花。如果是,则返回诉讼信,否则返回None

from __future__ import print_function

suits = 'C': 'Clubs', 'D': 'Diamonds', 'H': 'Hearts', 'S': 'Spades'
ranks = 'J': 'Jack', 'Q': 'Queen', 'K': 'King', 'A': 'Ace'

def show_hand(hand):
    print('Your cards:')
    for i, (rank, suit) in enumerate(hand, 1):
        rank = ranks.get(rank, rank)
        suit = suits[suit]
        print('%d: %s of %s' % (i, rank, suit))

def is_flush(hand):
    #Get suits
    suit_list = zip(*hand)[1]
    #Test if all the cards match the suit of the first card
    suit = suit_list[0]
    return suit if all(s == suit for s in suit_list) else None

#Test
userCards = ['AC', 'KD', '4C', '4S', '7H']
flushCards = '3D 5D AD QD 7D'.split()
hands = (userCards, flushCards)

for hand in hands:
    show_hand(hand)
    suit = is_flush(hand)
    if suit is None:
        print('Not a flush')
    else:
        print('Flush in %s' % suits[suit])
    print()

输出

Your cards:
1: Ace of Clubs
2: King of Diamonds
3: 4 of Clubs
4: 4 of Spades
5: 7 of Hearts
Not a flush

Your cards:
1: 3 of Diamonds
2: 5 of Diamonds
3: Ace of Diamonds
4: Queen of Diamonds
5: 7 of Diamonds
Flush in Diamonds

【讨论】:

感谢您的解释 :) 我真的很感激。 我怎样才能让它也打印列表的索引? 谢谢。还有一个问题。我一直在尝试定义冲洗,但我错过了一些东西。你能帮我吗:) @katja92:也许吧。 :) 但我认为你应该开始一个新问题。如果你愿意,可以把它链接到这个。 不能。显然我问了太多一些人不喜欢的问题。我会更新这个。

以上是关于如何在python中打印用户友好的扑克手?的主要内容,如果未能解决你的问题,请参考以下文章

生成所有 5 张牌扑克手

Java:扑克手

如何在python中命名和创建类的多个实例?

使用 RegEx 获得扑克手分数

一场改变你投资生涯的讨论:职业德州扑克手看交易

LeetCode 2347. 最好的扑克手牌