如何在Python的D&D文字游戏中用信息表管理敌人变量?
用类重构D&D文字游戏敌人系统
核心思路
用Enemy类封装所有敌人属性(名称、武器、AC、HP等),同时把敌人的ASCII艺术、描述也整合进类中,通过实例化不同敌人模板替代重复的全局变量定义,让代码更整洁、易维护。
实现代码
1. 定义Enemy类
import random from random import randint class Enemy: def __init__(self, name, weapon, ac, hp, attack_mod, damage_mod, exp, ascii_art=None, description=None): # 初始化敌人核心属性 self.name = name self.weapon = weapon self.ac = ac self.hp = hp self.attack_mod = attack_mod self.damage_mod = damage_mod self.exp = exp # 可选的展示内容 self.ascii_art = ascii_art self.description = description def spawn(self): # 统一处理敌人出现的输出逻辑 if self.ascii_art: print(self.ascii_art) if self.description: print(self.description) print("")
2. 重构encounter函数
def encounter(): # 定义概率与敌人模板的映射 enemy_templates = { range(90, 96): Enemy( name="Orc", weapon="Greataxe", ac=13, hp=15, attack_mod=5, damage_mod=3, exp=100, description="An Orc howls in bloodlust as it brings its Greataxe to bare!!" ), range(97, 101): Enemy( name="Worg", weapon="Bite", ac=13, hp=26, attack_mod=5, damage_mod=3, exp=100, ascii_art=r""" , ,,/( ,,,,,,,,,,___,, )b ,,, "`,_, /( / `, L/7_/\,,| / \ ,` `, \ ,| \ , / /``````|| |\, \__,))) / / | \\ \ \,,,,,,/ | / | \\ )/ \ (| ) ,,// / `_)_/ ((___/"' """, description="A Worg is released into the arena!!" ), range(1, 90): Enemy( name="Goblin", weapon="Scimitar", ac=15, hp=7, attack_mod=4, damage_mod=2, exp=50, ascii_art=r""" /(.-""-.\ |\ \/ \/ /| | \ / =. .= \ / | \( \ o\/o / )/ \_, '-/ \-' ,_/ / \__/ \ \ \__/\__/ / ___\ \|--|/ /___ /` \ / `\ / '----' \ """, description="A frenzied Goblin charges you with a Scimitar!!" ) } chance_encounter = randint(1, 100) # 匹配概率对应的敌人并返回实例 for enemy_range, enemy in enemy_templates.items(): if chance_encounter in enemy_range: enemy.spawn() return enemy # 使用示例:获取当前遭遇的敌人,直接访问其属性 current_enemy = encounter() if current_enemy: print(f"【当前敌人】{current_enemy.name} | 生命值:{current_enemy.hp} | 护甲等级:{current_enemy.ac}")
优化亮点
- 消除全局变量污染:所有敌人属性都封装在
Enemy实例中,访问时直接通过实例调用(如current_enemy.hp),避免全局变量混乱。 - 模块化扩展:新增敌人只需在
enemy_templates中添加新的Enemy实例,无需修改核心逻辑。 - 逻辑封装:把敌人出现的输出逻辑放在
spawn方法中,后续修改展示样式只需调整类方法,不用改动生成逻辑。 - 可扩展性强:后续可以给
Enemy类添加更多方法,比如take_damage()处理受伤害逻辑、attack()处理攻击逻辑,让战斗系统更完整。
内容的提问来源于stack exchange,提问作者kingsc
相关产品推荐
相关产品推荐

