【问题标题】:Many boolean based code paths许多基于布尔值的代码路径
【发布时间】:2014-11-06 17:10:36
【问题描述】:

我的一门课程有问题。它有许多布尔值,并且所述类中的函数必须根据这些值处理许多不同的路径。所有这些路径都使代码非常臃肿且难以阅读。我想知道是否有一种设计模式或一些原则规则我可以​​遵循以使代码运行相同但更易于理解和阅读。

更具体地说,该类称为 Actor。这是我正在帮助的视频游戏。 Actor 类管理游戏中人形机器人的手。双手在某些动作中协同工作,而在其他动作中独立操作。所以有大量的布尔变量来检查他们每个人在做什么。这一切都在更新循环中(某处),我认为应该以某种方式移动或简化此功能。我认为大约有 20 种不同的布尔值,未来还会有更多。

另外,我知道我的帖子与游戏开发相关,但我觉得这个问题很笼统。

那么有什么方法可以解决/帮助这个问题吗?

编辑:

我会解释更多。假设您有 4 个布尔值:isAttacking、isDefending、isCasting、isDrugged。

因此,您必须检查每只手是否忙碌并处理以下路径: 玩家尝试用双手武器攻击 ->

如果不是 isDefending 并且不是 isCasting 则 isAttacking = true,如果 isDrugged 则使用值 1 进行攻击,否则为 5。

它很快就会变得复杂,当你考虑更多的布尔值时,它会变得非常复杂。 所以我的意思是:我很懒,有没有更好的方法来做到这一点?

【问题讨论】:

  • 为什么没有std::arraystd::tuple
  • 这将有助于标题中的声明,但不会解决多代码路径问题。
  • 也许你可以利用策略模式 (oodesign.com/strategy-pattern.html)。
  • 看看采用数据驱动方法 (stackoverflow.com/questions/1065584/…) 还是有限状态机(每个布尔值控制状态转换)?
  • 用浮点值替换布尔值,它会淡入淡出,然后推断所有可能的加权动作:P

标签: c++ boolean


【解决方案1】:

以 4 bool 为例,您有 16 (2**4) 种可能的行为:

所以你可以构建一个 behaviors 数组,然后调度它,类似于:

void UpdateTick()
{
    const std::uint32_t behaviorIndex =
        (isAttacking << 0)
        | (isDefending << 1)
        | (isCasting << 2)
        | (isDrugged << 3);

    const std::function<void(void)> behaviors[16] = {
        f_NoDrugNoCastNoDefNoAtt,
        f_NoDrugNoCastNoDefAtt,
        f_NoDrugNoCastDefNoAtt,
        f_NoDrugNoCastDefAtt,
        f_NoDrugCastNoDefNoAtt,
        f_NoDrugCastNoDefAtt,
        f_NoDrugCastDefNoAtt,
        f_NoDrugCastDefAtt,
        f_DrugNoCastNoDefNoAtt,
        f_DrugNoCastNoDefAtt,
        f_DrugNoCastDefNoAtt,
        f_DrugNoCastDefAtt,
        f_DrugCastNoDefNoAtt,
        f_DrugCastNoDefAtt,
        f_DrugCastDefNoAtt,
        f_DrugCastDefAtt,
    }
    behaviors[behaviorIndex]();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2021-10-11
    • 2017-05-24
    • 2015-12-21
    • 2014-05-15
    • 1970-01-01
    相关资源
    最近更新 更多