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

为何键未添加至字典?Blackjack游戏Ace值处理触发KeyError

Blackjack游戏KeyError问题修复

问题根源

  1. input()返回的是字符串类型,你用它和整数1/11做相等判断,永远不会触发分支,导致card_values字典始终没有"Ace"键,手牌里有Ace时就会触发KeyError。
  2. 后续hit拿到Ace时,处理完手动加1/11后,又执行sum += card_values[card],此时card是"Ace",字典无对应键,再次触发错误。
  3. 初始card_values字典本身就缺少"Ace"键,即使逻辑正确,未处理到的Ace也会报错。

修复方案

不需要修改全局字典来处理Ace,而是针对每张Ace单独获取用户选择的点数并累加,同时修正输入类型的判断问题:

import random

# 卡牌列表
cards = ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]

# 固定卡牌值(除Ace外)
card_values = {"2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9, "10": 10, 
               "Jack": 10, "Queen": 10, "King": 10}

# 发初始两张牌
card_1 = cards[random.randint(0, 12)]
card_2 = cards[random.randint(0, 12)]

print("你的初始手牌:")
print(card_1)
print(card_2)

# 计算初始总和
total = 0

# 处理第一张牌
if card_1 == "Ace":
    while True:
        try:
            ace_val = int(input(f"请选择{card_1}的点数(1或11):"))
            if ace_val in (1, 11):
                total += ace_val
                break
            else:
                print("请输入1或11!")
        except ValueError:
            print("请输入有效数字!")
else:
    total += card_values[card_1]

# 处理第二张牌
if card_2 == "Ace":
    while True:
        try:
            ace_val = int(input(f"请选择{card_2}的点数(1或11):"))
            if ace_val in (1, 11):
                total += ace_val
                break
            else:
                print("请输入1或11!")
        except ValueError:
            print("请输入有效数字!")
else:
    total += card_values[card_2]

print(f"当前总点数:{total}")

# 游戏主循环
while total < 21:
    choice = input("要Hit(拿牌)还是Pass(停牌)?").strip().lower()
    if choice == "hit":
        new_card = cards[random.randint(0, 12)]
        print(f"拿到新牌:{new_card}")
        
        if new_card == "Ace":
            while True:
                try:
                    ace_val = int(input(f"请选择{new_card}的点数(1或11):"))
                    if ace_val in (1, 11):
                        total += ace_val
                        break
                    else:
                        print("请输入1或11!")
                except ValueError:
                    print("请输入有效数字!")
        else:
            total += card_values[new_card]
        
        print(f"当前总点数:{total}")
    elif choice == "pass":
        print("你选择停牌。")
        break
    else:
        print("请输入hit或pass!")

# 结果判断
if total == 21:
    print("恭喜!你拿到了Blackjack,获胜!")
elif total > 21:
    print("你爆牌了!再来一局吧。")
else:
    print(f"你的最终点数是{total},等待庄家出牌。")

额外优化点

  • 加入了输入验证,防止用户输入非数字或无效选项
  • 每次拿到Ace时单独询问点数,符合实际游戏逻辑(每张Ace都可选择点数)
  • 避免修改全局字典,减少意外bug
  • 增加了点数打印,让用户更清晰当前状态

内容的提问来源于stack exchange,提问作者abbydise

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:54:41