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

Python嵌套列表元素选取问题求助——回合制宝可梦类游戏开发

解决嵌套列表取值问题,附几种更实用的元素调用方式

嘿,很高兴看到你用Python做宝可梦类回合制游戏练手!先帮你把当前的错误解决掉,再给你几个更顺手的嵌套元素调用思路~

先修正你当前的代码错误

你遇到的TypeError: 'int' object is not subscriptable,是因为你写的Player[2[atk[1]]]逻辑完全错了——2是整数,不能像列表那样用[xxx]去下标访问。正确的嵌套列表取值逻辑是一层一层往外取:

  1. 先取Player的第3个元素(索引2):也就是Moves列表
  2. 再用atk索引取对应的招式(Punch或Kick)
  3. 最后取招式的名称(索引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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:48:24