如何以列表为字典键实现灵活匹配的物品拾取功能?
游戏物品拾取功能解决方案
核心思路调整
Python字典的键必须是可哈希类型(如字符串、数字),而列表是可变类型、不可哈希,所以不能直接用列表作为字典键。正确的做法是:
- 把每个物品的所有别名单独作为字典的键
- 所有别名都指向同一个物品对象(封装了描述、重量等属性)
这样玩家输入任何别名,都能快速匹配到对应的物品。
完整代码实现
1. 定义物品类(封装属性)
class Item: def __init__(self, formal_name, description, weight): self.formal_name = formal_name # 物品正式名称 self.description = description # 物品描述 self.weight = weight # 物品重量
2. 创建物品实例与别名映射
# 实例化具体物品 apple = Item("苹果", "刚从树上摘下来的红苹果,汁水充足", 0.2) bread = Item("面包", "全麦制作的硬面包,能扛饿一整天", 0.5) # 别名映射字典:每个别名对应一个物品实例 item_aliases = { "苹果": apple, "红苹果": apple, "apple": apple, "面包": bread, "全麦面包": bread, "干粮": bread }
3. 拾取功能实现
def pick_item(player_input, inventory): # 把输入转成小写,避免大小写匹配问题 input_clean = player_input.strip().lower() # 遍历别名字典,忽略大小写匹配 for alias, item in item_aliases.items(): if alias.lower() == input_clean: inventory.append(item) print(f"你拾取了【{item.formal_name}】") return print("这里没有这个物品!")
4. 库存展示功能
def show_inventory(inventory): if not inventory: print("你的背包是空的") return print("=== 你的背包 ===") for idx, item in enumerate(inventory, 1): print(f"{idx}. {item.formal_name}") print(f" 描述:{item.description}") print(f" 重量:{item.weight}kg\n")
5. 交互示例
# 初始化玩家库存 player_inventory = [] # 模拟玩家输入 pick_item("红苹果", player_inventory) pick_item("干粮", player_inventory) show_inventory(player_inventory)
运行结果:
你拾取了【苹果】 你拾取了【面包】 === 你的背包 === 1. 苹果 描述:刚从树上摘下来的红苹果,汁水充足 重量:0.2kg 2. 面包 描述:全麦制作的硬面包,能扛饿一整天 重量:0.5kg
原理说明
- 哈希与字典键的限制:字典通过哈希值快速定位键,只有不可变对象(字符串、数字、元组等)能保证哈希值稳定,列表是可变对象,哈希值会随内容变化,因此不能作为字典键。
- 物品类的作用:用类把物品的属性(名称、描述、重量)封装在一起,避免用零散的变量存储,方便统一调用和扩展(比如后续添加价值、耐久度等属性)。
- 别名映射的效率:每个别名直接指向物品实例,查找时间复杂度为O(1),比遍历列表匹配的效率高很多,适合游戏中频繁的物品交互场景。
内容的提问来源于stack exchange,提问作者Audrey Sims-Hunt
相关产品推荐
相关产品推荐

