如何将float映射到一个枚举,而不需要很长的if语句

给定一个浮点数,如何将其映射到枚举类似

{失败,不良,好,好,优秀,完美}

如果分裂是不均匀的。

0.0-0.4是失败
0.4-0.6是不好的

0.8-0.999 ..是优秀的
1.0是完美的

浮游物是根据游戏中所有玩的等级计算的等级值。 范围从0到1,包括两个端点。 通常不需要超过10个分区,但是在开发过程中间距可以调整。

我目前正在使用一堆if..else语句。 这是正确的做法吗? 这似乎有点脆弱。

使用一个结构数组 – 静态分配或dynamic – 然后一个简单的例程来search它 – 如果它的小只是迭代,如果它的大,你可以做二分search。

正如你所知道的最小值(0.0)和最大值(1.0),你只需要存储范围和枚举值的上限。 例如:

typedef enum {FAIL, POOR, OK, GOOD, EXCELLENT, PERFECT} Rating; typedef struct { float upperBound; Rating score; } RatingDivision; static RatingDivision Divisions[] = { { 0.4, FAIL }, { 0.6, POOR }, ... { 0.999, EXCELLENT }, { 1.0, PERFECT } }; 

现在, sizeof(Divisions)/sizeof(RatingDivision)会告诉你条目的数目(二进制search所需要的),或者只是迭代,直到你正在查找的值是<= Divisions[i].upperBound返回Divisions[i].scoreupperBound达到1.0没有匹配,并处理错误。

您可以使用并行数组:使用一个阈值浮点值数组和一个相同大小的枚举值数组; 那么你可以使用一个短循环,检查浮点数组中的每个值,并在超过阈值时返回枚举值。