【问题标题】:Design pattern for complex game algorithms复杂游戏算法的设计模式
【发布时间】:2012-09-01 21:53:17
【问题描述】:

这是this question 的后续行动。上下文是相同的,因此略读可能会有用。几天来我一直在集思广益,但一无所获,所以我放弃并来到这里。

我想知道在创建像我在那里描述的那样的系统时,哪些设计模式会发挥作用。假设我有一个战斗算法,每边可以有任意数量的战斗人员。首先我们找出谁攻击谁,然后执行。

棘手的部分是可以添加许多额外的行为,而且它们可能有些随意。把它们想象成“被动技能”。也可能有一些行为,例如在击中目标时获得统计数据,但仅限于某些类型的战斗。

我之前的问题显示了装饰器是如何失败的。一个答案建议使用策略模式,但我并不急于编写十几种不同类型的策略,然后为每种策略编写几个具体的类。即使那样,如果我需要一种完全不同于我已有的行为的全新行为,我仍然必须违反开放封闭原则。在某些情况下,我需要一次组合多个策略,这可能导致修饰策略或复合策略。例如,当您受到伤害时,您可能 1. 拥有将伤害减半的能力,2. 装备可以进一步减少伤害的物品,3. 向攻击者返还一些伤害,以及 4. 获得一些统计点数.

那么,一位经验丰富的建筑师会在这里做什么呢?很多游戏都实现了这些系统,所以我很好奇哪种模式或模式组合在这里运作良好。

我不想发布一大堆代码,所以如果我的系统有任何特定部分您想查看,请在评论中提问。

【问题讨论】:

    标签: php design-patterns game-engine


    【解决方案1】:

    这是一个大问题,需要您了解游戏机制。但我将从这个建议开始。第一步是确保您有一个定义明确且记录在案的操作顺序,然后将其转换为您的战斗决议算法的框架或模板。例如:

    例如,当您受到伤害时,您可能 1. 将伤害减半的能力, 2. 装备一件物品 进一步减少伤害, 3. 给你的攻击者一些伤害, 4. 获得一些统计点数。

    如果#3(伤害反射)首先发生,然后是#4(你获得统计数据,甚至可能防御点数),然后是#1和#2。在这种情况下,防守方已经最大限度地提高了所造成的伤害,并且可能也最大限度地提高了他的防御能力。

    您按特定顺序列出了这些步骤,但是为什么?您必须定义规则,以便知道何时应用每个步骤(攻击和防御)。只有这样,您才能创建一个系统来解决战斗。例如:

    1. 从基础伤害开始
    2. 应用由攻击触发的攻击者效果
    3. 应用由攻击触发的防御者效果
    4. 应用所有攻击者增加伤害的先天能力
    5. 应用所有攻击者增加伤害的装备能力
    6. 应用所有防御者增加护甲的先天能力
    7. 应用所有防御者的护甲增加装备能力
    8. 应用防御触发的攻击者效果
    9. 应用防御触发的防御者效果
    10. 受到伤害
    11. 应用由伤害触发的攻击者效果
    12. 应用由伤害触发的防御者效果

    这是从臀部,我不知道你的规则系统。

    一旦你有了这个,考虑为一个战斗建模,包括一个来源、目标、一个(起始)伤害、一个攻击效果列表和一个防御效果列表。这些效果应该使用 OnAttack()、OnApplyInnate()、OnApplyEquipment()、OnDamaged() 等编码为模板(模板方法模式)。然后您可以在战斗 reolution 的各个阶段迭代效果,让每个人都有机会在适当的时候应用它的效果。

    【讨论】:

    • 总结一下,不要将伤害解析代码放在战斗者中。将其重新定位到 Combat 类,其中包含解决它所需的信息,包括攻击者和防御者贡献的 CombatEffects 列表。以您的规则系统控制的方式和顺序对效果进行一般交互,允许每个人修改伤害或其他产生的副作用(如伤害反射)。最终的“ApplyDamage”方法应扣除生命值并执行任何副作用。
    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 2010-12-13
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多