Python修改列表元素解决二十一点游戏royal牌算分TypeError问题
问题原因&修正方案
你的代码存在3个核心问题:
- 循环判断逻辑错误:遍历的时候判断的是索引
i是否属于人头牌列表,而非索引对应的牌面cards[i],导致人头牌转10的逻辑完全没有触发,字符串类型的J/Q/K没有被转换,才会出现整型和字符串相加的报错。 - 得分计算位置错误:你把总分计算放在了循环内部,每遍历一张牌就计算一次总分,此时另一张牌还没有完成值转换,就算替换逻辑写对也可能报错。
- 不符合保留原牌面打印的需求:如果你直接修改
cards列表里的人头牌为10,最后打印荷官手牌的时候会显示10而非J/Q/K,和你“准确打印持有牌面”的需求冲突。
修正后代码
import random deck = [2,3,4,5,6,7,8,9,10,'A','J','Q','K'] * 4 # 从牌堆发牌 def deal(deck): cards = [] for i in range(2): cards.append(random.choice(deck)) return cards # 处理荷官手牌逻辑 def dealer(): cards = deal(deck) royals = ['J','Q','K'] score = 0 # 单独计算得分,不修改原cards列表,保证打印的牌面正确 for card in cards: if card in royals: score += 10 elif card == 'A': # 这里A默认先按11计算,后续如果爆牌你可以再加逻辑调整为1 score += 11 else: score += card return (f'Dealer has the cards {cards[0]} and ?', score)
逻辑说明
- 保留了原
cards列表的原始值,所以打印荷官手牌时会正确显示J/Q/K等牌面,不会被替换为10 - 单独遍历牌面计算得分,遍历完成后再得到最终总分,避免类型相加错误
- 补充了A的默认计分逻辑,你后续可以根据爆牌规则自行调整A的分值
内容的提问来源于stack exchange,提问作者user16774543
相关产品推荐
相关产品推荐

