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

Python实现21点游戏时for循环更新变量致soft_score计分错误

21点游戏函数代码修复说明

现有代码问题梳理

  • card_to_value函数不符合需求:要求'A'固定返回11,现有代码中'A'分支返回值为1,同时冗余的while循环无实际作用,逻辑分支可以大幅简化
  • soft_score函数逻辑完全错误:现有逻辑重复叠加卡牌值,且未区分第一张A和后续A的计算规则,同时return total缩进错误,不在函数作用域内
  • 额外说明:你所说的前两个函数运行正常属于测试疏漏,card_to_value返回A为1的问题会导致hard_score计算A的分值错误。

修复后完整代码

def card_to_value(card=''):
    # T/J/Q/K返回10,A返回11,数字牌返回对应数值
    if card in ['T','J','Q','K']:
        return 10
    elif card == 'A':
        return 11
    elif card.isdigit():
        return int(card)
    # 非法卡牌默认返回0,可按需调整为抛出异常
    return 0

def hard_score(hand):
    total = 0
    for each in hand:
        # 硬分所有A都按11算,直接调用card_to_value即可
        total += card_to_value(each)
    return total

def soft_score(hand):
    ace_found = False
    total = 0
    for each in hand:
        if each == 'A':
            if not ace_found:
                # 第一张A按11计算
                total += 11
                ace_found = True
            else:
                # 后续A按1计算
                total += 1
        else:
            # 非A卡牌直接取对应值相加
            total += card_to_value(each)
    return total

功能验证示例

# 测试用例1:手牌为'AAA'
print(hard_score('AAA'))  # 输出33,符合硬分规则
print(soft_score('AAA'))  # 输出13,符合软分规则

# 测试用例2:手牌为'AA2'
print(hard_score('AA2'))  # 输出24
print(soft_score('AA2'))  # 输出14

# 测试用例3:手牌为'AJT'
print(hard_score('AJT'))  # 输出31
print(soft_score('AJT'))  # 输出31

内容的提问来源于stack exchange,提问作者HMG343

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:06:00