Python嵌套列表元素选取问题求助——回合制宝可梦类游戏开发
解决嵌套列表取值问题,附几种更实用的元素调用方式
嘿,很高兴看到你用Python做宝可梦类回合制游戏练手!先帮你把当前的错误解决掉,再给你几个更顺手的嵌套元素调用思路~
先修正你当前的代码错误
你遇到的TypeError: 'int' object is not subscriptable,是因为你写的Player[2[atk[1]]]逻辑完全错了——2是整数,不能像列表那样用[xxx]去下标访问。正确的嵌套列表取值逻辑是一层一层往外取:
- 先取
Player的第3个元素(索引2):也就是Moves列表 - 再用
atk索引取对应的招式(Punch或Kick) - 最后取招式的名称(索引0)或伤害值(索引1)
修正后的代码如下:
Punch = ["Punch!", 20] Kick = ["Kick!", 40] Moves = [Punch, Kick] Player = ["Jamie", 100, Moves] print("Do you want to punch, or kick?") attack = input(" ") atk = 0 if attack == "punch" else 1 # 用三元表达式简化判断 # 正确的嵌套取值方式 selected_move = Player[2][atk] damage = selected_move[1] print(f"{Player[0]} uses {selected_move[0]}! Deals {damage} damage.")
几种更实用的嵌套元素调用方式
虽然嵌套列表能实现需求,但随着游戏复杂度提升(比如加更多招式、招式属性、PP值等),列表会越来越难维护。这里给你两个更适合游戏开发的方案:
1. 用字典替代列表,让语义更清晰
把招式和玩家信息都改成字典,取值时直接用键名,不用记索引,可读性拉满:
# 用字典定义招式 moves = { "punch": {"name": "Punch!", "damage": 20}, "kick": {"name": "Kick!", "damage": 40} } # 用字典定义玩家 player = { "name": "Jamie", "hp": 100, "moves": moves } print("Do you want to punch, or kick?") attack = input(" ").lower() # 转小写避免大小写问题 # 直接通过键名取值,不用记索引 selected_move = player["moves"][attack] print(f"{player['name']} uses {selected_move['name']}! Deals {selected_move['damage']} damage.")
2. 用类封装数据,适配游戏扩展需求
如果以后要给招式加属性(比如“格斗系”)、PP值,给玩家加背包、状态等,用类来封装会更专业,代码扩展性极强:
class Move: def __init__(self, name, damage, type="normal"): self.name = name self.damage = damage self.type = type # 新增属性:招式类型 class Player: def __init__(self, name, hp): self.name = name self.hp = hp self.moves = [] # 存储Move对象的列表 # 创建招式实例 punch = Move("Punch!", 20, "fighting") kick = Move("Kick!", 40, "fighting") # 创建玩家并添加招式 player = Player("Jamie", 100) player.moves.append(punch) player.moves.append(kick) print("Do you want to punch, or kick?") attack = input(" ").lower() # 根据招式名称找到对应的Move对象 selected_move = next(m for m in player.moves if m.name.lower() == attack + "!") print(f"{player.name} uses {selected_move.name}! Deals {selected_move.damage} {selected_move.type}-type damage.")
这样不管以后加多少新功能,代码结构都能清晰维护~
内容的提问来源于stack exchange,提问作者ojj920
相关产品推荐
相关产品推荐

