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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:43:21