为何键未添加至字典?Blackjack游戏Ace值处理触发KeyError
Blackjack游戏KeyError问题修复
问题根源
input()返回的是字符串类型,你用它和整数1/11做相等判断,永远不会触发分支,导致card_values字典始终没有"Ace"键,手牌里有Ace时就会触发KeyError。- 后续hit拿到Ace时,处理完手动加1/11后,又执行
sum += card_values[card],此时card是"Ace",字典无对应键,再次触发错误。 - 初始
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
相关产品推荐
相关产品推荐

