如何在Python中判定扑克牌手牌的顺子并计算得分?
解决扑克牌手牌顺子计分问题
嘿,我来帮你搞定这个顺子计分的问题!你遇到的核心问题是没法把T/J/Q/K/A这类特殊牌面转换成可计算的数值,直接用字符串操作自然会报错——毕竟字符串和整数没法直接加减嘛。下面给你一步步的解决方案:
第一步:建立牌面到数值的映射
首先我们需要把所有牌面转换成对应的整数,这样就能轻松判断是否连续了。可以用一个字典来做映射:
card_value_map = { 'A': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'T': 10, 'J': 11, 'Q': 12, 'K': 13 }
然后把你的牌面列表转换成数值列表,比如:
L4 = ['6', '8', '8', '9', 'T'] num_cards = [card_value_map[card] for card in L4]
这样num_cards就变成了[6, 8, 8, 9, 10],方便后续计算。
第二步:修正顺子判定与计分逻辑
你原来的代码有几个小问题:
- 用
is来判断数值相等是错误的,is是判断对象身份,应该用== - 逻辑搞反了:应该是下一张牌的数值等于当前牌+1,而不是当前牌等于下一张+1
- 计分逻辑有漏洞:连续长度达到3及以上时,应该在连续结束后一次性加分,而不是每一步都加(否则会重复计分)
下面是修正后的完整逻辑:
score = 0 current_streak = 1 # 初始连续长度为1(至少有一张牌) for i in range(len(num_cards) - 1): if num_cards[i+1] == num_cards[i] + 1: current_streak += 1 else: # 连续中断,检查当前连续长度是否达标 if current_streak >= 3: score += current_streak current_streak = 1 # 重置连续长度 # 循环结束后,别忘了检查最后一段连续的牌 if current_streak >= 3: score += current_streak print(score) # 对于L4的例子,这里会输出3,符合预期
为什么这样做?
- 映射后的数值列表让我们能用整数运算轻松判断连续关系
- 跟踪连续长度的方式能准确统计每一段顺子的长度,避免重复计分
- 最后检查最后一段连续是因为循环结束时可能还有未处理的顺子
针对你举的例子['6', '8', '8', '9', 'T'],转换后的数值列表是[6,8,8,9,10]:
- 6之后是8,不连续,连续长度重置为1
- 8到8不连续,连续长度重置为1
- 8到9连续,长度变成2;9到10连续,长度变成3
- 循环结束后检查到连续长度为3,加3分,最终score就是3,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Coder117
相关产品推荐
相关产品推荐

