Python报错'int' is not subscriptable:文本冒险游戏开发问题排查
解决Python文本冒险游戏中
'int' is not subscriptable错误 作为Python新手开发文本冒险游戏时碰到这类错误太正常了,我帮你理清楚问题的来龙去脉和修正方案:
问题复盘
你用字典存储敌人攻击范围、武器属性,编写战斗逻辑时触发了'int' is not subscriptable错误。一开始简化代码没复现问题,后来排查发现核心原因是**enemy变量没有被正确赋值为enemyList里的字典元素**。
错误根源拆解
先看你战斗循环里的关键代码:
def battleLoop(): enemyList = [giant_rat, giant_spider] enemy = random.randrange(2) # 这里得到的是0/1的整数索引,不是敌人字典! stdio.writeln('Suddenly a ' + enemyList[enemy]['name'] + ' appears!') attackLoop(enemy) # 把整数索引传给攻击函数,后续操作必然报错
random.randrange(2)返回的是0或1的整数,而不是enemyList里的字典对象。当你在attackLoop里执行enemy['Health'] -= atkDmg时,本质是在对一个整数做下标访问操作,这就触发了'int' is not subscriptable的错误。
修正后的完整代码
只需要把enemy变量直接赋值为enemyList的元素即可,同时我补充了一些细节让逻辑更完整:
import random import stdio # Weapon Stats weapon = {'Bone':(4, 9), 'None':random.randrange(2, 5)} # Player Stats player = {'weapon':'None', 'Health':20, 'Holding':'None'} # Enemies giant_rat = {'name':'Giant Rat', 'Health':15, 'attack':(1, 4)} giant_spider = {'name':'Giant Spider', 'Health':20, 'attack':(2, 5)} # 补充定义缺失的敌人 def battleLoop(): enemyList = [giant_rat, giant_spider] enemy_index = random.randrange(2) enemy = enemyList[enemy_index] # 直接获取字典类型的敌人对象 stdio.writeln('Suddenly a ' + enemy['name'] + ' appears!') attackLoop(enemy) def attackLoop(enemy): # 处理武器伤害:范围伤害取随机值,固定值直接用 atk_dmg = weapon[player['weapon']] if isinstance(atk_dmg, tuple): atk_dmg = random.randint(*atk_dmg) enemy['Health'] -= atk_dmg stdio.writeln(f"You strike the {enemy['name']} for {atk_dmg} damage!") stdio.writeln(f"{enemy['name']} now has {enemy['Health']} health remaining!") # 测试调用 battleLoop()
额外提醒两个细节:
- 你的
weapon字典里,'Bone'对应伤害范围元组,'None'对应随机整数,战斗时最好判断类型再计算实际伤害,避免直接用元组做减法(虽然Python允许,但不符合真实战斗逻辑) - 补充了
giant_spider的定义,避免出现未定义变量的错误
总结
碰到'int' is not subscriptable错误时,第一时间检查你尝试做下标操作的变量类型——大概率是把整数(比如索引)当成了字典、列表这类可下标访问的对象,修正变量的赋值逻辑就能解决问题。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

