没错,又是暗黑类游戏属性系统(我最近才没有玩暗黑类游戏!) 简述 github地址:https://github.com/hggzhang/PythonTest/tree/main/Attr 这是一个为暗黑Like游戏设计的属性计算系统,支持复杂的属性修饰和依赖关系管理。系统能够处理加法、乘法、额外
没错,又是暗黑类游戏属性系统(我最近才没有玩暗黑类游戏!)
简述
github地址:https://github.com/hggzhang/PythonTest/tree/main/Attr
这是一个为暗黑Like游戏设计的属性计算系统,支持复杂的属性修饰和依赖关系管理。系统能够处理加法、乘法、额外乘区和覆盖等多种属性修饰方式,并能自动处理属性间的依赖关系,确保属性变化的正确传播
暗黑like游戏属性系统的特点
暗黑类游戏属性系统主要有两大要素,
属性计算
和依赖处理
。- 属性计算:暗黑类的游戏基本都采用
基础加值 * 基础乘区 * 独立乘区1 * 独立乘区2 . . .
的属性计算方式,通过边际效用的约束,让玩家尽量在有限的词条资源中进行组合,以获取更高的数值。 - 依赖处理:有大量类似
你的攻击附加相当于10%HP的基础点伤
,你的攻击力永远等于防御力,相关加成不再生效
的等相互依赖的效果,这些效果往往是一个构筑策略的灵魂,比如攻击力=防御力
这样玩家的构筑只需要拼命堆防御力即可而不需要关心堆叠攻击力,构筑玩法是颠覆性的。
程序设计思路
需求分析
多种修饰类型
:支持加法、乘法、额外乘区和覆盖等属性计算方式依赖关系管理
:属性之间可以建立依赖关系,当依赖属性变化时自动更新相关属性循环依赖检测
:防止属性间形成循环依赖导致无限循环高效更新机制
:使用脏标记和延迟更新策略优化性能观察者模式
:支持属性值变化的通知机制
核心架构
AttrMgr (管理器)
├── Attr (属性实例)
├── AttrMod (修饰器基类)
│ ├── AttrModAdd (加法修饰)
│ ├── AttrModMul (乘法修饰)
│ ├── AttrModExMul (额外乘区修饰)
│ └── AttrModWithDepc (带依赖的修饰器)
│ └── AttrModSync (同步修饰器)
└── DAG (有向无环图,处理依赖关系)
系统采用分层设计,主要包含以下几个核心组件:
AttrMgr
:属性管理器,负责管理所有属性和它们的修饰器Attr
:属性类,封装属性值和计算逻辑AttrMod
:属性修饰器基类,定义不同修饰类型的接口DAG
:有向无环图,用于管理属性间的依赖关系
属性计算流程
- 收集所有修饰器对属性的影响
- 按照公式计算最终属性值:
(add * mul) * ∏(1 + exMuls)
- 如果有覆盖值,直接使用覆盖值
- 通知所有观察者属性值变化
依赖管理
通过DAG(有向无环图)管理属性间的依赖关系,确保:
- 不会形成循环依赖
- 依赖属性变化时正确传播到所有相关属性
- 支持动态添加和移除依赖关系
程序设计细节
属性修饰系统
class AttrMod(ABC): def __init__(self, attrName, value): self.AttrName = attrName self._value = value @abstractmethod def Modify(self, info): pass
系统定义了多种修饰器类型:
- AttrModAdd:加法修饰器
- AttrModMul:乘法修饰器
- AttrModExMul:额外乘区修饰器
- AttrModWithDepc:带依赖的修饰器
- AttrModSync:同步修饰器(特殊覆盖类型)
- ... 可以根据需求拓展
依赖关系与观察者模式
class AttrModWithDepc(AttrMod, AttrObserverInf): def Apply(self, mgr): mgr.RegObserver(self.AttrName, self._depcAttrName, self) self._mgr = weakref.ref(mgr) # 弱引用防止内存泄漏
带依赖的修饰器实现了观察者接口,当依赖属性变化时:
- 更新自身的值
- 标记自己修饰的属性为脏
- 触发属性重新计算
循环依赖检测
class DAG: def add_edge(self, u, v): if u == v: raise CycleError("Self-loop detected") # 使用DFS检测是否会形成环 visited = set() stack = [v] while stack: node = stack.pop() if node == u: raise CycleError("Cycle detected") # ...
DAG类在添加边时进行环检测,防止属性间形成循环依赖。(策划设计侧,也需要工具支持策划的配置检查,防止循环依赖)
高效的更新策略
def GetAttrValue(self, name): self.UpdAttr(name) # 按需更新 return self._attrs.get(name).Get() def CollectAndUpdAttr(self): # 批量更新所有脏属性 lcDirtys = self._dirtyAttrs.copy() self._dirtyAttrs.clear() # ...
系统提供了两种更新策略:
- 按需更新:在获取属性值时检查并更新脏属性
- 批量更新:通过CollectAndUpdAttr方法批量更新所有脏属性
内存安全设计
self._observers[targetAttrName] = WeakSet()
使用WeakSet存储观察者,避免循环引用导致的内存泄漏。
未经允许不得转载作者:
WAP站长网,
转载或复制请以
超链接形式
并注明出处
WAP站长网 。
原文地址:
《
暗黑类游戏属性系统程序设计思路3.0》
发布于
2025-9-11
评论 抢沙发
评论前必须登录!
立即登录 注册