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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:27:51