面向对象RPG开发遇TypeError错误:string indices must be integers
解决文本RPG装备系统中的
TypeError: string indices must be integers问题 嘿,我看你在开发文本RPG的装备系统时碰到这个头疼的错误了,咱们来一步步拆解解决它!
错误原因分析
这个错误的核心意思是:你试图用字符串(比如"Name")去索引另一个字符串,而字符串的索引只能是整数(比如"hello"[0]取第一个字符)。回到你的代码里,问题大概率出在**self.armorsOwned列表里的元素不是字典,而是纯字符串**——当你循环访问armor["Name"]时,如果armor是个字符串,自然就会触发这个错误。
你的代码问题点
看这段循环代码:
def equipArmor(self): for armor in self.armorsOwned: select = 1 # 这里还有个小bug:每次循环都会重置序号为1 if self.armor == armor: print(str(select) + ". " + str(armor["Name"]) + " (Equipped)") else: print(str(select) + ". " + str(armor["Name"])) select += 1
如果self.armorsOwned里存的是类似["皮甲", "铁甲"]这样的字符串列表,那armor["Name"]就等同于"皮甲"["Name"],这完全不符合字符串的索引规则,直接报错。
解决方案
确保装备列表的元素是字典
检查你初始化或添加装备到self.armorsOwned的代码,必须保证每个元素是包含"Name"键的字典:# 正确的初始化/添加方式 self.armorsOwned = [ {"Name": "皮甲", "防御": 5}, {"Name": "铁甲", "防御": 15} ] # 错误的方式(别这么写!) # self.armorsOwned = ["皮甲", "铁甲"]先调试确认元素类型
如果你不确定self.armorsOwned的内容,可以在循环前加两行调试代码:print("当前拥有的装备:", self.armorsOwned) print("第一个装备的类型:", type(self.armorsOwned[0]))如果输出的类型是
<class 'str'>,那就是上面说的问题;如果是<class 'dict'>,再检查有没有其他地方把armor变量改成了字符串。顺便修复序号重置的小bug
你现在的select = 1放在循环内部,会导致所有装备的序号都是1,把它移到循环外面就能正常递增了,还可以用f-string简化打印代码:def equipArmor(self): select = 1 # 移到循环外 for armor in self.armorsOwned: if self.armor == armor: print(f"{select}. {armor['Name']} (已装备)") else: print(f"{select}. {armor['Name']}") select += 1 armor_choice = input("请输入你想要装备的名称:\n") for i in self.armorsOwned: if armor_choice == i["Name"]: self.armor = i # 把选中的装备设为当前装备 print(f"成功装备{i['Name']}!") break else: print("你没有这件装备!")
内容的提问来源于stack exchange,提问作者user9716246
相关产品推荐
相关产品推荐

