代码之家  ›  专栏  ›  技术社区  ›  Extrakun

针对动作的请求基系统的设计模式和策略是什么[c,php]

  •  0
  • Extrakun  · 技术社区  · 16 年前

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

    我们的想法是拥有这样的东西——我们在游戏中有不同类型的实体。门可以砸,石墙不能砸。逻辑模块可以是一个称为bashable的类

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

    因此,添加到对象中的具有IBashable接口的门可能会被砸碎。processReques()将使用一些规则来确定字符是否能够做到这一点(可能是强度检查)。

    没有IBasable接口的对象不能被猛击打开。问题是——比如说一个门添加了多个逻辑组件。我想做的是提交这样的请求。

    // 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门逻辑可以运行。

    我有两种想法——一种是使用访问者模式,但这意味着添加了很多类。另一种方法是为每个reach模块和操作设置一个标签或ID。例如,bash逻辑可能有一个“bash”标记。也许我有两个重击逻辑——一个允许玩家重击门,另一个可能降低任何人重击门的生命值,因为门被钉住了。

    所以我必须激活这两个逻辑模块进行攻击,而选择锁逻辑不应该运行。我应该有一个标签的散列,并让每个逻辑按照has分组吗?

    这也适用于地形;比如说角色不能在水中移动。water实体只添加了一个icannotwalk-through逻辑,但添加了一个iswimmable逻辑。那么,如何只检查icannotwalk模块而不浪费时间检查iswimmable逻辑呢?

    我面临的另一个问题是,请求对象可能必须包含多个参数,但是传递哈希表来表示参数对我来说是一种过度杀伤力。更不用说某些逻辑模块可能采用不同的参数。(例如,门是锁着的,需要一把特殊的钥匙才能打开。这样做的请求也包括角色的库存,而不是角色信息。除非我将整个清单、角色的状态和所有内容传递给请求。

    欢迎您对如何实施本系统有任何想法!

    2 回复  |  直到 16 年前
        1
  •  1
  •   LBushkin    16 年前

    你可能想看看 command pattern -您所调用的请求本质上是一个命令。每个对象都可以维护一个commandActions列表,当传入命令时,尝试将每个命令与可用commandActions列表相匹配。

    有效地分派命令通常是一个挑战,特别是当对象可以响应许多不同的命令时。有几种不同的方法可以潜在地解决性能问题:

    • 使用字典根据两个命令共享的键将每个命令与其操作匹配
    • 使用命令范围分组根据键范围缩小对操作的搜索范围
    • 为每个命令分配一个唯一的数字ID,并对已排序的集合使用二进制搜索来查找操作
    • 如果多个操作可以响应一个命令,则将它们链接在一起。
    • 使用特定的方法发送通用命令,而不是通用的processRequest()方法
        2
  •  0
  •   drAlberT    16 年前

    也许 指挥调度员 模式可以帮助你