Action基础系统的动作设计模式和策略[C#,PHP]

时间:2009-07-16 13:35:16

标签: design-patterns oop

我正在做一个RogueLike游戏,并希望为每个实体模块化制作逻辑。这可能适用于有角色和权限控制的Web应用程序。

这个想法就是拥有这样的东西 - 我们在游戏中有不同类型的实体。一扇门可以被打倒,而一堵石墙不能被打击。例如,逻辑模块可以是名为Bashable

的类
public interface IBashable
{
    bool ProcessRequest(CharacterInfo character);
    string GetOutput();
    virtual int GetOutcome();
}

因此,添加到对象的IBashable接口的门可能会被粉碎。 ProcessReques()将使用一些规则来确定角色是否设法这样做(可能是强度检查)。

没有IBashable接口的对象无法打开。问题是 - 比如门上添加了多个逻辑组件。我想做的是提交这样的请求。

// Conan is derived from CharacterInfo class
BashDoorRequest request = new BashDoorRequest(conan);
Door d;
BashLogic bash;
PickLockLogic pick;
d.addLogic(bash);
d.addLogic(pick);

// Assuming the signature is processRequest(IRequest, where all request derived from)
d.processRequest(request)

问题是 - 如何添加getmodules来激活?它是一个BashDoorRequest,而不是PickLockRequest,所以只有bash门逻辑会运行。

我有两个想法 - 一个是使用访问者模式,但这意味着添加了很多类。另一种是为每个覆盖模块和操作提供标记或ID。例如,bash逻辑可以具有“bash”标记。也许我有两个bash逻辑 - 一个允许玩家猛击门,另一个可能,这减少了任何人因为尖刺而猛击门的HP。

所以我必须激活两个逻辑模块进行攻击,并且选择锁定逻辑不应该运行。我应该有一个标签的hashamp,并根据has?

对每个逻辑进行分组

这也适用于地形;说人物不能通过水。水实体仅通过逻辑添加ICannotWalk,但添加了ISwimmable逻辑。那么如何只检查ICannotWalk模块而不浪费时间来检查ISwimmable逻辑?

我面临的另一个问题是请求对象可能需要接受多个参数,但是传入哈希表来表示参数对我来说感觉太过分了。更不用说某些逻辑模块可能采用不同的参数。 (例如,门被锁定并需要一个特殊的钥匙才能打开。对此的请求也包括角色的库存而不是角色信息。除非我将整个库存,角色的统计数据和所有内容传递给请求。

欢迎任何关于如何实施该系统的想法!

2 个答案:

答案 0 :(得分:1)

您可能想要了解command pattern - 您所谓的请求本质上是一个命令。每个对象都可以维护一个CommandActions列表,当传入命令时,尝试将每个命令与可用的CommandActions列表进行匹配。

有效地发送命令通常是一项挑战 - 尤其是当对象可以响应许多不同的命令时。有几种不同的方法可以解决性能问题:

  • 使用字典将每个命令与基于两个
  • 共享的密钥的操作相匹配
  • 使用命令范围分组来缩小基于键范围的操作搜索范围
  • 为每个命令分配唯一的数字ID,并在有序集合上使用二进制搜索来查找操作
  • 如果有多个操作可以响应命令,请将它们链接在一起
  • 使用特定方法发送常用命令,而不是通用ProcessRequest()方法

答案 1 :(得分:0)

也许命令调度程序模式可以帮助您