我正在为游戏编写一些决策 AI,并且我想出了以下代码。
if(pushedLeft && leftFree && leftExists)
GoLeft();
else if(pushedRight && rightFree && rightExists)
GoRight();
else if(leftFree && leftExists)
GoLeft();
else if(rightFree && rightExists)
GoRight();
else if(pushedLeft && leftExists)
GoLeft();
else if(pushedRight && rightExists)
GoRight();
else if(leftExists)
GoLeft();
else if(rightExists)
GoRight();
// else do nothing...
这是一个相当长的if
语句流,具有类似的条件!
请注意,它使这个很好的模式:
L1 L2 L3 -> L
R1 R2 R3 -> R
L2 L3 -> L
R2 R3 -> R
L1 L3 -> L
R1 R3 -> R
L3 -> L
R3 -> R
(nothing) -> 0
这段代码的目的是根据一些传入的状态信息来决定对象应该向左还是向右(或根本不)移动。每条信息都有不同的优先级。我可以将它写在这样的有序列表中:
Highest Priority
----------------
Don't ever move into an invalid space
Prefer to move into an unoccupied space
Prefer to move in the push direction
Prefer to move left
----------------
Lowest Priority
很明显,添加额外的信息输入来做出这个决定将使条件的数量增加一倍。并且将这些输入的潜在值的数量加倍(例如:允许上/下/左/右)也将使条件句的数量加倍。(所以这是 n×m 2 个条件,对吧?)
所以我的问题是:
有没有一种很好的、令人满意的、优雅的编码方式?
我认为必须有一个很好的“n×m”方式来做到这一点(编辑:我最初在这里有“n+m”,但这似乎是不可能的,因为有 n×m 输入条件)。适用于我的代码和一般问题的东西?
最好是与上面的条件版本一样好或更好的东西。理想情况下避免堆分配的东西 - 对于在游戏开发场景中使用很重要(尽管如果需要,这些总是可以通过缓存等进行优化)。
还有:这个问题是否有任何“Googleable 条款”?我怀疑这不是一个罕见的问题 - 但我不知道它的名称。
更新:感谢Superpig 的回答,一个想法是计算各种选项的分数。像这样的东西:
int nothingScore = 1 << 4;
int leftScore = (1 << 1) + (pushedLeft ? 1 << 2 : 0) + (leftFree ? 1 << 3 : 0) + (leftExists ? 1 << 5 : 0);
int rightScore = (pushedRight ? 1 << 2 : 0) + (rightFree ? 1 << 3 : 0) + (rightExists ? 1 << 5 : 0);
肯定有更好的方法来编写评分代码(以及其他评分方法)。然后仍然是计算分数后选择做什么的问题。而且,当然,可能有更好的方法完全不涉及评分。
更新 2:我在这里发布并接受了我自己的答案(因为Superpig的不是一个完整的解决方案,到目前为止,甚至没有其他答案在正确的轨道上)。我没有对各种输出进行评分,而是选择了一种使用位域的选项消除方法。这允许仅使用单个整数作为内存来做出决定。