gpt4 book ai didi

c# - 解决交互组合爆炸的最佳方法是什么?

转载 作者:可可西里 更新时间:2023-11-01 09:15:58 25 4
gpt4 key购买 nike

我现在正在做的一件事与游戏有一些相似之处。出于说明的目的,我将使用从虚构的假设游戏中提取的示例来解释我的问题。
我们称之为 DeathBlaster 4: The Deathening。在 DB4 中,您有许多 Ship周期性和随机遇到的物体 Phenomena当他们旅行时。给定 Phenomenon可能有零个、一个或多个 EffectsShip遇到它。例如,我们可能有四种 Ships和三种Phenomena .
现象
==========================================
船舶 GravityWell BlackHole NebulaField
------------ -------------------------------------- ----
RedShip +20% 速度 -50% 力量 -50% 护盾
BlueShip 无效果 无懈可击的死亡效果 各种
GreenShip -20% 速度死亡 +50% 护盾 船上现象
YellowShip 死亡 +50% 威力无效果

此外,Effects可以互相交流。例如,GreenShip即在 GravityWell 中和一个 NebulaField可能会在生成的 SpeedEffect 之间产生某种协同作用和 ShieldEffect .在这种情况下,协同效应本身就是一个 Effect -- 例如,可能有 PowerLevelSynergyEffect这是这种相互作用的结果。除了Effects的集合外没有其他信息作用于 Ship需要解决最终结果应该是什么。
您可能会开始看到这里出现了一个问题。作为一种幼稚的第一种方法,要么每 Ship必须知道如何处理每个Phenomenon ,或每个 Phenomenon将不得不知道每个 Ship .这显然是 Not Acceptable ,因此我们希望将这些责任转移到其他地方。显然这里至少有一个外部类,可能是 MediatorVisitor某种。
但最好的方法是什么?理想的解决方案可能具有以下属性:

  • 添加新的 Ship 也很容易因为它是添加一个新的 Phenomenon .
  • 不产生任何效果的交互是默认的,不需要额外的代码来表示。约定优于配置。
  • 了解如何Effects彼此互动,并能够管理这些互动以决定最终结果。

  • 我想我已经决定了我的方法是什么,但我很想知道最佳设计共识是什么。你会从哪里开始?你会探索哪些途径?

    后续更新:谢谢大家的回复。这就是我所做的。我的主要观察是不同的数量 Effects相对于可能的数量 Phenomena似乎很小× Ships相互作用。也就是说,虽然交互的可能组合有很多,但这些交互的结果的种类数量较少。
    可以看到,例如,虽然表中有12种交互组合,但效果只有5种:速度修改、力量修改、护盾修改、无敌、死亡。
    我介绍了第三个类, InteractionResolver , 以确定交互作用的结果。它包含一个映射字典 Ship-Phenomenon配对到 Effects (它们基本上是执行效果和一些元数据的委托(delegate))。每个 Ship递给 EffectStack对应于 Effects当计算交互的结果完成时,它正在经历。 Ships然后使用 EffectStack确定 Effects的实际结果在它们的现有属性和属性中添加修饰符。
    我喜欢这个因为:
  • Ship永远不需要知道 Phenomena .
  • Ship的复杂性- Phenomena关系被抽象为 InteractionResolver .
  • InteractionResolver 抽象出了如何解决多个可能复杂的影响的细节。 .船舶只需在必要时应用效果。
  • 这可以实现额外的有用重构。例如,可以通过制作 EffectProcessorStrategy 来区分船舶处理效果的方式。 .默认可能是处理所有效果,但是,比如 BossShip可能会通过不同的 EffectProcessorStrategy 忽略次要影响.
  • 最佳答案

    一个有趣的潜在选择是使用 Visitor Pattern 的变体。 .

    Judith Bishop 和 R. Nigel Horspool 写了一篇关于 design pattern efficiency 的论文他们在其中使用 C# 3 功能解释了经典访问者模式的各种变体。

    特别是,我将看看他们如何与委托(delegate)一起处理访问者模式。使用委托(delegate)列表或堆栈可能会为您提供一种有趣的方式来处理来自多个对象的多种效果,并且可以更轻松地扩展类层次结构的任一侧(添加船舶或添加效果),而无需进行大量破坏性代码更改。

    关于c# - 解决交互组合爆炸的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/684000/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com