解决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
相关产品推荐
相关产品推荐

