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
相关产品推荐
相关产品推荐

