You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:13:07