Python实现21点游戏时J/Q/K字符串转数值求和报错求助
21点游戏类型错误修复方案
错误原因
- 遍历deck修改牌面值的循环仅修改了临时循环变量,没有更新deck列表的原始值,牌堆中始终存在
J/Q/K字符串类型的元素 - 直接对存储字符串牌面的手牌列表调用
sum()计算总点数,整数和字符串相加触发类型错误 - 抽牌时对A的赋值也仅修改了临时变量,没有更新到手牌列表中,A的点数逻辑不会生效
修复思路
不要直接修改牌堆的原始牌面,单独封装点数转换函数,满足显示用字符串、计算转对应数值的需求,同时兼容A的1/11点灵活判定。
可运行修正代码
import random jugador = [] dealer = [] # 牌堆保留原始字符串牌面,方便后续打印显示 deck = ['A' ,2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'K', 'Q'] # 单独封装计算手牌总点数的函数 def calcular_puntos(mano): puntos = 0 aces = 0 # 先统计所有非A的牌点数,以及A的数量 for card in mano: if card in ['J', 'Q', 'K']: puntos += 10 elif card == 'A': aces += 1 else: puntos += card # 处理A的点数:优先算11,超过21就改成1 for _ in range(aces): if puntos + 11 <= 21: puntos += 11 else: puntos += 1 return puntos # 发初始2张牌给玩家 while len(jugador) != 2: card = random.choice(deck) jugador.append(card) # 打印原始手牌,J/Q/K/A都会正常显示字符串 print("当前手牌:", jugador) total = calcular_puntos(jugador) if total > 11: print("Hola")
效果说明
- 打印手牌时会直接显示
A/J/Q/K的字符串形式,符合显示需求 - 计算点数时会自动把J/Q/K转成10,A可以根据总点数灵活切换1/11,符合21点的规则
内容的提问来源于stack exchange,提问作者iMaGiikz
相关产品推荐
相关产品推荐

