Многие логические пути кода

0

У меня проблема с одним из моих классов. В нем много bools, а функции в указанном классе должны обрабатывать множество разных путей на основе этих значений. Все эти пути делают код очень раздутым и трудно читаемым. Мне было интересно, есть ли шаблон дизайна или какое-то принципиальное правило, которым я мог бы следовать, чтобы код работал одинаково, но его легче понять и прочитать.

Чтобы быть более конкретным, класс называется Actor. Это для видеоигры, с которой я помогаю. Класс Актера управляет руками гуманоида в игре. Руки работают вместе в некоторых действиях и действуют независимо друг от друга. Таким образом, существует огромное количество булевых переменных, чтобы проверить, что делает каждый из них. Это все в цикле обновлений (где-то), и я думаю, что эта функциональность должна быть как-то перемещена или упрощена. Я думаю, что существует около 20 различных значений bool, причем больше в пути.

Кроме того, я знаю, что мой пост связан с игрой, но я чувствую, что вопрос является общим.

Так есть ли способы исправить/помочь этому?

Редактировать:

Я объясню больше. Скажем, у вас есть 4 bools: isAttacking, isDefending, isCasting, isDrugged.

Поэтому вам нужно проверять каждую руку, если она занята, и обрабатывать пути, такие как: Игрок пытается атаковать двуручным оружием ->

if not isDefending и not isCasting then isAttacking = true, если isDrugged, тогда атака со значением 1 else 5.

Это просто усложняется быстро, и когда вы делаете больше в bools, он становится очень сложным. Так что я говорю: я ленивый, есть ли лучший способ сделать это?

  • 0
    Почему нет std::array или std::tuple ?
  • 0
    Это помогло бы объявлениям в заголовке, но не проблеме множественных путей кода.
Показать ещё 5 комментариев
Теги:
boolean

1 ответ

1

В вашем примере с 4 bool вас есть 16 (2 ** 4) возможных поведения:

поэтому вы можете создать массив поведения, а затем отправить его, что-то вроде:

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]();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню