Python黑杰克游戏报错:ValueError: invalid literal for int() with base 10: '2 of Hearts'
问题分析与修复方案
先直接拆解你代码里的几个致命问题:
1. 牌堆操作的索引失效问题
你这段代码的核心错误是pop牌之后还在用原来的索引取牌:
index=FinalDeck.index(random.choice(FinalDeck)) FinalDeck.pop(index) # 这里已经把index位置的牌删掉了 card=FinalDeck[index] # 此时index对应的已经不是你刚选的那张牌!
pop操作会让列表长度减1,原来的index位置现在是下一个元素,你拿到的card完全是错误的。
修复方式:直接随机弹出牌堆里的元素,一步到位:
import random # 直接从牌堆随机移除并拿到目标牌 card = FinalDeck.pop(random.randint(0, len(FinalDeck)-1))
2. Ace处理后的类型错误
当你处理Ace时,把card赋值成了整数1或11:
if AceChoice == 1: card=1 elif AceChoice==11: card=11
但后面的代码还要执行int(card[0])——整数没有下标,必然触发TypeError: 'int' object is not subscriptable。
修复方式:单独用一个变量存牌的数值,不要修改原始的card:
# 初始化牌的数值 card_value = 0 if card[0] == "A": AceChoice = int(input("Do you want your ace to equal 1 or 11?")) card_value = AceChoice else: # 处理J/Q/K的情况,它们的数值都是10 rank = card[0] if rank in ["J", "Q", "K"]: card_value = 10 else: card_value = int(rank)
之后直接把card_value加到玩家总分里即可。
3. 全局变量的初始化问题
如果你的ValuePla1到ValuePla5在函数外没有初始化为0(比如ValuePla1 = 0),第一次执行ValuePla1 += ...时会报错,因为变量还没被赋值。确保全局变量在函数调用前完成初始化。
4. 冗余条件判断的优化
一堆if i == '1'的判断太啰嗦,建议用字典存储玩家总分,简化代码:
# 函数外初始化字典 player_values = {"1": 0, "2": 0, "3": 0, "4": 0, "5": 0} def GiveCard(): global player_values global FinalDeck for i in playerlist: # 随机取牌(用前面修复的方式) card = FinalDeck.pop(random.randint(0, len(FinalDeck)-1)) print(f"Player {i} card is {card}") # 计算牌的数值(用前面修复的方式) card_value = 0 if card[0] == "A": AceChoice = int(input("Do you want your ace to equal 1 or 11?")) card_value = AceChoice else: rank = card[0] card_value = 10 if rank in ["J", "Q", "K"] else int(rank) # 直接更新对应玩家的总分 player_values[i] += card_value
完整修复后的代码片段
import random # 初始化全局变量 FinalDeck = [["A", "♥"], ["2", "♥"], ["J", "♦"], ["K", "♣"]] # 示例牌堆 playerlist = ["1", "2", "3", "4", "5"] player_values = {"1": 0, "2": 0, "3": 0, "4": 0, "5": 0} def GiveCard(): global player_values global FinalDeck for i in playerlist: if not FinalDeck: print("牌堆已空!") break # 随机取牌并移除 card = FinalDeck.pop(random.randint(0, len(FinalDeck)-1)) print(f"Player {i} card is {card}") # 计算牌值,增加输入验证 card_value = 0 rank = card[0] if rank == "A": while True: try: AceChoice = int(input("Do you want your ace to equal 1 or 11? ")) if AceChoice in [1, 11]: card_value = AceChoice break else: print("请输入1或11!") except ValueError: print("请输入有效的数字!") elif rank in ["J", "Q", "K"]: card_value = 10 else: card_value = int(rank) # 更新玩家总分 player_values[i] += card_value print(f"Player {i} current total: {player_values[i]}") # 调用函数 GiveCard()
内容的提问来源于stack exchange,提问作者Süntje S
相关产品推荐
相关产品推荐

