Python开发21点游戏字典随机取牌触发KeyError如何解决
21点游戏抽牌逻辑触发KeyError问题
问题描述
开发21点(Black Jack)游戏过程中,将卡牌对应点数存储在字典结构中,预期初始发牌阶段从卡牌字典内随机抽取卡牌,分别加入玩家与电脑的手牌列表,但代码运行时触发KeyError异常。
问题复现代码如下:
# Black Jack import random from art import logo print(logo) cards = { "ace": [1, 11], "one": 1, 'two': 2, 'three': 3, "four": 4, "Five": 5, "six": 6, 'seven': 7, 'eight': 8, 'nine': 9, "king": 10, "queen": 10, "jack": 10, "ten": 10 } user_deck = [] computer_deck = [] user_deck.append(random.choice(cards)) computer_deck.append(random.choice(cards)) print(f"{computer_deck} \n {user_deck}" )
报错原因
random.choice()方法的入参要求是支持整数索引访问的序列类型(列表、元组等),直接传入字典对象时,方法内部会生成0到字典长度-1的随机整数作为索引去字典内查值,但字典的键是自定义的卡牌字符串,不存在整数键,直接触发KeyError。- 现有卡牌字典的键名大小写不统一(点数5的键为大写开头的
"Five",其余均为全小写),后续如果按统一小写规则取值,会因为键名不匹配再次触发KeyError。
修复方法
- 抽牌时传入字典的键列表
list(cards.keys())作为random.choice()的取值序列,保证随机取到合法的卡牌名 - 统一字典内所有键名的大小写格式
- 发牌时可以直接把卡牌对应点数存入手牌列表,简化后续点数计算逻辑
修复后的参考代码:
# Black Jack import random from art import logo print(logo) cards = { "ace": [1, 11], "one": 1, 'two': 2, 'three': 3, "four": 4, "five": 5, # 统一为全小写键名 "six": 6, 'seven': 7, 'eight': 8, 'nine': 9, "king": 10, "queen": 10, "jack": 10, "ten": 10 } user_deck = [] computer_deck = [] # 传入字典键列表做随机选择,直接存入对应卡牌点数 user_deck.append(cards[random.choice(list(cards.keys()))]) computer_deck.append(cards[random.choice(list(cards.keys()))]) print(f"电脑明牌:{computer_deck} \n 玩家手牌:{user_deck}" )
内容的提问来源于stack exchange,提问作者Omar Mohamed
相关产品推荐
相关产品推荐

