文本RPG怪物图鉴重复添加问题求助及代码优化咨询
解决怪物图鉴重复添加的方案
核心思路:基于怪物类型而非实例去重
问题根源在于你直接将怪物实例添加到图鉴,同一类型的怪物(比如巨型蜘蛛)会生成多个实例,导致重复条目。你需要基于怪物的类型特征判断是否已收录。
第一步:给Enemy类添加唯一类型标识
先确保Enemy类具备区分类型的属性,比如monster_type(可用字符串、枚举或唯一ID):
# 示例Enemy类结构 class Enemy: def __init__(self, name, monster_type, hp, attack): self.name = name # 如"巨型蜘蛛" self.monster_type = monster_type # 如"giant_spider"或枚举值 self.hp = hp self.attack = attack
如果Enemy类已有唯一的类型名称(如name),也可直接使用,但独立的monster_type更严谨(避免重名怪物冲突)。
第二步:修改Player类的图鉴存储逻辑
不要用普通列表存储怪物实例,改用字典或集合实现自动去重:
方案1:字典存储(推荐)
以怪物类型标识为键,值存储该类型怪物的实例或信息,每次遭遇时先检查键是否存在:
class Player: def __init__(self): self.monster_compendium = {} # 键: monster_type, 值: Enemy实例/信息字典 def encounter_enemy(self, enemy): if enemy.monster_type not in self.monster_compendium: self.monster_compendium[enemy.monster_type] = enemy print(f"已将{enemy.name}添加至怪物图鉴!") else: print(f"{enemy.name}已在图鉴中,无需重复添加")
方案2:集合存储(轻量版)
若仅需记录已发现的怪物类型,无需保存实例,用集合存储类型标识即可:
class Player: def __init__(self): self.discovered_monster_types = set() def encounter_enemy(self, enemy): if enemy.monster_type not in self.discovered_monster_types: self.discovered_monster_types.add(enemy.monster_type) print(f"已发现新怪物:{enemy.name}")
更优实现:分离图鉴逻辑
将怪物图鉴从Player类中抽离,做成独立的MonsterCompendium单例类,确保全局只有一个图鉴实例,方便后续扩展(如添加怪物详情、解锁奖励等):
class MonsterCompendium: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) cls._instance.discovered_monsters = {} # 键: monster_type, 值: 怪物信息 return cls._instance def add_monster(self, enemy): if enemy.monster_type not in self.discovered_monsters: self.discovered_monsters[enemy.monster_type] = { "name": enemy.name, "hp": enemy.hp, "attack": enemy.attack # 可扩展添加掉落物、背景描述等信息 } return True # 返回是否成功添加新条目 return False # Player类中调用图鉴 class Player: def __init__(self): self.compendium = MonsterCompendium() def encounter_enemy(self, enemy): if self.compendium.add_monster(enemy): print(f"新怪物已收录:{enemy.name}") else: print(f"{enemy.name}已经在图鉴里啦")
额外提示
- 若Enemy类暂无类型标识,也可重写
__eq__和__hash__方法,让集合/字典识别同一类型的实例,但不如直接用类型标识直观。 - 可预设每种怪物的模板数据(如
MONSTER_TEMPLATES字典),遭遇怪物时直接根据类型取模板数据添加到图鉴,无需存储实例,节省内存。
内容的提问来源于stack exchange,提问作者Flintzer0
相关产品推荐
相关产品推荐

