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

解决Python开发21点游戏时TypeError: tuple无法与str拼接的错误

Python 21点游戏类型错误修复方案

错误根因

报错的核心原因是Card类的构造方法存在变量赋值错误:

  • 构造方法中错误将全局元组ranks直接赋值给实例属性self.rank,而非使用传入的rank参数,导致self.rank始终是包含13个牌面名称的元组,而非单张牌的牌名字符串,执行字符串拼接时就会触发tuple和str拼接的类型错误
  • 额外问题:原有代码计算的牌面分值value仅为临时变量,未存为实例属性,后续游戏逻辑调用卡牌分值时会报错
  • 优化点:原__str__方法拼接的字符串无空格,输出可读性差

修复后完整代码

import random

symbols = ('Spades','Diamonds','Hearts',"Clubs")
ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')
values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 
            'Nine':9, 'Ten':10, 'Jack':11, 'Queen':12, 'King':13, 'Ace':14}

playing = True

class Card:
    
    def __init__(self,symbol=0,rank=0):
        # 修复:用传入的rank参数赋值,而非全局元组ranks
        self.rank = rank
        self.symbol = symbol
        # 修复:将分值存为实例属性,方便后续调用
        self.value = values[rank]
    
    def __str__(self):
        # 优化:添加空格提升可读性
        return f"{self.rank} of {self.symbol}"

class Deck:
    
    def __init__(self):
        self.deck = []  # start with an empty list
        for symbol in symbols:
            for rank in ranks:
                self.deck.append(Card(symbol,rank))  # build Card objects,add to list
    
    def __str__(self):
        deck_comp = ''  # start with an empty string
        for card in self.deck:
            deck_comp += '\n'+ card.__str__() # add each Card object's print string
        return 'The deck has:' + deck_comp

    def shuffle(self):
        random.shuffle(self.deck)
        
    def deal(self):
        single_card = self.deck.pop()
        return single_card

test_deck = Deck()
print(test_deck)

验证效果

运行修改后的代码会正常输出52张卡牌的完整名称,无类型错误,可直接继续后续游戏逻辑开发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:02