如何在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
最后,这是一个新版本,它使用zip
和all
函数来检测一手牌是否包含同花。如果是,则返回诉讼信,否则返回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中打印用户友好的扑克手?的主要内容,如果未能解决你的问题,请参考以下文章