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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:15:03